git.fiddlerwoaroof.com
Raw Blame History
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