import libtcodpy as libtcod from objects import Object, Fighter def get_pos_pair(x,y): if y is None: if hasattr(x, '__iter__'): x,y = x elif hasattr(x,'x'): x,y = x.x,x.y else: x,y = x.pos return x,y class Player(Object): def triggers_recompute(func): def _inner(self, *a, **kw): self.fov_recompute = True return func(self, *a, **kw) return _inner @triggers_recompute def __init__(self, map, con, x,y, char, color, fighter=None, level=None): Object.__init__(self, None, con, x,y, char, libtcod.namegen_generate('Celtic male'), color, True, fighter=fighter, level=level ) map.player = self self.inventory = [] def draw(self, player=None): if player is None: player = self return Object.draw(self, player) def pick_up(self, obj): if len(self.inventory) >= 26: game.message('Your inventory is full, cannot pick up %s' % obj.name, libtcod.red) else: self.inventory.append( self.level.claim_object(obj) ) game.message('you picked up a %s!' % obj.name, libtcod.green) obj.item.user = self return self def drop(self, obj): self.level.objects.insert(0, obj) obj.x, obj.y = self.x, self.y game.message('you dropped a %s' % obj.name, libtcod.yellow) def use(self, item): item.owner.enter_level(self.level) success = item.use() try: index = self.inventory.index(item.owner) except ValueError: index = -1 if success and index != -1: self.inventory.pop(index) def get_item(self, index): return self.inventory[index].item def get_item_names(self): return [item.name for item in self.inventory] def tick(self): if self.fighter: self.fighter.tick() def can_see(self, x,y=None): x,y = get_pos_pair(x,y) return self.level.is_visible(x,y) torch_radius = 19 @property def pos(self): return self.x, self.y @pos.setter def pos(self, val): #print 'pos:', val self.x, self.y = val @triggers_recompute def move(self, dx, dy): return Object.move(self, dx,dy) def move_or_attack(self, dx, dy): x = self.x + dx y = self.y + dy import monsters target = monsters.monster_at(x,y) if target is not None: self.fighter.attack(target) else: self.move(dx, dy) def enter_level(self, level): print '\nenter level\n' self.level = level level.enter(self) self.x, self.y = self.level.map.map_entrance return self import game