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 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 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 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 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 CreepingCoins( base.Monster ): name = "Creeping Coins" statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 12, stats.REFLEXES: 12, \ stats.INTELLIGENCE: 1, stats.PIETY: 10, stats.CHARISMA: 1, \ stats.RESIST_COLD: 155 } SPRITENAME = "monster_constructs.png" FRAME = 18 TEMPLATES = (stats.CONSTRUCT,) MOVE_POINTS = 6 VOICE = None HABITAT = ( context.HAB_CAVE, context.SET_RENFAN, context.MTY_CONSTRUCT, context.DES_ICE ) ENC_LEVEL = 7 TREASURE = treasuretype.High() COMBAT_AI = aibrain.SteadyAI() ATTACK = items.Attack( (2,6,0), element = stats.RESIST_CRUSHING ) TECHNIQUES = ( invocations.MPInvocation( "Cold Blast", effects.OpposedRoll( att_modifier=10, def_stat=stats.REFLEXES, on_success = ( effects.HealthDamage( (1,10,0), stat_bonus=None, element=stats.RESIST_COLD, anim=animobs.SnowCloud ) ,), on_failure = ( effects.HealthDamage( (1,6,0), stat_bonus=None, element=stats.RESIST_COLD, anim=animobs.SnowCloud ) ,) ), com_tar=targetarea.Cone(reach=5), ai_tar=invocations.TargetEnemy(), mp_cost=1 ), ) def init_monster( self ): self.levels.append( base.Defender( 6, self ) )
class Mummy(base.Monster): name = "Mummy" statline = { stats.STRENGTH: 20, stats.TOUGHNESS: 20, stats.REFLEXES: 10, \ stats.INTELLIGENCE: 6, stats.PIETY: 14, stats.CHARISMA: 15 } SPRITENAME = "monster_undead.png" FRAME = 47 TEMPLATES = (stats.UNDEAD, stats.MUMMY) MOVE_POINTS = 6 VOICE = None HABITAT = (context.HAB_DESERT, context.HAB_TUNNELS, context.SET_EVERY, context.MTY_UNDEAD, context.DES_SOLAR, context.GEN_UNDEAD) ENC_LEVEL = 5 TREASURE = treasuretype.High() COMBAT_AI = aibrain.BrainDeadAI() 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.Humanoid(5, self))
class PlagueZombie(base.Monster): name = "Plague Zombie" statline = { stats.STRENGTH: 11, stats.TOUGHNESS: 14, stats.REFLEXES: 4, \ stats.INTELLIGENCE: 2, stats.PIETY: 8, stats.CHARISMA: 1 } SPRITENAME = "monster_undead.png" FRAME = 10 TEMPLATES = (stats.UNDEAD, stats.FLESHY) MOVE_POINTS = 6 VOICE = None HABITAT = (context.HAB_EVERY, context.HAB_TUNNELS, context.SET_EVERY, context.SET_RENFAN, context.MTY_UNDEAD, context.DES_LUNAR, context.GEN_UNDEAD) ENC_LEVEL = 5 TREASURE = treasuretype.High() COMPANIONS = (Zombie, Ghoul) COMBAT_AI = aibrain.BrainDeadAI() ATTACK = items.Attack( (1, 10, 0), element=stats.RESIST_CRUSHING, extra_effect=effects.SavingThrow(roll_skill=stats.RESIST_LUNAR, roll_stat=stats.TOUGHNESS, on_failure=(effects.StatDamage( stats.TOUGHNESS, anim=animobs.GreenBoom), ))) def init_monster(self): self.levels.append(base.Undead(5, self))
class BarbarianChief(base.Monster): name = "Barbarian Chief" statline = { stats.STRENGTH: 14, stats.TOUGHNESS: 14, stats.REFLEXES: 12, \ stats.INTELLIGENCE: 10, stats.PIETY: 14, stats.CHARISMA: 10, stats.NATURAL_DEFENSE: 10, stats.MAGIC_DEFENSE: 10 } SPRITENAME = "monster_giants.png" FRAME = 6 TEMPLATES = () MOVE_POINTS = 8 HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.MAP_WILDERNESS, context.MTY_HUMANOID, context.MTY_LEADER, context.MTY_BOSS, context.GEN_GIANT) ENC_LEVEL = 7 TREASURE = treasuretype.High((items.SWORD, items.LIGHT_ARMOR, items.CLOAK)) TECHNIQUES = (abilities.COMPOSITEBOW, ) COMPANIONS = (Barbarian, BarbarianScout, Berserker) LONER = True ATTACK = items.Attack((2, 6, 0), element=stats.RESIST_SLASHING) def init_monster(self): self.levels.append(base.Leader(7, self))
class SkeletonGuard( base.Monster ): name = "Skeleton Guard" statline = { stats.STRENGTH: 15, stats.TOUGHNESS: 16, stats.REFLEXES: 12, \ stats.INTELLIGENCE: 12, stats.PIETY: 12, stats.CHARISMA: 1, stats.NATURAL_DEFENSE: 10 } SPRITENAME = "monster_skeletons.png" FRAME = 6 TEMPLATES = (stats.UNDEAD,stats.BONE) MOVE_POINTS = 8 VOICE = None HABITAT = ( context.HAB_EVERY, context.HAB_DESERT, context.SET_EVERY, context.SET_RENFAN, context.MTY_UNDEAD, context.DES_EARTH, context.DES_SOLAR, context.GEN_UNDEAD ) ENC_LEVEL = 3 TREASURE = treasuretype.High() COMPANIONS = (SkeletonWithDagger,SkeletonWithMorningstar) COMBAT_AI = aibrain.SteadyAI() ATTACK = items.Attack( (1,8,0), element = stats.RESIST_PIERCING ) def init_monster( self ): self.levels.append( base.Defender( 3, self ) )
class Sphinx( base.Monster ): name = "Sphinx" statline = { stats.STRENGTH: 19, stats.TOUGHNESS: 13, stats.REFLEXES: 12, \ stats.INTELLIGENCE: 18, stats.PIETY: 19, stats.CHARISMA: 19, \ stats.NATURAL_DEFENSE: 15 } SPRITENAME = "monster_default.png" FRAME = 37 TEMPLATES = () MOVE_POINTS = 12 VOICE = dialogue.voice.GREEK HABITAT = ( context.HAB_DESERT, context.SET_EVERY, context.MAP_WILDERNESS, context.DES_SOLAR, context.MTY_HUMANOID, context.MTY_LEADER, context.MTY_BOSS ) ENC_LEVEL = 10 TREASURE = treasuretype.High() ATTACK = items.Attack( (2,6,4), element = stats.RESIST_SLASHING ) TECHNIQUES = ( spells.lunarspells.DEATH_RAY, spells.airspells.DISPEL_MAGIC, spells.priestspells.SANCTUARY, spells.solarspells.REMOVE_CURSE, spells.solarspells.MASS_CURE ) def init_monster( self ): self.levels.append( base.Terror( 8, self ) )
class Ghast(base.Monster): name = "Ghast" statline = { stats.STRENGTH: 17, stats.TOUGHNESS: 12, stats.REFLEXES: 17, \ stats.INTELLIGENCE: 13, stats.PIETY: 14, stats.CHARISMA: 16 } SPRITENAME = "monster_undead.png" FRAME = 40 TEMPLATES = (stats.UNDEAD, stats.FLESHY) MOVE_POINTS = 8 VOICE = None HABITAT = (context.HAB_EVERY, context.HAB_TUNNELS, context.SET_EVERY, context.MTY_UNDEAD, context.DES_LUNAR, context.GEN_UNDEAD) ENC_LEVEL = 6 TREASURE = treasuretype.High() COMPANIONS = (PlagueZombie, Ghoul) COMBAT_AI = aibrain.GhoulAI() ATTACK = items.Attack((1, 12, 0), element=stats.RESIST_CRUSHING, extra_effect=effects.OpposedRoll( att_modifier=0, on_success=(effects.Paralyze(max_duration=6), ))) def init_monster(self): self.levels.append(base.Undead(6, self))