def __init__(self,
                 name,
                 sprite,
                 hp,
                 defense,
                 res,
                 strength,
                 classes,
                 equipments,
                 race,
                 gold,
                 lvl,
                 skills,
                 alterations,
                 compl_sprite=None):
        Character.__init__(self, name, (), sprite, hp, defense, res, strength,
                           classes, equipments, 'MANUAL', lvl, skills,
                           alterations, race, gold, compl_sprite)
        self.state = PlayerState.WAITING_SELECTION
        self.old_pos = ()
        self._selected = False

        # Sprite displayed when player cannot be selected
        self.sprite_unavaible = self.sprite.copy()
        color_image = pg.Surface(self.sprite.get_size()).convert_alpha()
        color_image.fill(LIGHT_GREY)
        self.sprite_unavaible.blit(color_image, (0, 0),
                                   special_flags=pg.BLEND_RGBA_MULT)

        # Memorize normal state sprite
        self.normal_sprite = self.sprite

        # Memorize the current action performed by the player, it must be a value of CharacterMenu
        self.current_action = None
 def move(self):
     if self.state is PlayerState.ON_MOVE:
         Character.move(self)
         if not self.on_move:
             self.state = PlayerState.WAITING_POST_ACTION
             return True
     return False
def minimal_setup_for_game():
    pg.init()
    font.init_fonts()
    # Window parameters
    pg.display.set_mode((MAIN_WIN_WIDTH, MAIN_WIN_HEIGHT))
    # Load some data
    races = Loader.load_races()
    classes = Loader.load_classes()
    Character.init_data(races, classes)
 def setUpClass(cls):
     super(TestStartScreen, cls).setUpClass()
     pg.init()
     font.init_fonts()
     cls.save_url = "saves/main_save.xml"
     cls.level_class = Level
     cls.buttons = []
     cls.buttons.append(Rect(NEW_GAME_BUTTON_POS[0], NEW_GAME_BUTTON_POS[1], BUTTON_SIZE[0], BUTTON_SIZE[1]))
     cls.buttons.append(Rect(LOAD_GAME_BUTTON_POS[0], LOAD_GAME_BUTTON_POS[1], BUTTON_SIZE[0], BUTTON_SIZE[1]))
     cls.buttons.append(Rect(OPTIONS_BUTTON_POS[0], NEW_GAME_BUTTON_POS[1], BUTTON_SIZE[0], BUTTON_SIZE[1]))
     cls.buttons.append(Rect(EXIT_GAME_BUTTON_POS[0], NEW_GAME_BUTTON_POS[1], BUTTON_SIZE[0], BUTTON_SIZE[1]))
     races = Loader.load_races()
     classes = Loader.load_classes()
     Character.init_data(races, classes)
 def test_init_character(self):
     name = 'character_test'
     pos = (3, 2)
     sprite = 'imgs/characs/jist.png'
     hp = 10
     defense = 4
     res = 3
     strength = 2
     classes = ['innkeeper']
     equipments = []
     strategy = 'STATIC'
     lvl = 3
     skills = []
     alterations = []
     race = 'human'
     gold = 500
     interaction = {
         'dialog': [
             "Hurry up ! Leave the village from the west, and enter the necropolis.",
             "The clock is ticking... The ogre's bones must be returned to their original place."
         ],
         'join_team':
         False
     }
     character_test = Character(name, pos, sprite, hp, defense, res,
                                strength, classes, equipments, strategy,
                                lvl, skills, alterations, race, gold,
                                interaction)
     self.assertEqual(equipments, character_test.equipments)
     self.assertEqual(classes, character_test.classes)
     self.assertEqual(race, character_test.race)
     self.assertEqual(gold, character_test.gold)
     self.assertFalse(character_test.join_team)
     self.assertEqual(int, type(character_test.constitution))
    def save(self, tree_name):
        # Build XML tree
        tree = Character.save(self, tree_name)

        # Save if turn is finished or not
        state = etree.SubElement(tree, 'turnFinished')
        state.text = str(self.turn_is_finished())

        return tree
def random_character_entity(min_hp=10,
                            max_defense=10,
                            max_res=10,
                            name=None,
                            lvl=None,
                            equipments=None,
                            classes=None,
                            race=None,
                            interaction=None):
    attrs = random_character_attributes(min_hp, max_defense, max_res, name,
                                        lvl, equipments, classes, race,
                                        interaction)
    return Character(attrs['name'], attrs['pos'], attrs['sprite'], attrs['hp'],
                     attrs['defense'], attrs['res'], attrs['strength'],
                     attrs['classes'], attrs['equipments'], attrs['strategy'],
                     attrs['lvl'], attrs['skills'], [], attrs['race'],
                     attrs['gold'], attrs['interaction'])
