def cast_heal(player, amount=config.HEALING_POTION_AMOUNT): if player.fighter.hp == player.fighter.max_hp: log.add_message('Already at full health') return 'cancelled' log.add_message('You feel much better!') actions.heal(player.fighter, amount)
def pick_up_item(player, item): if len(player.inventory) >= player.inventory_size: log.add_message("Inventory is full!", libtcodpy.light_red) else: player.inventory.append(item) player.current_map.map_entities.remove(item) log.add_message("Picked up " + item.name, libtcodpy.light_green)
def use(player, entity): if entity.item.use_function is None: log.add_message(entity.name + ' cannot be used.') elif entity.item.use_function(player) != 'cancelled': if entity.item.count > 1: entity.item.count -= 1 else: player.inventory.remove(entity)
def attack(self, target): damage = self.power - target.fighter.defence if damage > 0: target.fighter.take_damage(damage) else: log.add_message(self.owner.name.capitalize() + ' attacks ' + target.name + ' but it has no effect!')
def cast_lightning(player): monster = _closest_monster(player, config.LIGHTNING_RANGE) if monster is None: log.add_message('No enemy in range', config.COLOR_ERROR_MESSAGE) return 'cancelled' log.add_message('Lightning strikes ' + monster.name + ' for ' + str(config.LIGHTNING_DAMAGE) + ' damage', config.COLOR_MAGIC_MESSAGE) actions.inflict_damage(player, monster.fighter, config.LIGHTNING_DAMAGE)
def attack(fighter, target): damage = fighter.power - target.fighter.defence if damage >= 0: log.add_message(fighter.owner.name.capitalize() + ' attacks ' + target.name + ' for ' + str(damage) + ' hit points.') inflict_damage(fighter.owner, target.fighter, damage) else: log.add_message(fighter.owner.name.capitalize() + ' attacks ' + target.name + ' but it has no effect!')
def inflict_damage(actor, fighter, damage): if damage > 0: fighter.hp -= damage if fighter.hp <= 0: log.add_message(actor.name.capitalize() + ' kills ' + fighter.owner.name.capitalize() + '!') dfunction = fighter.death_function if dfunction is not None: dfunction(fighter.owner)
def cast_fireball(player): log.add_message('Left-click to target or right-click to cancel', config.COLOR_INFO_MESSAGE) (x, y) = _target_tile(player) if x is None: log.add_message('Spell cancelled', config.COLOR_ERROR_MESSAGE) return 'cancelled' log.add_message('Your fireball explodes') for entity in player.current_map.map_entities: if entity.distance(x, y) <= config.FIREBALL_RADIUS and entity.fighter: log.add_message(entity.name + ' takes ' + str(config.FIREBALL_DAMAGE) + ' damage', config.COLOR_DAMAGE_MESSAGE) entity.fighter.take_damage(config.FIREBALL_DAMAGE)
def new_game(): fighter_component = components.Fighter(hp=30, defence=2, power=5, death_function=player_death) player = components.Entity(0, 0, 'player', config.TILE_PLAYER, libtcodpy.white, is_walkable=False, fighter=fighter_component) player.inventory = [] player.inventory_size = 26 player.game_state = 'playing' log.init() log.add_message("You awaken in a vault.") player.current_map = mapmaker.make_map(player) renderer.clear_console() return player
def player_death(player): log.add_message('You died!') player.game_state = 'dead' player.symbol = '%' player.symbol_color = libtcodpy.dark_red