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 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 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 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 YoungForestDragon(base.Monster): name = "Young Forest Dragon" statline = { stats.STRENGTH: 15, stats.TOUGHNESS: 16, stats.REFLEXES: 15, \ stats.INTELLIGENCE: 12, stats.PIETY: 12, stats.CHARISMA: 12, stats.RESIST_POISON: 100 } SPRITENAME = "monster_dragons.png" FRAME = 4 TEMPLATES = (stats.DRAGON, ) MOVE_POINTS = 8 VOICE = dialogue.voice.DRACONIAN HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.HAB_FOREST, context.MAP_WILDERNESS, context.MTY_DRAGON, context.GEN_NATURE, context.GEN_DRAGON, context.MTY_BOSS) ENC_LEVEL = 6 TREASURE = treasuretype.DragonHoard() ATTACK = items.Attack((1, 12, 0), element=stats.RESIST_SLASHING) 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), ), on_failure=(effects.HealthDamage( (1, 10, 0), stat_bonus=None, element=stats.RESIST_POISON, anim=animobs.PoisonCloud), )), com_tar=targetarea.Blast(radius=1), ai_tar=invocations.TargetEnemy(), mp_cost=9, shot_anim=animobs.GreenComet), ) def init_monster(self): self.levels.append(base.Terror(7, self))
"Conjures an intense ball of light which does 5d10 solar damage to all enemies in a 3 tile radius.", effects.TargetIsEnemy( on_true=(effects.OpposedRoll(on_success=(effects.HealthDamage( (5, 10, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_SOLAR, anim=animobs.YellowExplosion), ), on_failure=(effects.HealthDamage( (2, 12, 0), stat_bonus=None, element=stats.RESIST_SOLAR, anim=animobs.YellowExplosion), )), ), on_false=(effects.NoEffect(anim=animobs.YellowExplosion), )), rank=7, gems={SOLAR: 2}, com_tar=targetarea.Blast(radius=3, delay_from=1), shot_anim=animobs.GoldStone, ai_tar=invocations.TargetEnemy(min_distance=4)) RENEWAL = Spell( "Renewal", "This spell will heal one nearby ally for 50-120 damage, retore drained stats, remove curses and cure poisoning.", effects.TargetIsAlly(on_true=( effects.HealthRestore(dice=(10, 8, 40)), effects.TidyEnchantments(enchantments.CURSE, anim=None), effects.TidyEnchantments(enchantments.POISON, anim=None), effects.StatRestore(anim=None), )), rank=7, gems={SOLAR: 4}, com_tar=targetarea.SingleTarget(reach=1),
EXPLOSION = Spell( "Explosion", "Causes a magical explosion which does 2d6 fire damage to all targets within 3 tiles.", effects.OpposedRoll(on_success=(effects.HealthDamage( (2, 6, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_FIRE, anim=animobs.RedCloud), ), on_failure=(effects.HealthDamage( (1, 6, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.RedCloud), )), rank=3, gems={FIRE: 2}, com_tar=targetarea.Blast(radius=3), shot_anim=animobs.Fireball, ai_tar=invocations.TargetEnemy(min_distance=4)) # CIRCLE 4 PYROTECHNICS = Spell( "Pyrotechnics", "Conjures magical fireworks which do 4d6 fire damage to all targets in a straight line.", effects.OpposedRoll(on_success=(effects.HealthDamage( (4, 6, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_FIRE, anim=animobs.Ignite), ), on_failure=(effects.HealthDamage( (1, 12, 0),
mpfudge=-1, com_tar=targetarea.SingleTarget(), exp_tar=targetarea.SingleTarget()) # CIRCLE TWO SILENCE = Spell( "Silence", "Targets within a 2 tile radius may be silenced, preventing them from casting spells.", effects.OpposedRoll( att_modifier=0, on_success=(effects.CauseSilence(), ), on_failure=(effects.NoEffect(anim=animobs.SmallBoom), )), rank=2, gems={AIR: 1}, com_tar=targetarea.Blast(radius=2), ai_tar=invocations.TargetEnemy()) SHOUT = Spell( "Shout", "The caster's words become a sonic wave, doing 1d8 wind damage to all targets within reach.", effects.OpposedRoll(on_success=(effects.HealthDamage( (1, 8, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_WIND, anim=animobs.SonicHit), ), on_failure=(effects.HealthDamage( (1, 4, 0), stat_bonus=None, element=stats.RESIST_WIND, anim=animobs.SonicHit), )),
effects.HealthDamage( (2,5,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_COLD, anim=animobs.BlueExplosion ), effects.Paralyze( max_duration = 3 ) ,), on_failure = ( effects.HealthDamage( (2,5,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_COLD, anim=animobs.BlueExplosion ) ,) ), rank=2, gems={LUNAR:1,WATER:1}, com_tar=targetarea.SingleTarget(reach=1),ai_tar=invocations.TargetEnemy(), mpfudge=-2 ) # CIRCLE 3 ACID_CLOUD = Spell( "Acid Cloud", "Calls forth billowing clouds of acid which do 2d6 damage to all targets within 3 tiles.", effects.OpposedRoll( on_success = ( effects.HealthDamage( (2,6,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_ACID, anim=animobs.GreenCloud ) ,), on_failure = ( effects.HealthDamage( (1,6,0), stat_bonus=None, element=stats.RESIST_ACID, anim=animobs.GreenCloud ) ,) ), rank=3, gems={EARTH:1,LUNAR:1}, com_tar=targetarea.Blast(radius=3), shot_anim=animobs.GreenComet, ai_tar=invocations.TargetEnemy(min_distance=4) ) PROTECT_FROM_GOOD = Spell( "Protection from Good", "All allies within 6 tiles get +10% defense, +10% aura, and 50% resistance to holy damage for the duration of combat.", effects.TargetIsAlly( on_true = ( effects.Enchant( enchantments.ProtectFromGoodEn, anim=animobs.PurpleSparkle ), )), rank=3, gems={LUNAR:1,WATER:1}, com_tar=targetarea.SelfCentered(), ai_tar=invocations.TargetAllyWithoutEnchantment(enchantments.ProtectFromGoodEn) ) # CIRCLE FOUR RAISE_UNDEAD = Spell( "Raise Undead", "You conjure dark forces to animate an undead creature which will fight on your behaf.",
effects.CallMonster( {context.MTY_CREATURE: True, context.DES_EARTH: context.MAYBE, context.GEN_NATURE: context.MAYBE, context.DES_SOLAR: context.MAYBE}, 10, anim=animobs.OrangeSparkle ), rank=5, gems={EARTH:2,SOLAR:2}, com_tar=targetarea.SingleTarget(reach=2), ai_tar=invocations.TargetEmptySpot(), mpfudge = 10 ) ELEMENTAL_STORM = Spell( "Elemental Storm", "The wrath of nature is brought to bear on your foes. All targets within a 3 tile radius take 2d4 damage from each of fire, cold, lightning, and acid.", effects.OpposedRoll( on_success = ( effects.HealthDamage( (2,4,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion ), effects.HealthDamage( (2,4,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_COLD, anim=animobs.BlueBoom ), effects.HealthDamage( (2,4,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_LIGHTNING, anim=animobs.BlueZap ), effects.HealthDamage( (2,4,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_ACID, anim=animobs.GreenSplat ) ), on_failure = ( effects.HealthDamage( (2,4,0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion ), effects.HealthDamage( (2,4,0), stat_bonus=None, element=stats.RESIST_COLD, anim=animobs.BlueBoom ), effects.HealthDamage( (2,4,0), stat_bonus=None, element=stats.RESIST_LIGHTNING, anim=animobs.BlueZap ), effects.HealthDamage( (2,4,0), stat_bonus=None, element=stats.RESIST_ACID, anim=animobs.GreenSplat ) ) ), rank=5, gems={FIRE:2,SOLAR:1}, com_tar=targetarea.Blast(radius=3), shot_anim=animobs.CrystalBall, ai_tar=invocations.TargetEnemy(min_distance=4) ) TRANSFORMATION = Spell( "Transformation", "Transforms all allies within six tiles, providing +10% to defense plus 25% resistance to slashing, crushing, and piercing damage.", effects.TargetIsAlly( on_true = ( effects.Enchant( enchantments.WoodSkinEn, anim=animobs.OrangeSparkle ), )), rank=5, gems={EARTH:3,FIRE:1}, com_tar=targetarea.SelfCentered(), ai_tar=invocations.TargetAllyWithoutEnchantment(enchantments.WoodSkinEn) ) # CIRCLE SIX CALL_BEHEMOTH = Spell( "Call Behemoth", "This spell will summon a very powerful monster to fight on your behaf.", effects.CallMonster( {context.MTY_CREATURE: True, context.DES_EARTH: context.MAYBE, context.GEN_NATURE: context.MAYBE, context.DES_SOLAR: context.MAYBE}, 12, anim=animobs.OrangeSparkle ),
(1, 5, 0), stat_bonus=None, element=stats.RESIST_WIND, anim=animobs.Blizzard), ), on_death=(effects.HealthDamage( (1, 5, 0), stat_bonus=None, element=stats.RESIST_WIND, anim=animobs.Blizzard), ), ), )), rank=4, gems={ WATER: 1, AIR: 1 }, com_tar=targetarea.Blast(radius=4, delay_from=1), ai_tar=invocations.TargetEnemy(min_distance=5)) DIVINE_HAMMER = Spell( "Divine Hammer", "This attack does 4d8 holy damage to a single target. Unholy creatures may be stunned.", effects.OpposedRoll( def_stat=stats.REFLEXES, on_success=( effects.HealthDamage((4, 8, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_SOLAR, anim=animobs.RedBoom), effects.TargetIs(pat=effects.UNHOLY, on_true=(effects.Paralyze(max_duration=3), )), ),
# CIRCLE SEVEN FLAMING_SWORD = Spell( "Flaming Sword", "Conjures an animated flaming sword, which will fight for your party until the end of combat.", effects.CallMonster( {context.SUMMON_FLAMINGSWORD: True, context.DES_AIR: context.MAYBE, context.DES_FIRE: context.MAYBE}, 14, anim=animobs.RedSparkle ), rank=7, gems={AIR:2,FIRE:2}, com_tar=targetarea.SingleTarget(reach=5), ai_tar=invocations.TargetEmptySpot(), mpfudge = 16 ) FROSTFIRE = Spell( "Frostfire", "This spell creates a sphere of pure anti-fire, which freezes all targets in a 3 tile radius for 4d12 cold damage. The frostfire may continue to burn until the victim is frozen solid.", effects.OpposedRoll( on_success = ( effects.HealthDamage( (4,12,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_COLD, anim=animobs.SnowCloud ), effects.Enchant( enchantments.FrostBurnEn ) ,), on_failure = ( effects.HealthDamage( (4,8,0), stat_bonus=None, element=stats.RESIST_COLD, anim=animobs.SnowCloud ) ,) ), rank=7, gems={FIRE:2,LUNAR:3}, com_tar=targetarea.Blast(radius=3), shot_anim=animobs.BlueComet, ai_tar=invocations.TargetEnemy(min_distance=4) ) # CIRCLE EIGHT METEOR_STORM = Spell( "Meteor Storm", "This spell calls down flaming rocks from the heavens, doing 10d8 fire damage and setting targets alight in a 4 tile radius.", effects.OpposedRoll( on_success = ( effects.HealthDamage( (10,8,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_FIRE, anim=animobs.MeteorStorm ), effects.Enchant( enchantments.BurnLowEn ) ), on_failure = ( effects.HealthDamage( (3,12,0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.MeteorStorm ), ) ), rank=8, gems={FIRE:2,AIR:2}, com_tar=targetarea.Blast(radius=4), ai_tar=invocations.TargetEnemy(min_distance=5) )
WIZARD_MISSILE = Spell( "Wizard Missile", "This mystic bolt always strikes its target for 1-6 damage.", effects.HealthDamage((1,6,0), stat_bonus=None, element=stats.RESIST_LUNAR, anim=animobs.PurpleExplosion ), rank=1, gems={LUNAR:1}, com_tar=targetarea.SingleTarget(), shot_anim=animobs.WizardMissile, ai_tar=invocations.TargetEnemy(), mpfudge=-1 ) # CIRCLE TWO SLEEP = Spell( "Sleep", "Causes living creatures in a 2 tile radius to fall asleep.", effects.TargetIs( pat=effects.ANIMAL, anim=animobs.PurpleSparkle, on_true = ( effects.OpposedRoll( att_modifier=0, on_success = ( effects.CauseSleep(), )) ,) ), rank=2, gems={LUNAR:2}, com_tar=targetarea.Blast(radius=2), ai_tar=invocations.TargetMobileEnemy(min_distance=3) ) ENERVATE = Spell( "Enervate", "A ray of negative energy strikes one opponent, draining 4-16 mana instantly.", effects.ManaDamage((4,4,0), stat_bonus=stats.INTELLIGENCE, anim=animobs.PurpleExplosion ), rank=2, gems={LUNAR:1}, com_tar=targetarea.SingleTarget(), shot_anim=animobs.PurpleVortex, ai_tar=invocations.TargetEnemy(), mpfudge=-1 ) # CIRCLE 3 WITHER = Spell( "Wither", "Conjures a sphere of negative energy, draining a single target for 2d10 dark damage and 1d6 points of strength.", effects.OpposedRoll( on_success = ( effects.HealthDamage( (2,10,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_LUNAR, anim=animobs.PurpleExplosion ), effects.StatDamage( stats.STRENGTH, amount=6 )