"""Magic trap: random magical effects.
Copyright 2000 Cabochon Technologies, Inc.
Author: Steve Yegge
"""
from wyvern.lib.properties import WalkNotify
from wyvern.lib.classes.traps import AbstractTrap
from wyvern.lib import Range, Kernel
from wyvern.common.config import Wyvern
class magic_trap(AbstractTrap):
def initialize(self):
self.super__initialize()
self.setDefaultCategory("traps")
self.setDefaultBitmap("magic_trap")
self.setProperty('short', 'magic trap')
self.setAnimated(1)
self.addProperty("nopickup")
self.setWeight("10 lb")
self.root = Wyvern.getRootDir()
def steppedOn(self, monster):
if not self.isRevealed():
monster.message("You step into a magic trap!")
# call superclass
WalkNotify.steppedOn(self, monster)
roll = Range.percent()
if roll < 30:
self.doMessage(monster)
elif roll < 60:
self.castSpell(monster, 'lib/spells/identify.py')
elif roll < 70:
monster.message('You feel like someone is helping you.')
self.castSpell(monster, 'lib/spells/remove_curse.py')
else:
self.summonMonsters(monster)
if Range.randomValue ( 10 ) == 1:
self.remove()
def doMessage(self, monster):
roll = Range.percent()
if roll < 20:
monster.message('You shudder for a moment.')
elif roll < 40:
monster.message('You suddenly yearn for your distant homeland.')
elif roll < 60:
monster.message('A tingle runs up and down your spine.')
elif roll < 80:
monster.message('You smell charred flesh.')
else:
monster.message('You hear a distant howling.')
# casts an arbitrary spell
def castSpell(self, agent, name):
spell = self.cloneSpell(name)
spell.setMagicItem(self)
spell.setTarget(agent)
spell.start()
def cloneSpell(self, spell):
return Kernel.instantiatePyClass(self.root + spell)
# summons a bunch of monsters and blinds the agent
def summonMonsters(self, agent):
if agent.hasProperty('blind'):
agent.message('You feel hemmed in.')
else:
agent.message('You are blinded by a flash of light!')
self.castSpell(agent, 'lib/spells/blindness.py')
# figure out number and type of monsters to generate
num = Range.randomValue(2, 5)
lvl = agent.getLevel()
if lvl < 1: lvl = 1
if lvl > 18: lvl = 18
arch = 'random/monster/random_monster' + str(lvl)
# generate them
map = self.getMap()
loc = self.getReferenceLoc()
for i in range(1, num):
mon = Kernel.instantiate(arch)
spot = map.findFreeSpot(loc, mon)
if spot:
# don't need to start it; happens automatically
mon.setMap(map, spot.x, spot.y)
def toString(self, *args):
if len(args) > 0:
return self.super__toString(args[0])
else:
return 'magic trap'
|