class YoungCaveDragon(base.Monster): name = "Young Cave Dragon" statline = { stats.STRENGTH: 11, stats.TOUGHNESS: 13, stats.REFLEXES: 10, \ stats.INTELLIGENCE: 10, stats.PIETY: 11, stats.CHARISMA: 10, stats.RESIST_POISON: 100 } SPRITENAME = "monster_dragons.png" FRAME = 2 TEMPLATES = (stats.DRAGON, ) MOVE_POINTS = 8 VOICE = dialogue.voice.DRACONIAN HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.HAB_CAVE, context.MAP_DUNGEON, context.MTY_DRAGON, context.MTY_BOSS, context.DES_EARTH, context.GEN_DRAGON) ENC_LEVEL = 4 COMBAT_AI = aibrain.BruiserAI() TREASURE = treasuretype.DragonHoard() ATTACK = items.Attack((3, 4, 0), element=stats.RESIST_SLASHING) TECHNIQUES = (invocations.MPInvocation( "Toxic Breath", effects.OpposedRoll(def_stat=stats.TOUGHNESS, anim=animobs.PoisonCloud, on_success=(effects.Paralyze(max_duration=3), )), com_tar=targetarea.Cone(reach=4), ai_tar=invocations.TargetEnemy(), mp_cost=4), ) def init_monster(self): self.levels.append(base.Terror(4, self))
class Healer( base.Monster ): name = "Healer" statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 16, stats.REFLEXES: 12, \ stats.INTELLIGENCE: 14, stats.PIETY: 18, stats.CHARISMA: 18 } SPRITENAME = "monster_spellcasters.png" FRAME = 16 TEMPLATES = () MOVE_POINTS = 10 HABITAT = ( context.HAB_EVERY, context.HAB_BUILDING, context.SET_EVERY, context.DES_CIVILIZED, context.DES_SOLAR, context.DES_WATER, context.MTY_BOSS, context.MTY_HUMANOID, context.MTY_PRIEST, context.GEN_KINGDOM ) ENC_LEVEL = 10 TREASURE = treasuretype.HighItems( ( items.potions.PotionOfHealing, items.scrolls.Rank4Scroll, items.scrolls.Rank5Scroll ) ) COMBAT_AI = aibrain.BasicTechnicalAI() COMPANIONS = (NoviceWarrior,NovicePriest,Warrior) ATTACK = items.Attack( (3,6,0), element = stats.RESIST_SOLAR, hit_anim=animobs.YellowExplosion ) TECHNIQUES = ( spells.priestspells.SMITE, spells.solarspells.MASS_CURE, spells.solarspells.MAXIMUM_CURE, invocations.MPInvocation( "Repent", effects.TargetIsAlly( on_true = ( effects.Enchant( enchantments.BlessingEn, anim=animobs.GreenSparkle ), effects.TargetIsDamaged( on_true= ( effects.HealthRestore( dice=(3,12,12) ), )) ), on_false=( effects.TargetIsEnemy( on_true = ( effects.HealthDamage( (3,12,0), stat_bonus=stats.CHARISMA, element=stats.RESIST_WATER, anim=animobs.Bubbles ), )), )), shot_anim=animobs.BlueComet, com_tar=targetarea.Blast(radius=3), ai_tar=invocations.TargetEnemy(), mp_cost=12 ) ) def init_monster( self ): self.levels.append( base.Spellcaster( 6, self ) ) self.levels.append( base.Defender( 4, self ) )
class YoungFireDragon(base.Monster): name = "Young Fire Dragon" statline = { stats.STRENGTH: 17, stats.TOUGHNESS: 15, stats.REFLEXES: 10, \ stats.INTELLIGENCE: 13, stats.PIETY: 15, stats.CHARISMA: 15, stats.RESIST_FIRE: 100, stats.RESIST_LIGHTNING: 100, stats.RESIST_SOLAR: 50 } SPRITENAME = "monster_dragons.png" FRAME = 3 TEMPLATES = (stats.DRAGON, ) MOVE_POINTS = 8 VOICE = dialogue.voice.DRACONIAN HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.DES_SOLAR, context.MTY_DRAGON, context.GEN_DRAGON, context.MTY_BOSS) ENC_LEVEL = 8 TREASURE = treasuretype.DragonHoard() ATTACK = items.Attack((2, 8, 0), element=stats.RESIST_SLASHING) TECHNIQUES = (invocations.MPInvocation( "Fire Breath", effects.OpposedRoll(def_stat=stats.TOUGHNESS, on_success=(effects.HealthDamage( (4, 6, 0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_FIRE, anim=animobs.DragonFire), ), on_failure=(effects.HealthDamage( (2, 6, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.DragonFire), )), com_tar=targetarea.Cone(reach=5), ai_tar=invocations.TargetEnemy(), mp_cost=14), ) def init_monster(self): self.levels.append(base.Terror(10, self))
class CloudGiant( base.Monster ): name = "Cloud Giant" statline = { stats.STRENGTH: 31, stats.TOUGHNESS: 21, stats.REFLEXES: 9, \ stats.INTELLIGENCE: 10, stats.PIETY: 14, stats.CHARISMA: 11 } SPRITENAME = "monster_giants.png" FRAME = 11 TEMPLATES = (stats.FIRE,) MOVE_POINTS = 14 HABITAT = ( context.HAB_EVERY, context.SET_EVERY, context.DES_FIRE, context.MTY_HUMANOID, context.MTY_FIGHTER, context.GEN_GIANT ) ENC_LEVEL = 13 TREASURE = treasuretype.HighItems() ATTACK = items.Attack( (4,6,0), element = stats.RESIST_CRUSHING ) TECHNIQUES = ( invocations.Invocation( "Rock", effects.PhysicalAttackRoll( att_stat=stats.REFLEXES, on_success = ( effects.HealthDamage( (2,8,0), stat_bonus=stats.STRENGTH, element=stats.RESIST_CRUSHING, anim=animobs.RedBoom ), ), on_failure = ( effects.NoEffect( anim=animobs.SmallBoom ) ,) ), com_tar=targetarea.SingleTarget(reach=10), shot_anim=animobs.SlingStone, ai_tar=invocations.TargetEnemy() ), ) def init_monster( self ): self.levels.append( base.Humanoid( 15, self ) )
class OgreLeader( base.Monster ): name = "Ogre Leader" statline = { stats.STRENGTH: 18, stats.TOUGHNESS: 18, stats.REFLEXES: 10, \ stats.INTELLIGENCE: 10, stats.PIETY: 10, stats.CHARISMA: 5 } SPRITENAME = "monster_giants.png" FRAME = 4 TEMPLATES = () MOVE_POINTS = 10 HABITAT = ( context.HAB_EVERY, context.HAB_FOREST, context.SET_EVERY, context.SET_RENFAN, context.MTY_HUMANOID, context.MTY_BOSS, context.MTY_LEADER, context.GEN_GIANT ) ENC_LEVEL = 8 TREASURE = treasuretype.High() LONER = True TECHNIQUES = ( invocations.Invocation( "Rock", effects.PhysicalAttackRoll( att_stat=stats.REFLEXES, on_success = ( effects.HealthDamage( (1,10,2), stat_bonus=None, element=stats.RESIST_CRUSHING, anim=animobs.RedBoom ) ,), on_failure = ( effects.NoEffect( anim=animobs.SmallBoom ) ,) ), com_tar=targetarea.SingleTarget(reach=6), shot_anim=animobs.SlingStone, ai_tar=invocations.TargetEnemy() ), ) COMPANIONS = ( Ogre, OgreChamp, OgreShaman ) ATTACK = items.Attack( (4,4,0), element = stats.RESIST_CRUSHING ) def init_monster( self ): self.levels.append( base.Leader( 9, self ) )
class CultLeader(base.Monster): name = "Cult Leader" statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 12, stats.REFLEXES: 12, \ stats.INTELLIGENCE: 10, stats.PIETY: 10, stats.CHARISMA: 16, \ stats.PHYSICAL_ATTACK: 5 } SPRITENAME = "monster_chaos.png" FRAME = 2 TEMPLATES = () MOVE_POINTS = 10 HABITAT = (context.HAB_EVERY, context.HAB_BUILDING, context.SET_EVERY, context.MAP_DUNGEON, context.MTY_HUMANOID, context.MTY_PRIEST, context.GEN_CHAOS) ENC_LEVEL = 3 LONER = True TREASURE = treasuretype.High() COMPANIONS = (Cultist, Cultist, Heretic, people.NoviceWarrior) TECHNIQUES = (spells.solarspells.MODERATE_CURE, spells.lunarspells.WIZARD_MISSILE) ATTACK = items.Attack((1, 6, 0), element=stats.RESIST_CRUSHING, extra_effect=effects.OpposedRoll( on_success=(effects.Paralyze(max_duration=6), ))) def init_monster(self): self.levels.append(base.Leader(3, self))
class AncientIceDragon(base.Monster): name = "Ancient Ice Dragon" statline = { stats.STRENGTH: 29, stats.TOUGHNESS: 21, stats.REFLEXES: 10, \ stats.INTELLIGENCE: 14, stats.PIETY: 15, stats.CHARISMA: 14, stats.RESIST_COLD: 100 } SPRITENAME = "monster_dragons.png" FRAME = 37 TEMPLATES = (stats.DRAGON, ) MOVE_POINTS = 10 VOICE = dialogue.voice.DRACONIAN HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.MTY_DRAGON, context.DES_ICE, context.GEN_DRAGON, context.MTY_BOSS) ENC_LEVEL = 17 TREASURE = treasuretype.DragonHoard() ATTACK = items.Attack((4, 10, 0), element=stats.RESIST_SLASHING) TECHNIQUES = (invocations.MPInvocation( "Frost Breath", effects.OpposedRoll(att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage( (8, 8, 0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_COLD, anim=animobs.SnowCloud), ), on_failure=(effects.HealthDamage( (4, 8, 0), stat_bonus=None, element=stats.RESIST_COLD, anim=animobs.SnowCloud), )), com_tar=targetarea.Cone(reach=7), ai_tar=invocations.TargetEnemy(), mp_cost=32), ) def init_monster(self): self.levels.append(base.Terror(25, self))
class SwampDragonfly(base.Monster): name = "Swamp Dragonfly" statline = { stats.STRENGTH: 10, stats.TOUGHNESS: 9, stats.REFLEXES: 13, \ stats.INTELLIGENCE: 1, stats.PIETY: 7, stats.CHARISMA: 1, \ stats.RESIST_ACID: 150 } SPRITENAME = "monster_bugs.png" FRAME = 2 TEMPLATES = (stats.BUG, ) MOVE_POINTS = 14 VOICE = None HABITAT = (context.HAB_FOREST, context.SET_EVERY, context.DES_EARTH, context.MTY_BEAST, context.MTY_CREATURE, context.GEN_DRAGON) ENC_LEVEL = 3 ATTACK = items.Attack((1, 6, 0), element=stats.RESIST_PIERCING) TECHNIQUES = (invocations.MPInvocation( "Acid Breath", effects.OpposedRoll( att_skill=stats.PHYSICAL_ATTACK, att_stat=stats.REFLEXES, att_modifier=10, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage((1, 6, 0), stat_bonus=None, element=stats.RESIST_ACID, anim=animobs.GreenExplosion), ), on_failure=(effects.NoEffect(anim=animobs.SmallBoom), )), com_tar=targetarea.SingleTarget(), shot_anim=animobs.GreenSpray, ai_tar=invocations.TargetEnemy(), mp_cost=3), ) def init_monster(self): self.levels.append(base.Beast(2, self))
class Spark(base.Monster): name = "Spark" statline = { stats.STRENGTH: 13, stats.TOUGHNESS: 8, stats.REFLEXES: 14, \ stats.INTELLIGENCE: 12, stats.PIETY: 6, stats.CHARISMA: 14, stats.RESIST_PIERCING: 50, stats.RESIST_CRUSHING: 50, stats.RESIST_SLASHING: 50 } SPRITENAME = "monster_by_Joe.png" FRAME = 4 TEMPLATES = (stats.ELEMENTAL, stats.FIRE) MOVE_POINTS = 12 HABITAT = (context.HAB_BUILDING, context.SET_EVERY, context.GEN_IGNAN, context.DES_FIRE, context.DES_SOLAR, context.MTY_ELEMENTAL, context.MTY_CELESTIAL) ENC_LEVEL = 3 COMBAT_AI = aibrain.ArcherAI(approach_allies=0, technique_chance=75) ATTACK = items.Attack((1, 6, 0), element=stats.RESIST_SOLAR, hit_anim=animobs.OrangeExplosion, extra_effect=abilities.BURN_ATTACK) TECHNIQUES = (invocations.Invocation( "Fire Bolt", effects.OpposedRoll( att_modifier=10, att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage((1, 6, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion), ), on_failure=(effects.NoEffect(anim=animobs.SmallBoom), )), com_tar=targetarea.SingleTarget(reach=5), shot_anim=animobs.FireBolt, ai_tar=invocations.TargetEnemy()), ) def init_monster(self): self.levels.append(base.Spellcaster(3, self))
class Unicorn(base.Monster): name = "Unicorn" statline = { stats.STRENGTH: 16, stats.TOUGHNESS: 18, stats.REFLEXES: 16, \ stats.INTELLIGENCE: 16, stats.PIETY: 20, stats.CHARISMA: 18, \ stats.RESIST_LUNAR: 100, stats.MAGIC_DEFENSE: 25 } SPRITENAME = "monster_animals.png" FRAME = 31 TEMPLATES = () MOVE_POINTS = 12 VOICE = None HABITAT = (context.HAB_FOREST, context.SET_EVERY, context.DES_SOLAR, context.MTY_BEAST, context.MTY_CREATURE, context.MTY_LEADER, context.MTY_BOSS, context.GEN_NATURE) ENC_LEVEL = 13 ATTACK = items.Attack((3, 6, 0), element=stats.RESIST_PIERCING) TECHNIQUES = (invocations.MPInvocation( "Radiance", effects.HealthRestore(dice=(5, 8, 20)), mp_cost=7, com_tar=targetarea.SingleTarget(reach=10), ai_tar=invocations.TargetWoundedAlly(), exp_tar=targetarea.SinglePartyMember(), shot_anim=animobs.YellowVortex), ) def init_monster(self): self.levels.append(base.Defender(12, self))
class Planetar(base.Monster): name = "Planetar" statline = { stats.STRENGTH: 25, stats.TOUGHNESS: 20, stats.REFLEXES: 19, \ stats.INTELLIGENCE: 22, stats.PIETY: 23, stats.CHARISMA: 22, stats.MAGIC_DEFENSE: 50, stats.RESIST_CRUSHING: 75, stats.RESIST_PIERCING: 75, stats.RESIST_SLASHING: 75 } SPRITENAME = "monster_celestial.png" FRAME = 4 TEMPLATES = (stats.CELESTIAL, ) MOVE_POINTS = 12 HABITAT = (context.SET_EVERY, context.DES_SOLAR, context.MTY_CELESTIAL) ENC_LEVEL = 18 TREASURE = treasuretype.HighItems((None, items.POTION, items.SCROLL)) ATTACK = items.Attack((3, 6, 0), element=stats.RESIST_SLASHING, extra_effect=effects.HealthDamage( (1, 10, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_SOLAR, anim=animobs.YellowExplosion)) # Planetars are supposed to get a whole lot more abilities; fill in later. TECHNIQUES = ( spells.solarspells.RENEWAL, spells.solarspells.SUNBURST, ) def init_monster(self): self.levels.append(base.Terror(16, self)) self.condition.append(enchantments.PermaMegaRegeneration())
class Fossil( base.Monster ): name = "Fossil" statline = { stats.STRENGTH: 24, stats.TOUGHNESS: 19, stats.REFLEXES: 12, \ stats.INTELLIGENCE: 1, stats.PIETY: 14, stats.CHARISMA: 1, stats.RESIST_LUNAR: 155 } SPRITENAME = "monster_skeletons.png" FRAME = 27 TEMPLATES = (stats.UNDEAD,stats.BONE) MOVE_POINTS = 6 VOICE = None HABITAT = ( context.HAB_CAVE, context.SET_EVERY, context.DES_LUNAR, context.DES_EARTH, context.MTY_UNDEAD, context.MTY_BEAST, context.MTY_BOSS, context.GEN_UNDEAD, context.GEN_NATURE ) ENC_LEVEL = 10 COMBAT_AI = aibrain.BrainDeadAI() ATTACK = items.Attack( (3,8,0), element = stats.RESIST_CRUSHING ) TECHNIQUES = ( invocations.MPInvocation( "Hellfire", effects.OpposedRoll( att_skill=stats.PHYSICAL_ATTACK, att_stat=stats.REFLEXES, att_modifier=10, def_stat=stats.REFLEXES, on_success = ( effects.HealthDamage( (1,10,0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_LUNAR, anim=animobs.PurpleExplosion, on_success = ( effects.SavingThrow( roll_skill=stats.RESIST_LUNAR, roll_stat=stats.TOUGHNESS, on_failure = ( effects.StatDamage( stats.STRENGTH, anim=animobs.GreenBoom ) ,)) ,)) ,), on_failure = ( effects.HealthDamage( (1,6,0), stat_bonus=None, element=stats.RESIST_LUNAR, anim=animobs.PurpleExplosion ) ,) ), com_tar=targetarea.Blast(radius=2), shot_anim=animobs.MysticBolt, ai_tar=invocations.TargetEnemy(), mp_cost=3 ), ) def init_monster( self ): self.levels.append( base.Beast( 16, self ) )
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 ) )
class MummyPriest( base.Monster ): name = "Mummy Priest" statline = { stats.STRENGTH: 22, stats.TOUGHNESS: 20, stats.REFLEXES: 10, \ stats.INTELLIGENCE: 10, stats.PIETY: 16, stats.CHARISMA: 15 } SPRITENAME = "monster_undead.png" FRAME = 48 TEMPLATES = (stats.UNDEAD,stats.MUMMY) MOVE_POINTS = 6 VOICE = None HABITAT = ( context.HAB_DESERT, context.HAB_TUNNELS, context.SET_EVERY, context.MTY_UNDEAD, context.MTY_HUMANOID, context.MTY_PRIEST, context.MTY_MAGE, context.MTY_BOSS, context.DES_SOLAR, context.GEN_UNDEAD ) ENC_LEVEL = 7 TREASURE = treasuretype.High(( items.scrolls.Rank3Scroll, items.scrolls.Rank4Scroll )) COMPANIONS = (Mummy,animals.Scarab,animals.TombScorpion) COMBAT_AI = aibrain.SteadySpellAI() TECHNIQUES = ( spells.lunarspells.HELLBLAST, spells.priestspells.HEALING_LIGHT, spells.priestspells.DIVINE_HAMMER, spells.solarspells.MAJOR_CURE, spells.priestspells.SANCTUARY, spells.magespells.INCINERATE ) ATTACK = items.Attack( (1,10,0), element = stats.RESIST_CRUSHING, extra_effect = effects.OpposedRoll( att_modifier=-10, on_success = ( effects.StatDamage( stats.TOUGHNESS, anim=animobs.GreenBoom ), effects.Enchant( enchantments.DiseaseEn, anim=None ) ,) ) ) def init_monster( self ): self.levels.append( base.Leader( 7, self ) ) self.condition.append( enchantments.PermaRegeneration() )
class PlagueRat(base.Monster): name = "Plague Rat" statline = { stats.STRENGTH: 10, stats.TOUGHNESS: 10, stats.REFLEXES: 13, \ stats.INTELLIGENCE: 1, stats.PIETY: 9, stats.CHARISMA: 3 } SPRITENAME = "monster_animals.png" FRAME = 4 TEMPLATES = () MOVE_POINTS = 12 VOICE = None HABITAT = (context.HAB_CAVE, context.HAB_BUILDING, context.HAB_TUNNELS, context.SET_EVERY, context.SET_RENFAN, context.DES_LUNAR, context.DES_CIVILIZED, context.MTY_BEAST, context.GEN_CHAOS, context.GEN_UNDEAD) ENC_LEVEL = 3 COMPANIONS = (GiantRat, ) ATTACK = items.Attack( (1, 6, 0), element=stats.RESIST_PIERCING, extra_effect=effects.SavingThrow(roll_skill=stats.MAGIC_DEFENSE, roll_stat=stats.TOUGHNESS, roll_modifier=15, on_failure=(effects.StatDamage( stats.TOUGHNESS, anim=animobs.GreenBoom), ))) def init_monster(self): self.levels.append(base.Beast(2, self))
class Harpy( base.Monster ): name = "Harpy" statline = { stats.STRENGTH: 10, stats.TOUGHNESS: 10, stats.REFLEXES: 15, \ stats.INTELLIGENCE: 7, stats.PIETY: 12, stats.CHARISMA: 17 } SPRITENAME = "monster_default.png" FRAME = 38 TEMPLATES = () MOVE_POINTS = 8 VOICE = dialogue.voice.GREEK HABITAT = ( context.HAB_EVERY, context.HAB_CAVE, context.SET_EVERY, context.DES_LUNAR, context.MTY_HUMANOID, context.MTY_BOSS, context.GEN_CHAOS ) ENC_LEVEL = 6 TREASURE = treasuretype.Standard() ATTACK = items.Attack( (2,4,0), element = stats.RESIST_SLASHING ) TECHNIQUES = (invocations.MPInvocation( "Sleep Song", effects.TargetIsEnemy( anim=animobs.SonicHit, on_true = ( effects.TargetIs( pat=effects.ANIMAL, on_true = ( effects.OpposedRoll( att_modifier=0, on_success = ( effects.CauseSleep(), )),) ,), )), com_tar=targetarea.SelfCentered(radius=6,delay_from=-1), ai_tar=invocations.TargetMobileEnemy(), mp_cost=8 ), ) def init_monster( self ): self.levels.append( base.Humanoid( 7, self ) )
class FlamingSword(base.Monster): name = "Flaming Sword" statline = { stats.STRENGTH: 16, stats.TOUGHNESS: 14, stats.REFLEXES: 18, \ stats.INTELLIGENCE: 12, stats.PIETY: 20, stats.CHARISMA: 14, stats.RESIST_SLASHING: 50, stats.MAGIC_DEFENSE: 50, stats.COUNTER_ATTACK: 50 } SPRITENAME = "monster_constructs.png" FRAME = 9 TEMPLATES = (stats.CONSTRUCT, ) MOVE_POINTS = 12 VOICE = None HABITAT = (context.SET_EVERY, context.MTY_CONSTRUCT, context.DES_AIR, context.DES_FIRE, context.SUMMON_FLAMINGSWORD) ENC_LEVEL = 14 COMBAT_AI = aibrain.SteadyAI() ATTACK = items.Attack( (3, 8, 0), element=stats.RESIST_SLASHING, extra_effect=effects.OpposedRoll(on_success=(effects.HealthDamage( (3, 8, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_FIRE, anim=animobs.RedCloud), effects.Enchant(enchantments.BurnLowEn)), on_failure=(effects.HealthDamage( (3, 8, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.RedCloud), ))) def init_monster(self): self.levels.append(base.Defender(14, self))
class SalamanderLeader(base.Monster): name = "Salamander Leader" statline = { stats.STRENGTH: 24, stats.TOUGHNESS: 16, stats.REFLEXES: 14, \ stats.INTELLIGENCE: 16, stats.PIETY: 17, stats.CHARISMA: 15 } SPRITENAME = "monster_e_fire.png" FRAME = 9 TEMPLATES = (stats.ELEMENTAL, stats.FIRE) MOVE_POINTS = 6 HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.DES_FIRE, context.MTY_ELEMENTAL, context.GEN_IGNAN, context.MTY_HUMANOID, context.MTY_LEADER, context.MTY_BOSS) ENC_LEVEL = 11 TREASURE = treasuretype.High() LONER = True COMPANIONS = (Salamander, ) ATTACK = items.Attack((2, 8, 0), element=stats.RESIST_SLASHING, extra_effect=effects.HealthDamage( (1, 8, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion)) TECHNIQUES = (spells.firespells.PYROTECHNICS, spells.airspells.DISPEL_MAGIC) def init_monster(self): self.levels.append(base.Leader(11, self))
class CorpseEater( base.Monster ): name = "Corpse Eater" statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 14, stats.REFLEXES: 8, \ stats.INTELLIGENCE: 2, stats.PIETY: 12, stats.CHARISMA: 2 } SPRITENAME = "monster_default.png" FRAME = 13 TEMPLATES = (stats.BUG,) MOVE_POINTS = 8 VOICE = None HABITAT = ( context.HAB_EVERY, context.HAB_TUNNELS, context.SET_EVERY, context.MAP_DUNGEON, context.DES_LUNAR, context.MTY_BEAST ) ENC_LEVEL = 4 ATTACK = items.Attack( (3,4,0), element = stats.RESIST_PIERCING, extra_effect = effects.OpposedRoll( att_stat=stats.TOUGHNESS, on_success = ( effects.Paralyze( max_duration = 6 ) ,) ) ) TECHNIQUES = ( invocations.MPInvocation( "Tentacle Slime", effects.TargetIsEnemy( on_true = ( effects.OpposedRoll( anim=animobs.GreenSplat, att_stat=stats.TOUGHNESS, on_success = ( effects.Paralyze( max_duration = 3 ) ,), on_failure = ( effects.NoEffect( anim=animobs.SmallBoom ) ,) ), ) ), com_tar=targetarea.SelfCentered(radius=1,exclude_middle=True), ai_tar=invocations.TargetEnemy(), mp_cost=8 ), ) def init_monster( self ): self.levels.append( base.Beast( 4, self ) )
class Salamander(base.Monster): name = "Salamander" statline = { stats.STRENGTH: 15, stats.TOUGHNESS: 14, stats.REFLEXES: 14, \ stats.INTELLIGENCE: 13, stats.PIETY: 15, stats.CHARISMA: 13 } SPRITENAME = "monster_e_fire.png" FRAME = 8 TEMPLATES = (stats.ELEMENTAL, stats.FIRE) MOVE_POINTS = 6 HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.DES_FIRE, context.MTY_ELEMENTAL, context.GEN_IGNAN, context.MTY_HUMANOID, context.MTY_FIGHTER, context.MTY_BOSS) ENC_LEVEL = 8 TREASURE = treasuretype.Standard() ATTACK = items.Attack((1, 8, 0), element=stats.RESIST_PIERCING, reach=2, extra_effect=effects.HealthDamage( (1, 8, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion)) TECHNIQUES = (spells.firespells.EXPLOSION, ) def init_monster(self): self.levels.append(base.Humanoid(8, self))
class Hydra( base.Monster ): name = "Hydra" statline = { stats.STRENGTH: 21, stats.TOUGHNESS: 20, stats.REFLEXES: 12, \ stats.INTELLIGENCE: 3, stats.PIETY: 10, stats.CHARISMA: 9, stats.PHYSICAL_ATTACK: 20 } SPRITENAME = "monster_default.png" FRAME = 3 TEMPLATES = (stats.REPTILE,stats.EARTH,) MOVE_POINTS = 8 HABITAT = ( context.HAB_EVERY, context.SET_EVERY, context.DES_EARTH, context.MTY_BOSS ) ENC_LEVEL = 11 VOICE = dialogue.voice.GREEK COMBAT_AI = aibrain.BruiserAI() TREASURE = treasuretype.Low() ATTACK = items.Attack( (2,10,0), element = stats.RESIST_PIERCING ) TECHNIQUES = ( invocations.MPInvocation( "Poison Breath", effects.OpposedRoll( def_stat=stats.TOUGHNESS, on_success = ( effects.HealthDamage( (3,6,0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_POISON, anim=animobs.PoisonCloud ), effects.TargetIs( effects.ALIVE, on_true=( effects.OpposedRoll( att_stat=None, def_stat=stats.TOUGHNESS, on_success = ( effects.Enchant( enchantments.PoisonClassic ) ,) ), )) ), on_failure = ( effects.HealthDamage( (2,6,0), stat_bonus=None, element=stats.RESIST_POISON, anim=animobs.PoisonCloud ) ,) ), com_tar=targetarea.Blast(radius=2), ai_tar=invocations.TargetEnemy(min_distance=3), mp_cost=20, shot_anim=animobs.GreenComet ), ) def init_monster( self ): self.levels.append( base.Terror( 10, self ) ) self.condition.append( enchantments.PermaMegaRegeneration() )
class Kaiju( base.Monster ): name = "Kaiju" statline = { stats.STRENGTH: 45, stats.TOUGHNESS: 35, stats.REFLEXES: 16, \ stats.INTELLIGENCE: 3, stats.PIETY: 14, stats.CHARISMA: 14, stats.RESIST_ATOMIC: 50, stats.RESIST_FIRE: 200, stats.RESIST_POISON: 200, stats.RESIST_LUNAR: 200 } SPRITENAME = "monster_default.png" FRAME = 14 TEMPLATES = () MOVE_POINTS = 8 HABITAT = ( context.HAB_EVERY, context.SET_EVERY, context.MAP_WILDERNESS, context.MTY_BEAST ) ENC_LEVEL = 22 VOICE = dialogue.voice.DRACONIAN COMBAT_AI = aibrain.BruiserAI() TREASURE = None ATTACK = items.Attack( (4,8,0), element = stats.RESIST_CRUSHING ) TECHNIQUES = ( invocations.MPInvocation( "Atomic Breath", effects.OpposedRoll( att_stat=stats.REFLEXES, on_success = ( effects.HealthDamage( (10,6,0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_ATOMIC, anim=animobs.Nuclear ) ,), on_failure = ( effects.HealthDamage( (3,10,0), stat_bonus=None, element=stats.RESIST_ATOMIC, anim=animobs.Nuclear ) ,) ), com_tar=targetarea.Cone(reach=8), ai_tar=invocations.TargetEnemy(), mp_cost=60 ), ) def init_monster( self ): self.levels.append( base.Beast( 48, self ) ) self.condition.append( enchantments.PermaMegaRegeneration() )
class Chimera( base.Monster ): name = "Chimera" # This is based on the version from the Pathfinder SRD rather than the # regular SRD; the only difference is the beefed-up breath weapon. statline = { stats.STRENGTH: 19, stats.TOUGHNESS: 17, stats.REFLEXES: 13, \ stats.INTELLIGENCE: 4, stats.PIETY: 13, stats.CHARISMA: 10, stats.AWARENESS: 50 } SPRITENAME = "monster_by_Joe.png" FRAME = 0 TEMPLATES = () MOVE_POINTS = 12 VOICE = dialogue.voice.GREEK HABITAT = ( context.HAB_EVERY, context.SET_EVERY, context.DES_FIRE, context.MTY_BEAST, context.GEN_CHAOS, context.MTY_BOSS ) ENC_LEVEL = 9 TREASURE = treasuretype.Standard() ATTACK = items.Attack( (2,8,0), element = stats.RESIST_PIERCING ) TECHNIQUES = ( invocations.MPInvocation( "Fire Breath", effects.OpposedRoll( att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success = ( effects.HealthDamage( (6,8,0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_FIRE, anim=animobs.RedCloud ) ,), on_failure = ( effects.HealthDamage( (3,8,0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.RedCloud ) ,) ), com_tar=targetarea.Cone(reach=4), ai_tar=invocations.TargetEnemy(), mp_cost=16 ), ) def init_monster( self ): self.levels.append( base.Terror( 9, self ) )
class Behir( base.Monster ): name = "Behir" statline = { stats.STRENGTH: 26, stats.TOUGHNESS: 21, stats.REFLEXES: 13, \ stats.INTELLIGENCE: 7, stats.PIETY: 14, stats.CHARISMA: 12, \ stats.RESIST_LIGHTNING: 150, stats.AWARENESS: 50, stats.CRITICAL_HIT: 10 } SPRITENAME = "monster_by_Joe.png" FRAME = 5 TEMPLATES = () MOVE_POINTS = 12 HABITAT = ( context.HAB_EVERY, context.SET_EVERY, context.MAP_DUNGEON, context.DES_AIR, context.MTY_BOSS ) ENC_LEVEL = 10 TREASURE = treasuretype.Swallowed(scale=1,swag_chance=20) ATTACK = items.Attack( (2,4,0), element = stats.RESIST_PIERCING ) TECHNIQUES = ( invocations.MPInvocation( "Lightning Breath", effects.OpposedRoll( att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success = ( effects.HealthDamage( (7,6,0), stat_bonus=None, element=stats.RESIST_LIGHTNING, anim=animobs.Spark ) ,), on_failure = ( effects.HealthDamage( (3,7,0), stat_bonus=None, element=stats.RESIST_LIGHTNING, anim=animobs.Spark ) ,) ), com_tar=targetarea.Line(reach=5), ai_tar=invocations.TargetEnemy(), mp_cost=30 ), ) def init_monster( self ): self.levels.append( base.Terror( 9, self ) )
class EvilEye( base.Monster ): name = "Evil Eye" statline = { stats.STRENGTH: 6, stats.TOUGHNESS: 12, stats.REFLEXES: 12, \ stats.INTELLIGENCE: 10, stats.PIETY: 10, stats.CHARISMA: 2, \ stats.MAGIC_ATTACK: 20, stats.MAGIC_DEFENSE: 10 } SPRITENAME = "monster_default.png" FRAME = 18 TEMPLATES = () MOVE_POINTS = 6 VOICE = None HABITAT = ( context.HAB_CAVE, context.HAB_TUNNELS, context.SET_EVERY, context.DES_LUNAR, context.MTY_BOSS, context.MTY_BEAST, context.GEN_CHAOS ) ENC_LEVEL = 3 ATTACK = items.Attack( (2,4,0), element = stats.RESIST_LUNAR, skill_mod=stats.REFLEXES, hit_anim=animobs.PurpleExplosion, extra_effect = effects.OpposedRoll( att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success = ( effects.Paralyze( max_duration = 3 ) ,) ) ) TECHNIQUES = ( invocations.MPInvocation( "Evil Gaze", effects.OpposedRoll( att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, att_modifier=10, on_success = ( effects.Paralyze( max_duration = 3 ) ,), on_failure = ( effects.NoEffect( anim=animobs.SmallBoom ) ,) ), com_tar=targetarea.SingleTarget(reach=4), shot_anim=animobs.PurpleVortex, ai_tar=invocations.TargetMobileEnemy(), mp_cost=3 ), ) def init_monster( self ): self.levels.append( base.Beast( 3, self ) )
class Lamia( base.Monster ): name = "Lamia" statline = { stats.STRENGTH: 18, stats.TOUGHNESS: 12, stats.REFLEXES: 15, \ stats.INTELLIGENCE: 13, stats.PIETY: 15, stats.CHARISMA: 12 } SPRITENAME = "monster_default.png" FRAME = 2 TEMPLATES = () MOVE_POINTS = 10 VOICE = dialogue.voice.GREEK HABITAT = ( context.HAB_EVERY, context.HAB_DESERT, context.SET_EVERY, context.DES_LUNAR, context.MTY_HUMANOID, context.MTY_BOSS ) ENC_LEVEL = 7 TREASURE = treasuretype.HighItems() ATTACK = items.Attack( (1,6,0), element = stats.RESIST_SLASHING, extra_effect= effects.StatDamage( stats.PIETY, amount=4, anim=animobs.GreenBoom ) ) TECHNIQUES = ( invocations.MPInvocation( "Spirit Drain", effects.TargetIsEnemy( on_true = ( effects.OpposedRoll( on_success = ( effects.ManaDamage( (1,8,0), stat_bonus=stats.TOUGHNESS, anim=animobs.PurpleExplosion ), effects.CauseSleep() ,), on_failure = ( effects.ManaDamage( (1,8,0), stat_bonus=None, anim=animobs.PurpleExplosion ) ,)),), on_false= ( effects.NoEffect( anim=animobs.PurpleExplosion ) ,)), com_tar=targetarea.Cone(reach=4), ai_tar=invocations.TargetEnemy(), mp_cost=12 ), ) def init_monster( self ): self.levels.append( base.Humanoid( 8, self ) )
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 ReptalDruid(base.Monster): name = "Reptal Druid" statline = { stats.STRENGTH: 17, stats.TOUGHNESS: 15, stats.REFLEXES: 12, \ stats.INTELLIGENCE: 13, stats.PIETY: 13, stats.CHARISMA: 9 } SPRITENAME = "monster_draconic.png" FRAME = 6 TEMPLATES = (stats.REPTILE, ) MOVE_POINTS = 10 VOICE = dialogue.voice.DRACONIAN HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.DES_WATER, context.MTY_HUMANOID, context.MTY_MAGE, context.MTY_PRIEST, context.GEN_DRAGON, context.GEN_NATURE) ENC_LEVEL = 5 TECHNIQUES = (spells.solarspells.MODERATE_CURE, spells.firespells.IGNITE, spells.earthspells.ACID_BOLT, spells.firespells.EXPLOSION, spells.waterspells.REGENERATION) ATTACK = items.Attack((1, 8, 0), element=stats.RESIST_SLASHING) TREASURE = treasuretype.HighItems( (items.scrolls.Rank2Scroll, items.scrolls.Rank3Scroll, items.potions.PotionOfStrength)) COMPANIONS = (ReptalWarrior, ReptalArcher) LONER = True def init_monster(self): self.levels.append(base.Humanoid(4, self))
class AirElemental(base.Monster): name = "Air Elemental" statline = { stats.STRENGTH: 20, stats.TOUGHNESS: 20, stats.REFLEXES: 30, \ stats.INTELLIGENCE: 12, stats.PIETY: 12, stats.CHARISMA: 12, stats.RESIST_WIND: 100 } SPRITENAME = "monster_e_air.png" FRAME = 0 TEMPLATES = (stats.ELEMENTAL, stats.AIR) MOVE_POINTS = 20 HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.DES_AIR, context.MTY_ELEMENTAL, context.SUMMON_ELEMENTAL) ENC_LEVEL = 12 ATTACK = items.Attack((1, 10, 0), element=stats.RESIST_SLASHING, extra_effect=effects.HealthDamage( (1, 10, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_WIND, anim=animobs.Spiral)) TECHNIQUES = (invocations.MPInvocation( "Tornado", effects.OpposedRoll(def_stat=stats.REFLEXES, on_success=(effects.HealthDamage( (3, 8, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_WIND, anim=animobs.Spiral), ), on_failure=(effects.HealthDamage( (1, 12, 0), stat_bonus=None, element=stats.RESIST_WIND, anim=animobs.Spiral), )), mp_cost=10, com_tar=targetarea.Blast(radius=3), shot_anim=animobs.Whirlwind, ai_tar=invocations.TargetEnemy()), invocations.MPInvocation( "Lightning Bolt", effects.OpposedRoll(def_stat=stats.REFLEXES, on_success=(effects.HealthDamage( (3, 12, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_LIGHTNING, anim=animobs.BlueZap), ), on_failure=(effects.HealthDamage( (2, 10, 0), stat_bonus=None, element=stats.RESIST_LIGHTNING, anim=animobs.BlueZap), )), mp_cost=5, com_tar=targetarea.SingleTarget(), shot_anim=animobs.Lightning, ai_tar=invocations.TargetEnemy())) def init_monster(self): self.levels.append(base.Beast(12, self))
class FireBat(base.Monster): name = "Fire Bat" statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 12, stats.REFLEXES: 14, \ stats.INTELLIGENCE: 2, stats.PIETY: 9, stats.CHARISMA: 3, } SPRITENAME = "monster_animals.png" FRAME = 26 TEMPLATES = (stats.FIRE, ) MOVE_POINTS = 14 VOICE = None HABITAT = (context.HAB_CAVE, context.SET_EVERY, context.DES_FIRE, context.DES_LUNAR, context.MTY_BEAST) ENC_LEVEL = 4 ATTACK = items.Attack((2, 4, 0), element=stats.RESIST_PIERCING, extra_effect=effects.OpposedRoll( att_stat=stats.TOUGHNESS, att_modifier=-10, on_success=( effects.HealthDamage( (1, 6, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion), effects.Enchant(enchantments.BurnLowEn), ))) TECHNIQUES = (invocations.MPInvocation( "Fire Breath", effects.OpposedRoll(att_skill=stats.PHYSICAL_ATTACK, att_stat=stats.REFLEXES, att_modifier=-10, def_stat=stats.REFLEXES, on_success=( effects.HealthDamage( (1, 8, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion), effects.Enchant(enchantments.BurnLowEn), ), on_failure=(effects.HealthDamage( (1, 8, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion), )), com_tar=targetarea.SingleTarget(), shot_anim=animobs.Fireball, ai_tar=invocations.TargetEnemy(), mp_cost=3), ) def init_monster(self): self.levels.append(base.Beast(3, self))