git.fiddlerwoaroof.com
player.py
7dddb1ed
 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