class Bodak( base.Monster ): name = "Bodak" statline = { stats.STRENGTH: 13, stats.TOUGHNESS: 12, stats.REFLEXES: 15, \ stats.INTELLIGENCE: 6, stats.PIETY: 12, stats.CHARISMA: 12, stats.RESIST_ACID: 75, stats.RESIST_LIGHTNING: 155 } SPRITENAME = "monster_undead.png" FRAME = 0 TEMPLATES = (stats.UNDEAD,stats.DEMON) MOVE_POINTS = 8 VOICE = None HABITAT = ( context.HAB_EVERY, context.SET_EVERY, context.MTY_UNDEAD, context.MTY_BOSS, context.DES_LUNAR, context.GEN_UNDEAD ) ENC_LEVEL = 10 TREASURE = None ATTACK = items.Attack( (1,8,0), element = stats.RESIST_CRUSHING) TECHNIQUES = ( invocations.MPInvocation( "Death Gaze", effects.OpposedRoll( att_stat=stats.CHARISMA, att_modifier=-10, on_success = ( effects.InstaKill( anim=animobs.CriticalHit ) ,), on_failure = ( effects.NoEffect( anim=animobs.SmallBoom ) ,) ), com_tar=targetarea.SingleTarget(reach=6), shot_anim=animobs.PurpleVortex, ai_tar=invocations.TargetEnemy(), mp_cost=10 ),) def init_monster( self ): self.levels.append( base.Terror( 9, self ) )
def critical_hit_effect( self, roll_mod=0 ): return effects.TargetIs( effects.ANIMAL, on_true=( effects.PercentRoll( roll_skill=stats.CRITICAL_HIT, roll_stat=None, roll_modifier=min(roll_mod*2,0), target_affects=True, on_success=( effects.InstaKill( anim=animobs.CriticalHit ) ,) ) ,) )
class SkeletonHunter( base.Monster ): name = "Skeleton Hunter" statline = { stats.STRENGTH: 14, stats.TOUGHNESS: 12, stats.REFLEXES: 16, \ stats.INTELLIGENCE: 12, stats.PIETY: 12, stats.CHARISMA: 10, stats.NATURAL_DEFENSE: 10, stats.PHYSICAL_ATTACK: 5 } SPRITENAME = "monster_skeletons.png" FRAME = 9 TEMPLATES = (stats.UNDEAD,stats.BONE) MOVE_POINTS = 8 VOICE = None HABITAT = ( context.HAB_EVERY, context.SET_EVERY, context.SET_RENFAN, context.MTY_UNDEAD, context.MTY_HUMANOID, context.MTY_FIGHTER, context.MTY_BOSS, context.DES_EARTH, context.GEN_UNDEAD ) ENC_LEVEL = 6 TREASURE = treasuretype.High((items.BOW,items.ARROW,items.ARROW)) LONER = True COMPANIONS = (Shade,Ghast,SkeletonMage,SkeletonFighter,SkeletonThief,SkeletalHound) COMBAT_AI = aibrain.SteadyAI() ATTACK = items.Attack( (2,6,0), element = stats.RESIST_CRUSHING ) TECHNIQUES = ( invocations.Invocation( "Arrow", effects.PhysicalAttackRoll( att_stat=stats.REFLEXES, on_success = ( effects.HealthDamage( (1,8,0), stat_bonus=None, element=stats.RESIST_PIERCING, anim=animobs.RedBoom ), effects.TargetIs( effects.ANIMAL, on_true=( effects.PercentRoll( roll_skill=stats.MAGIC_ATTACK, roll_stat=None, roll_modifier=-5, target_affects=True, on_success=( effects.InstaKill( anim=animobs.CriticalHit ) ,) ) ,) ) ), on_failure = ( effects.NoEffect( anim=animobs.SmallBoom ) ,) ), com_tar=targetarea.SingleTarget(reach=8), shot_anim=animobs.Arrow, ai_tar=invocations.TargetEnemy() ), ) def init_monster( self ): self.levels.append( base.Humanoid( 5, self ) )
class HolyBow(Enhancer): NAMEPAT = "Holy {0}" DESCPAT = "{0} A hit from this weapon may disrupt unholy creatures." PLUSRANK = 5 AFFECTS = (BOW, SLING) ATTACK_ON_HIT = effects.TargetIs( effects.UNHOLY, on_true=(effects.OpposedRoll( att_stat=stats.PIETY, att_modifier=-10, on_success=(effects.InstaKill(anim=animobs.CriticalHit), ), on_failure=(effects.OpposedRoll( att_modifier=10, on_success=(effects.Paralyze(max_duration=3), ), ), ), ), )) BONUSES_PER_RANK = stats.StatMod({ stats.PHYSICAL_ATTACK: 10, stats.RESIST_LUNAR: 25 }) TYPE = ET_SECONDARY
class Basilisk( base.Monster ): name = "Basilisk" statline = { stats.STRENGTH: 15, stats.TOUGHNESS: 15, stats.REFLEXES: 8, \ stats.INTELLIGENCE: 2, stats.PIETY: 12, stats.CHARISMA: 11 } SPRITENAME = "monster_default.png" FRAME = 39 TEMPLATES = (stats.REPTILE,) MOVE_POINTS = 8 VOICE = None HABITAT = ( context.HAB_EVERY, context.SET_EVERY, context.MTY_BEAST, context.MTY_BOSS ) ENC_LEVEL = 6 ATTACK = items.Attack( (1,8,0), element = stats.RESIST_PIERCING ) TECHNIQUES = ( invocations.MPInvocation( "Death Gaze", effects.OpposedRoll( att_stat=stats.PIETY, att_modifier=-10, on_success = ( effects.InstaKill( anim=animobs.CriticalHit ) ,), on_failure = ( effects.NoEffect( anim=animobs.SmallBoom ) ,) ), com_tar=targetarea.SingleTarget(reach=4), shot_anim=animobs.PurpleVortex, ai_tar=invocations.TargetEnemy(), mp_cost=6 ), ) def init_monster( self ): self.levels.append( base.Beast( 6, self ) )
class Medusa( base.Monster ): name = "Medusa" statline = { stats.STRENGTH: 10, stats.TOUGHNESS: 12, stats.REFLEXES: 15, \ stats.INTELLIGENCE: 12, stats.PIETY: 13, stats.CHARISMA: 15 } SPRITENAME = "monster_default.png" FRAME = 30 TEMPLATES = () MOVE_POINTS = 10 VOICE = dialogue.voice.GREEK HABITAT = ( context.HAB_EVERY, context.SET_EVERY, context.MTY_HUMANOID ) ENC_LEVEL = 9 COMBAT_AI = aibrain.ArcherAI(approach_allies=0,technique_chance=75) ATTACK = items.Attack( (1,6,0), element = stats.RESIST_PIERCING, extra_effect=abilities.POISON_ATTACK_2d6 ) TECHNIQUES = ( invocations.MPInvocation( "Death Gaze", effects.OpposedRoll( att_stat=stats.PIETY, att_modifier=-10, on_success = ( effects.InstaKill( anim=animobs.CriticalHit ) ,), on_failure = ( effects.NoEffect( anim=animobs.SmallBoom ) ,) ), com_tar=targetarea.SingleTarget(reach=6), shot_anim=animobs.PurpleVortex, ai_tar=invocations.TargetEnemy(), mp_cost=9 ), abilities.LONGBOW ) def init_monster( self ): self.levels.append( base.Humanoid( 6, self ) )
class HolyWeapon(Enhancer): NAMEPAT = "Holy {0}" DESCPAT = "{0} It does an extra 1d8 holy damage and disrupts unholy creatures." PLUSRANK = 5 AFFECTS = (SWORD, AXE, MACE, DAGGER, STAFF, POLEARM, FARMTOOL, LANCE) ATTACK_ON_HIT = effects.HealthDamage( (1, 8, 0), stat_bonus=None, element=stats.RESIST_SOLAR, anim=animobs.YellowExplosion, on_success=(effects.TargetIs( effects.UNHOLY, on_true=(effects.OpposedRoll( att_stat=stats.PIETY, att_modifier=-20, on_success=(effects.InstaKill(anim=animobs.CriticalHit), ), on_failure=(effects.OpposedRoll(on_success=(effects.Paralyze( max_duration=3), ), ), )), )), )) BONUSES_PER_RANK = stats.StatMod({ stats.PHYSICAL_ATTACK: 5, stats.RESIST_LUNAR: 25 }) TYPE = ET_SECONDARY
class Cockatrice( base.Monster ): name = "Cockatrice" statline = { stats.STRENGTH: 8, stats.TOUGHNESS: 8, stats.REFLEXES: 15, \ stats.INTELLIGENCE: 1, stats.PIETY: 10, stats.CHARISMA: 4 } SPRITENAME = "monster_default.png" FRAME = 21 TEMPLATES = () MOVE_POINTS = 10 VOICE = None HABITAT = ( context.HAB_EVERY, context.SET_EVERY, context.SET_RENFAN, context.DES_AIR, context.DES_EARTH, context.MTY_BEAST, context.MTY_BOSS ) ENC_LEVEL = 4 COMPANIONS = (animals.Chicken,) ATTACK = items.Attack( (1,6,0), element = stats.RESIST_PIERCING, skill_mod=stats.REFLEXES ) TECHNIQUES = ( invocations.MPInvocation( "Death Gaze", effects.OpposedRoll( att_stat=stats.PIETY, att_modifier=-10, on_success = ( effects.InstaKill( anim=animobs.CriticalHit ) ,), on_failure = ( effects.NoEffect( anim=animobs.SmallBoom ) ,) ), com_tar=targetarea.SingleTarget(reach=4), shot_anim=animobs.PurpleVortex, ai_tar=invocations.TargetEnemy(), mp_cost=4 ), ) def init_monster( self ): self.levels.append( base.Beast( 3, self ) )
rank=5, gems={AIR: 3}, com_tar=targetarea.Blast(radius=3), shot_anim=animobs.Whirlwind, ai_tar=invocations.TargetEnemy(min_distance=4)) # CIRCLE SIX DISMISSAL = Spell( "Dismissal", "Forces one demon, elemental, or spirit to leave the mortal realm and return to its home plane.", effects.TargetIs( effects.OTHERWORLDLY, anim=animobs.BlueSparkle, on_true=(effects.OpposedRoll( on_success=(effects.InstaKill(anim=animobs.CriticalHit), ), on_failure=(effects.HealthDamage( (3, 12, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_SOLAR, anim=animobs.YellowExplosion), )), ), on_false=(effects.NoEffect(anim=animobs.Caption), )), rank=6, gems={AIR: 2}, com_tar=targetarea.SingleTarget(), shot_anim=animobs.MysticBolt) CALL_AIR_ELEMENTAL = Spell( "Call Air Elemental", "This spell will summon a living embodiment of the skies to fight on your behalf.", effects.CallMonster({
ai_tar=invocations.TargetEnemy(min_distance=3),shot_anim=animobs.BlueComet ) # CIRCLE SEVEN SUMMONING = Spell( "Summoning", "This spell opens a portal to the nether realms and calls forth a powerful creature for you to command.", effects.CallMonster( {(context.MTY_UNDEAD,context.MTY_DEMON): True, context.DES_LUNAR: context.MAYBE, context.GEN_UNDEAD: context.MAYBE}, 14, anim=animobs.PurpleSparkle ), rank=7, gems={EARTH:2,LUNAR:3}, com_tar=targetarea.SingleTarget(reach=3), ai_tar=invocations.TargetEmptySpot(), mpfudge=13 ) DEEP_DROWNING = Spell( "Deep Drowning", "Conjures a turbulent water vortex in a small area. Enemies trapped inside take 4d12 water damage and may drown.", effects.HealthDamage( (4,12,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_WATER, anim=animobs.Bubbles, on_success=( effects.TargetIs( effects.CAN_DROWN, on_true=( effects.OpposedRoll( def_stat=stats.TOUGHNESS, on_success = ( effects.InstaKill( anim=animobs.CriticalHit ), )), )) ,) ), rank=7, gems={LUNAR:2,WATER:2}, com_tar=targetarea.Blast(radius=1), ai_tar=invocations.TargetEnemy(min_distance=2),shot_anim=animobs.CrystalBall ) # CIRCLE EIGHT # CIRCLE NINE GREATER_SUMMONING = Spell( "Greater Summoning", "This spell opens a portal to the nether realms and calls forth a diabolical creature to do your bidding.", effects.CallMonster( {(context.MTY_UNDEAD,context.MTY_DEMON): True, context.DES_LUNAR: context.MAYBE, context.GEN_UNDEAD: context.MAYBE}, 18, anim=animobs.PurpleSparkle ), rank=9, gems={EARTH:3,LUNAR:3}, com_tar=targetarea.SingleTarget(reach=3), ai_tar=invocations.TargetEmptySpot(), mpfudge=17 )