def test_toofew_points(self):
     """confirm validation of under-allocated traits"""
     # fails before any allocations happen
     is_valid, errmsg = archetypes.validate_primary_traits(self.char1.traits)
     self.assertFalse(is_valid)
     self.assertEqual(errmsg, 'Not enough trait points allocated.')
     # no less than 30 allowed
     self.char1.traits.INT.base += 6
     is_valid, errmsg = archetypes.validate_primary_traits(self.char1.traits)
     self.assertFalse(is_valid)
     self.assertEqual(errmsg, 'Not enough trait points allocated.')
 def test_toofew_points(self):
     """confirm validation of under-allocated traits"""
     # fails before any allocations happen
     is_valid, errmsg = archetypes.validate_primary_traits(self.char1.traits)
     self.assertFalse(is_valid)
     self.assertEqual(errmsg, 'Not enough trait points allocated.')
     # no less than 30 allowed
     self.char1.traits.INT.base += 6
     is_valid, errmsg = archetypes.validate_primary_traits(self.char1.traits)
     self.assertFalse(is_valid)
     self.assertEqual(errmsg, 'Not enough trait points allocated.')
 def test_toomany_points(self):
     """confirm validation of over-allocated traits"""
     # perfect char not allowed
     for t in archetypes.PRIMARY_TRAITS:
         self.char1.traits[t].base = 10
     is_valid, errmsg = archetypes.validate_primary_traits(self.char1.traits)
     self.assertFalse(is_valid)
     self.assertEqual(errmsg, 'Too many trait points allocated.')
     # no more than 30 allowed
     archetypes.apply_archetype(self.char1, 'warrior', reset=True)
     self.char1.traits.INT.base += 9
     is_valid, errmsg = archetypes.validate_primary_traits(self.char1.traits)
     self.assertFalse(is_valid)
     self.assertEqual(errmsg, 'Too many trait points allocated.')
 def test_toomany_points(self):
     """confirm validation of over-allocated traits"""
     # perfect char not allowed
     for t in archetypes.PRIMARY_TRAITS:
         self.char1.traits[t].base = 10
     is_valid, errmsg = archetypes.validate_primary_traits(self.char1.traits)
     self.assertFalse(is_valid)
     self.assertEqual(errmsg, 'Too many trait points allocated.')
     # no more than 30 allowed
     archetypes.apply_archetype(self.char1, 'warrior', reset=True)
     self.char1.traits.INT.base += 9
     is_valid, errmsg = archetypes.validate_primary_traits(self.char1.traits)
     self.assertFalse(is_valid)
     self.assertEqual(errmsg, 'Too many trait points allocated.')
 def test_valid_allocations(self):
     """confirm valid trait allocations"""
     # warriors have 8 points to allocate
     self.char1.traits.STR.base += 2
     self.char1.traits.PER.base += 1
     self.char1.traits.INT.base += 1
     self.char1.traits.DEX.base += 1
     self.char1.traits.CHA.base += 1
     self.char1.traits.VIT.base += 2
     is_valid, errmsg = archetypes.validate_primary_traits(self.char1.traits)
     self.assertEqual(sum(self.char1.traits[t].actual
                          for t in archetypes.PRIMARY_TRAITS), 30)
     self.assertTrue(is_valid)
     # smartest warrior ever
     archetypes.apply_archetype(self.char1, 'warrior', reset=True)
     self.char1.traits.INT.base += 8
     is_valid, errmsg = archetypes.validate_primary_traits(self.char1.traits)
     self.assertTrue(is_valid)
 def test_valid_allocations(self):
     archetypes.apply_archetype(self.char1, 'soldier', reset=True)
     self.assertTrue(archetypes.validate_primary_traits(self.char1.traits))