示例#8
0
def load_ally(ally, from_save, gap_x, gap_y):
    name = ally.find('name').text.strip()
    infos = etree.parse('data/characters.xml').find(name)

    entity_attributes = load_artificial_entity(ally, infos, from_save, gap_x,
                                               gap_y)

    # Static data character
    race = infos.find('race').text.strip()
    classes = [infos.find('class').text.strip()]
    interaction_el = infos.find('interaction')
    dialog = []
    for talk in interaction_el.findall('talk'):
        dialog.append(talk.text.strip())
    interaction = {
        'dialog': dialog,
        'join_team': interaction_el.find('join_team') is not None
    }

    # Dynamic data character
    dynamic_data = infos
    if from_save:
        dynamic_data = ally
    gold = int(dynamic_data.find('gold').text.strip())

    equipments = []
    for eq in dynamic_data.findall('equipment/*'):
        if from_save:
            eq_loaded = load_item(eq)
        else:
            eq_loaded = parse_item_file(eq.text.strip)
        equipments.append(eq_loaded)

    if from_save:
        skills = [(load_skill(skill.text.strip())
                   if not skill.text.strip() in skills_infos else
                   skills_infos[skill.text.strip()])
                  for skill in dynamic_data.findall('skills/skill/name')]
    else:
        skills = Character.classes_data[
            classes[0]]['skills'] + Character.races_data[race]['skills']

    loaded_ally = Character(
        entity_attributes['name'], entity_attributes['position'],
        entity_attributes['sprite'], entity_attributes['hp'],
        entity_attributes['defense'], entity_attributes['resistance'],
        entity_attributes['strength'], classes, equipments,
        entity_attributes['strategy'], entity_attributes['level'], skills,
        entity_attributes['alterations'], race, gold, interaction)

    inventory = infos.find('inventory')
    if inventory is not None:
        for it in inventory.findall('item'):
            if from_save:
                item_loaded = load_item(it)
            else:
                item_loaded = parse_item_file(it.text.strip())
            loaded_ally.set_item(item_loaded)

    if from_save:
        current_hp = int(ally.find('current_hp').text.strip())
        loaded_ally.hp = current_hp

        xp = int(ally.find('exp').text.strip())
        loaded_ally.earn_xp(xp)
    else:
        # Up stats according to current lvl
        loaded_ally.stats_up(entity_attributes['level'] - 1)
        # Restore hp due to lvl up
        loaded_ally.healed()

    return loaded_ally
    # Window parameters
    pg.display.set_caption("In the name of the Five Cats")
    screen = pg.display.set_mode((MAIN_WIN_WIDTH, MAIN_WIN_HEIGHT))

    # Load constant sprites
    Destroyable.init_constant_sprites()
    Breakable.init_constant_sprites()
    Movable.init_constant_sprites()
    Sidebar.init_constant_sprites()
    Level.init_constant_sprites()

    # Load some data
    races = Loader.load_races()
    classes = Loader.load_classes()
    Character.init_data(races, classes)

    clock = pg.time.Clock()

    start_screen = StartScreen(screen)

    quit_game = False
    while not quit_game:
        for e in pg.event.get():
            if e.type == pg.QUIT:
                quit_game = True
            elif e.type == pg.MOUSEMOTION:
                start_screen.motion(e.pos)
            elif e.type == pg.MOUSEBUTTONUP:
                if e.button == 1 or e.button == 3:
                    quit_game = start_screen.click(e.button, e.pos)
 def set_move(self, pos):
     Character.set_move(self, pos)
     self.state = PlayerState.ON_MOVE
     self.old_pos = self.pos
 def display(self, screen):
     Character.display(self, screen)
     if self.state in range(PlayerState.WAITING_MOVE,
                            PlayerState.WAITING_TARGET + 1):
         screen.blit(Player.SELECTED_DISPLAY, self.pos)
 def new_turn(self):
     Character.new_turn(self)
     self.state = PlayerState.WAITING_SELECTION
     self.sprite = self.normal_sprite
     for eq in self.equipments:
         eq.unset_grey()
 def attack(self, ent):
     damages = Character.attack(self, ent)
     self.state = PlayerState.FINISHED
     return damages
 def unequip(self, eq):
     unequipped = Character.unequip(self, eq)
     if unequipped:
         self.state = PlayerState.WAITING_POST_ACTION_UNCANCELLABLE
     return unequipped
 def equip(self, eq):
     equipped = Character.equip(self, eq)
     if equipped > -1:
         self.state = PlayerState.WAITING_POST_ACTION_UNCANCELLABLE
     return equipped
 def use_item(self, item):
     used, result_msgs = Character.use_item(self, item)
     if used:
         self.state = PlayerState.WAITING_POST_ACTION_UNCANCELLABLE
     return used, result_msgs