git.fiddlerwoaroof.com
items.py
539d5ff4
 from __future__ import division
 
76408e86
 import libtcodpy as libtcod
 import game
 import objects
 import utilities
 import monsters
 import random
42741360
 from main import game_instance, Game
76408e86
 
 
 class Item(object):
 	def __new__(*args):
 		res = object.__new__(*args)
 		return res
 
 @Game.register_item_type(5)
 class HealingPotion(Item):
 	name = 'Healing potion'
 	char = '\x03'
 	color = libtcod.violet
 	def use(self):
 		fighter = self.user.fighter
 
 		result = True
 		if fighter.hp == fighter.max_hp:
 			game.message('You\'re full, can\'t heal', libtcod.red)
 			result = False
 		else:
 			game.message('Healing...')
 			fighter.heal(10)
 
 		return result
 
 @Game.register_item_type(2)
 class SuperHealingPotion(Item):
 	name = 'Super healing potion'
 	char = '\x03'
 	color = libtcod.yellow
 	def use(self):
 		fighter = self.user.fighter
 		if random.random() < .75:
 			fighter.max_hp += 10
 			fighter.heal(10)
 		return True
 
 @Game.register_item_type(1)
 class Confusion(Item):
 	name = 'Confusion'
 	char = 'c'
 	color=libtcod.dark_chartreuse
 	def use(self):
 		monster = monsters.get_closest_monster(self.user)
 
 		result = False
 		if monster is not None:
 			game.message('%s becomes confused' % monster.name)
 			monsters.ConfusedMonster(random.randrange(10,18)).attach(
 				monster
 			)
 			result = True
 
 		return result
 
 @Game.register_item_type(4)
 class Strengthen(Item):
 	name = 'Strengthen'
 	char = 's'
 	color = libtcod.chartreuse
 	def use(self):
 		if self.user.fighter:
 			game.message('%s feels a surge of strength' % self.user.name)
 			self.user.fighter.stat_adjust(20, self.adj)
 		return True
 
 	def adj(self, owner):
 		return (
 			lambda _: game.message('The surge of strength has subsided'),
 			owner.fighter.defense,
 			owner.fighter.power+3
 		)
 
 @Game.register_item_type(4)
 class Protect(Item):
 	name = 'Protect'
 	char = 'p'
 	color = libtcod.chartreuse
 	def use(self):
 		if self.user.fighter:
 			game.message('%s is surrounded by a protecting aura' % self.user.name)
 			self.user.fighter.stat_adjust(10, self.adj)
 		return True
 
 	def adj(self, owner):
 		return (
 			lambda _: game.message('The protecting aura dissipates'),
 			owner.fighter.defense+6,
 			owner.fighter.power
 		)
 
 @Game.register_item_type(2)
 class LightningBolt(Item):
 	name = 'Lightning Bolt'
 	char = 'z'
 	color = libtcod.darkest_red
 	def use(self):
 		monster = monsters.get_closest_monster(self.user)
 		result = False
 		if monster and self.user.can_see(monster.x, monster.y):
 			game.message('Monster %s has been struck by lightning' % monster.name)
 			monster.fighter.take_damage(13)
 			result = True
 		else:
 			game.message('No target')
 		return result
 
539d5ff4
 @Game.register_item_type(5)
 class Jump(Item):
 	name = 'Jump'
 	char = 'j'
 	color= libtcod.dark_green
 	jump_distance = 3
 	def use(self):
 		game_instance.select(self.jump)
 		return True
 	def jump(self, x,y):
 		dist = self.user.distance(x,y)
 
 		if dist <= self.jump_distance:
 			self.user.x, self.user.y = x,y
 			game.message('you are transported to a new place')
 		elif random.random() < self.jump_distance/dist:
 			self.user.x, self.user.y = x,y
 			game.message('you strain all your power to move %d squares' % int(dist))
 		else:
 			game.message('you didn\'t make it')
 			self.user.fighter.take_damage( int(round(2 * dist/self.jump_distance)) )
 
 @Game.register_item_type(3)
 class Acquire(Item):
 	name = 'Acquire'
 	char = 'a'
 	color= libtcod.dark_green
 	effect_distance = 5
 	def use(self):
 		game.message('what do you want?')
 		game_instance.select(self.get)
 		return True
 	def get(self, x,y):
 		if self.user.distance(x,y) < self.effect_distance:
 			self.user.pick_up(self.user.object_at(x,y))
 
76408e86
 
 @Game.register_item_type(1)
 class Smite(Item):
 	name = 'Smite'
 	char = '\x0f'
 	color = libtcod.red
 	def use(self):
 		game_instance.select(self.smite)
 		return True
 
 	def smite(self, x,y):
 		monster = monsters.monster_at(x,y)
 		if monster:
 			monster.fighter.take_damage(10)
 			if monster.fighter:
 				game.message('%s is smitten, he only retains %s hp' % (monster.name, monster.fighter.hp))
539d5ff4
 			else:
 				game.message('%s thought it better to go elsewhere' % monster.name)
76408e86
 
 
539d5ff4
 @Game.register_item_type(2)
76408e86
 class Fireball(Item):
 	name = 'Fireball'
 	char = '*'
 	color = libtcod.darker_red
 	effect_radius = 3
 
 	def use(self):
 		game_instance.select(self.smite)
 		return True
 
 	def smite(self, x,y):
539d5ff4
 		if random.random() < .1:
 			self.effect_radius *= 2
 
76408e86
 		strikes = []
 		for obj in self.owner.level.objects:
 			if obj.fighter and obj is not self.user:
 				if (obj.x, obj.y) == (x,y):
 					game.message('%s takes a direct hit from the fireball' % obj.name)
 					obj.fighter.take_damage(20)
 				elif obj.distance(x,y) < self.effect_radius:
 					obj.fighter.take_damage(6)
 					if obj.fighter:
 						strikes.append('%s %s' % (obj.name, obj.fighter.hp))
 					else:
 						strikes.append('%s dead' % obj.name)
 		game.message('The names of those who were to close for comfort: %s' % ', '.join(strikes))