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 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 OgreMage(base.Monster): name = "Ogre Mage" statline = { stats.STRENGTH: 18, stats.TOUGHNESS: 18, stats.REFLEXES: 12, \ stats.INTELLIGENCE: 14, stats.PIETY: 14, stats.CHARISMA: 10, \ stats.RESIST_COLD: 100 } SPRITENAME = "monster_giants.png" FRAME = 17 TEMPLATES = () MOVE_POINTS = 10 HABITAT = (context.HAB_EVERY, context.HAB_FOREST, context.SET_EVERY, context.SET_RENFAN, context.DES_WATER, context.DES_AIR, context.DES_FIRE, context.MTY_HUMANOID, context.MTY_MAGE, context.MTY_BOSS, context.GEN_GIANT) ENC_LEVEL = 10 TREASURE = treasuretype.HighItems( (items.scrolls.Rank4Scroll, items.scrolls.Rank5Scroll)) LONER = True COMPANIONS = (Ogre, OgreChamp, OgreShaman, OgreLeader, Ettin) ATTACK = items.Attack((4, 6, 0), element=stats.RESIST_CRUSHING) TECHNIQUES = (spells.priestspells.BLIZZARD, spells.solarspells.MODERATE_CURE, spells.magespells.INCINERATE, spells.airspells.THUNDER_STRIKE) def init_monster(self): self.levels.append(base.Terror(5, self)) self.levels.append(base.Spellcaster(5, 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 SkeletonMage(base.Monster): name = "Skeleton Mage" statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 14, stats.REFLEXES: 14, \ stats.INTELLIGENCE: 16, stats.PIETY: 14, stats.CHARISMA: 10 } SPRITENAME = "monster_skeletons.png" FRAME = 15 TEMPLATES = (stats.UNDEAD, stats.BONE) MOVE_POINTS = 10 VOICE = None HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.SET_RENFAN, context.MTY_UNDEAD, context.MTY_HUMANOID, context.MTY_MAGE, context.MTY_BOSS, context.DES_EARTH, context.GEN_UNDEAD) ENC_LEVEL = 5 TREASURE = treasuretype.HighItems( (items.scrolls.Rank2Scroll, items.scrolls.Rank3Scroll)) COMPANIONS = (SkeletonFighter, SkeletonGuard) LONER = True TECHNIQUES = (spells.necrospells.ACID_CLOUD, spells.waterspells.WINTER_WIND, spells.firespells.EXPLOSION, spells.airspells.THUNDER_STRIKE) COMBAT_AI = aibrain.SteadySpellAI() ATTACK = items.Attack((1, 8, 2), element=stats.RESIST_CRUSHING) def init_monster(self): self.levels.append(base.Spellcaster(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 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 Necromancer( base.Monster ): name = "Necromancer" statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 12, stats.REFLEXES: 13, \ stats.INTELLIGENCE: 15, stats.PIETY: 13, stats.CHARISMA: 12 } SPRITENAME = "monster_spellcasters.png" FRAME = 23 TEMPLATES = () MOVE_POINTS = 10 HABITAT = ( context.HAB_EVERY, context.HAB_BUILDING, context.SET_EVERY, context.DES_CIVILIZED, context.DES_LUNAR, context.MTY_HUMANOID, context.MTY_MAGE, context.GEN_UNDEAD ) ENC_LEVEL = 5 TREASURE = treasuretype.HighItems( ( items.scrolls.Rank2Scroll, items.scrolls.Rank3Scroll ) ) COMBAT_AI = aibrain.BasicTechnicalAI() COMPANIONS = (undead.Ghoul,undead.SkeletonWithMorningstar) ATTACK = items.Attack( (1,6,0), element = stats.RESIST_CRUSHING ) TECHNIQUES = ( spells.lunarspells.ENERVATE, spells.necrospells.ACID_CLOUD, spells.necrospells.TOUCH_OF_DEATH, spells.necrospells.RAISE_CORPSE ) def init_monster( self ): self.levels.append( base.Spellcaster( 5, self ) )
class HoundArchon( base.Monster ): name = "Hound Archon" statline = { stats.STRENGTH: 23, stats.TOUGHNESS: 17, stats.REFLEXES: 8, \ stats.INTELLIGENCE: 10, stats.PIETY: 13, stats.CHARISMA: 12, \ stats.AWARENESS: 25, stats.CRITICAL_HIT: 20 } SPRITENAME = "monster_celestial.png" FRAME = 0 TEMPLATES = (stats.CELESTIAL,) MOVE_POINTS = 16 HABITAT = ( context.SET_EVERY, context.DES_SOLAR, context.MTY_HUMANOID, context.MTY_CELESTIAL ) ENC_LEVEL = 12 TREASURE = treasuretype.HighItems( ( None, items.POTION, items.SWORD ) ) TECHNIQUES = ( spells.priestspells.HEROISM, ) ATTACK = items.Attack( (2,6,0), element = stats.RESIST_SLASHING, extra_effect = effects.HealthDamage( (1,4,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_SOLAR, anim=animobs.YellowExplosion ) ) def init_monster( self ): self.levels.append( base.Humanoid( 14, self ) )
class Priest( base.Monster ): name = "Priest" statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 14, stats.REFLEXES: 10, \ stats.INTELLIGENCE: 13, stats.PIETY: 16, stats.CHARISMA: 12 } SPRITENAME = "monster_spellcasters.png" FRAME = 2 TEMPLATES = () MOVE_POINTS = 10 HABITAT = ( context.HAB_EVERY, context.HAB_BUILDING, context.SET_EVERY, context.DES_CIVILIZED, context.DES_SOLAR, context.MTY_LEADER, context.MTY_HUMANOID, context.MTY_PRIEST, context.GEN_KINGDOM ) ENC_LEVEL = 6 TREASURE = treasuretype.HighItems( ( items.scrolls.Rank2Scroll, items.scrolls.Rank3Scroll, items.POTION ) ) COMBAT_AI = aibrain.BasicTechnicalAI() COMPANIONS = (NoviceWarrior,NovicePriest,Warrior) ATTACK = items.Attack( (1,8,0), element = stats.RESIST_CRUSHING ) TECHNIQUES = ( spells.waterspells.FREEZE_FOE, spells.priestspells.HEALING_LIGHT, spells.solarspells.SUNRAY, spells.airspells.SILENCE, spells.priestspells.HEROISM, spells.priestspells.ARMOR_OF_FAITH ) def init_monster( self ): self.levels.append( base.Humanoid( 6, self ) )
class Conjuoror( base.Monster ): name = "Conjuoror" statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 12, stats.REFLEXES: 13, \ stats.INTELLIGENCE: 16, stats.PIETY: 14, stats.CHARISMA: 12 } SPRITENAME = "monster_spellcasters.png" FRAME = 10 TEMPLATES = () MOVE_POINTS = 10 HABITAT = ( context.HAB_EVERY, context.HAB_BUILDING, context.SET_EVERY, context.DES_CIVILIZED, context.DES_LUNAR, context.DES_FIRE, context.MTY_HUMANOID, context.MTY_MAGE, context.GEN_KINGDOM ) ENC_LEVEL = 7 TREASURE = treasuretype.HighItems( ( items.scrolls.Rank3Scroll, items.scrolls.Rank4Scroll ) ) COMBAT_AI = aibrain.BasicTechnicalAI() COMPANIONS = (NovicePriest,NoviceWarrior,Warrior,Mercenary) ATTACK = items.Attack( (1,8,0), element = stats.RESIST_CRUSHING ) TECHNIQUES = ( spells.magespells.LIGHTNING_BOLT, spells.lunarspells.SLEEP, spells.lunarspells.HELLBLAST, spells.firespells.EXPLOSION, spells.firespells.PYROTECHNICS ) def init_monster( self ): self.levels.append( base.Spellcaster( 7, self ) )