Example #7
0
    def func(self):
        "create the new character"
        player = self.player
        session = self.session
        if not self.args:
            self.msg("Usage: @charcreate <charname>")
            return
        key = self.args.strip()

        charmax = _MAX_NR_CHARACTERS if _MULTISESSION_MODE > 1 else 1

        if not player.is_superuser and \
            (player.db._playable_characters and
                len(player.db._playable_characters) >= charmax):
            self.msg(
                "You may only create a maximum of {} characters.".format(
                    charmax))
            return

        # create the character
        from evennia.objects.models import ObjectDB

        start_location = ObjectDB.objects.get_id(settings.START_LOCATION)
        default_home = ObjectDB.objects.get_id(settings.DEFAULT_HOME)
        typeclass = settings.BASE_CHARACTER_TYPECLASS
        permissions = settings.PERMISSION_PLAYER_DEFAULT

        # check whether a character already exists
        new_character = None
        candidates = search.objects(key, typeclass='typeclasses.characters.Character')
        if candidates:
            for c in candidates:
                if c.access(player, 'puppet'):
                    new_character = c
                    break

        startnode = "menunode_welcome_archetypes"
        if not new_character:

            new_character = create.create_object(typeclass, key=key,
                                                 location=None,
                                                 home=default_home,
                                                 permissions=permissions)
            # only allow creator (and immortals) to puppet this char
            new_character.locks.add(
                ("puppet:id({}) or pid({}) "
                 "or perm(Immortals) or pperm(Immortals)").format(
                    new_character.id, player.id
            ))
            player.db._playable_characters.append(new_character)

        else:
            if new_character.db.chargen_complete:
                self.msg(("{name} has already completed character "
                          "generation. Use @ic {name} to puppet.").format(
                            name=new_character.key
                                 if ' ' not in new_character.key
                                 else '"{}"'.format(new_character.key)))
                return
            if new_character.db.archetype:
                startnode = "menunode_allocate_traits"
                if (new_character.db.focus or (not new_character.db.focus
                         and validate_primary_traits(new_character.traits)[0])):
                    startnode = "menunode_races"
                    if new_character.db.race:
                        startnode = "menunode_allocate_mana"
                        if (new_character.traits.BM.base + new_character.traits.WM.base
                                == new_character.traits.MAG.actual
                                and len(new_character.skills.all) > 0):
                            startnode = "menunode_allocate_skills"
                            if ('escape' in new_character.skills.all
                                and not hasattr(new_character.skills.escape, 'minus')):
                                startnode = "menunode_equipment_cats"

        session.new_char = new_character

        def finish_char_callback(session, menu):
            char = session.new_char
            if char.db.chargen_complete:
                char.location = start_location
                player.puppet_object(session, char)

        EvMenu(session,
               "world.chargen",
               startnode=startnode,
               allow_quit=False,
               cmd_on_quit=finish_char_callback)
Example #8
0
    def func(self):
        "create the new character"
        player = self.player
        session = self.session
        if not self.args:
            self.msg("Usage: @charcreate <charname>")
            return
        key = self.args.strip()

        charmax = _MAX_NR_CHARACTERS if _MULTISESSION_MODE > 1 else 1

        if not player.is_superuser and \
            (player.db._playable_characters and
                len(player.db._playable_characters) >= charmax):
            self.msg("You may only create a maximum of {} characters.".format(
                charmax))
            return

        # create the character
        from evennia.objects.models import ObjectDB

        start_location = ObjectDB.objects.get_id(settings.START_LOCATION)
        default_home = ObjectDB.objects.get_id(settings.DEFAULT_HOME)
        typeclass = settings.BASE_CHARACTER_TYPECLASS
        permissions = settings.PERMISSION_PLAYER_DEFAULT

        # check whether a character already exists
        new_character = None
        candidates = search.objects(
            key, typeclass='typeclasses.characters.Character')
        if candidates:
            for c in candidates:
                if c.access(player, 'puppet'):
                    new_character = c
                    break

        startnode = "menunode_welcome_archetypes"
        if not new_character:

            new_character = create.create_object(typeclass,
                                                 key=key,
                                                 location=None,
                                                 home=default_home,
                                                 permissions=permissions)
            # only allow creator (and immortals) to puppet this char
            new_character.locks.add(
                ("puppet:id({}) or pid({}) "
                 "or perm(Immortals) or pperm(Immortals)").format(
                     new_character.id, player.id))
            player.db._playable_characters.append(new_character)

        else:
            if new_character.db.chargen_complete:
                self.msg(
                    ("{name} has already completed character "
                     "generation. Use @ic {name} to puppet.").format(
                         name=new_character.key if ' ' not in new_character.
                         key else '"{}"'.format(new_character.key)))
                return
            if new_character.db.archetype:
                startnode = "menunode_allocate_traits"
                if (new_character.db.focus or
                    (not new_character.db.focus
                     and validate_primary_traits(new_character.traits)[0])):
                    startnode = "menunode_races"
                    if new_character.db.race:
                        startnode = "menunode_allocate_mana"
                        if (new_character.traits.BM.base +
                                new_character.traits.WM.base
                                == new_character.traits.MAG.actual
                                and len(new_character.skills.all) > 0):
                            startnode = "menunode_allocate_skills"
                            if ('escape' in new_character.skills.all
                                    and not hasattr(
                                        new_character.skills.escape, 'minus')):
                                startnode = "menunode_equipment_cats"

        session.new_char = new_character

        def finish_char_callback(session, menu):
            char = session.new_char
            if char.db.chargen_complete:
                char.location = start_location
                player.puppet_object(session, char)

        EvMenu(session,
               "world.chargen",
               startnode=startnode,
               cmd_on_exit=finish_char_callback)