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 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 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 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 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 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 YoungMoonDragon(base.Monster): name = "Young Moon Dragon" statline = { stats.STRENGTH: 16, stats.TOUGHNESS: 16, stats.REFLEXES: 10, \ stats.INTELLIGENCE: 16, stats.PIETY: 14, stats.CHARISMA: 14, stats.RESIST_COLD: 100, stats.RESIST_ACID: 100, stats.RESIST_LUNAR: 50 } SPRITENAME = "monster_dragons.png" FRAME = 9 TEMPLATES = (stats.DRAGON, ) MOVE_POINTS = 8 VOICE = dialogue.voice.DRACONIAN HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.DES_LUNAR, context.MTY_DRAGON, context.GEN_DRAGON, context.MTY_BOSS) ENC_LEVEL = 7 TREASURE = treasuretype.DragonHoard() ATTACK = items.Attack((2, 8, 0), element=stats.RESIST_SLASHING) TECHNIQUES = ( invocations.MPInvocation("Cold Breath", effects.OpposedRoll( def_stat=stats.TOUGHNESS, on_success=(effects.HealthDamage( (2, 10, 0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_COLD, anim=animobs.SnowCloud), ), on_failure=(effects.HealthDamage( (1, 10, 0), stat_bonus=None, element=stats.RESIST_COLD, anim=animobs.SnowCloud), )), com_tar=targetarea.Cone(reach=5), ai_tar=invocations.TargetEnemy(), mp_cost=12), invocations.MPInvocation("Acid Breath", effects.OpposedRoll( att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage( (3, 8, 0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_ACID, anim=animobs.GreenCloud), ), on_failure=(effects.HealthDamage( (2, 6, 0), stat_bonus=None, element=stats.RESIST_ACID, anim=animobs.GreenCloud), )), com_tar=targetarea.Line(reach=8), ai_tar=invocations.TargetEnemy(), mp_cost=10), ) def init_monster(self): self.levels.append(base.Terror(9, self))
class GreatCaveWyrm(base.Monster): name = "Great Cave Wyrm" statline = { stats.STRENGTH: 27, stats.TOUGHNESS: 21, stats.REFLEXES: 10, \ stats.INTELLIGENCE: 16, stats.PIETY: 17, stats.CHARISMA: 16, stats.PHYSICAL_ATTACK: 20, stats.RESIST_POISON: 100 } SPRITENAME = "monster_dragons.png" FRAME = 42 TEMPLATES = (stats.DRAGON, ) MOVE_POINTS = 10 VOICE = dialogue.voice.DRACONIAN HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.HAB_CAVE, context.MAP_DUNGEON, context.MTY_LEADER, context.MTY_DRAGON, context.MTY_BOSS, context.DES_EARTH, context.GEN_DRAGON) ENC_LEVEL = 20 COMBAT_AI = aibrain.BruiserAI() TREASURE = treasuretype.DragonHoard() LONER = True COMPANIONS = ( OldCaveDragon, AncientCaveDragon, ) ATTACK = items.Attack((7, 8, 0), element=stats.RESIST_SLASHING, extra_effect=abilities.POISON_ATTACK_2d6) TECHNIQUES = (invocations.MPInvocation( "Toxic Breath", effects.OpposedRoll(def_stat=stats.TOUGHNESS, anim=None, on_success=( effects.HealthDamage( (9, 6, 0), stat_bonus=None, element=stats.RESIST_POISON, anim=animobs.PoisonCloud), effects.Paralyze(max_duration=3), effects.Enchant(enchantments.PoisonClassic, anim=animobs.DeathSparkle), ), on_failure=(effects.HealthDamage( (3, 9, 0), stat_bonus=None, element=stats.RESIST_POISON, anim=animobs.PoisonCloud), )), com_tar=targetarea.Cone(reach=8), ai_tar=invocations.TargetEnemy(), mp_cost=38), ) def init_monster(self): self.levels.append(base.Terror(28, self))
class FireWeasel(base.Monster): name = "Fire Weasel" statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 12, stats.REFLEXES: 15, \ stats.INTELLIGENCE: 3, stats.PIETY: 14, stats.CHARISMA: 9 } SPRITENAME = "monster_animals.png" FRAME = 29 TEMPLATES = (stats.FIRE, ) MOVE_POINTS = 10 VOICE = None HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.MAP_WILDERNESS, context.DES_FIRE, context.MTY_BEAST, context.MTY_CREATURE, context.MTY_BOSS, context.GEN_NATURE) ENC_LEVEL = 4 ATTACK = items.Attack((1, 6, 0), element=stats.RESIST_PIERCING, extra_effect=effects.OpposedRoll( att_stat=None, att_modifier=5, on_success=( effects.HealthDamage( (1, 6, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.RedCloud), effects.Enchant(enchantments.BurnLowEn), ))) TECHNIQUES = (invocations.MPInvocation( "Fire Breath", effects.OpposedRoll(att_skill=stats.PHYSICAL_ATTACK, att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage( (1, 6, 0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_FIRE, anim=animobs.RedCloud), ), on_failure=(effects.HealthDamage( (1, 3, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.RedCloud), )), com_tar=targetarea.Cone(reach=4), ai_tar=invocations.TargetEnemy(), mp_cost=3), ) def init_monster(self): self.levels.append(base.Beast(4, self))
class Scarab(base.Monster): name = "Scarab" statline = { stats.STRENGTH: 13, stats.TOUGHNESS: 16, stats.REFLEXES: 14, \ stats.INTELLIGENCE: 1, stats.PIETY: 12, stats.CHARISMA: 1, stats.RESIST_SOLAR: 50 } SPRITENAME = "monster_bugs.png" FRAME = 5 TEMPLATES = (stats.BUG, ) MOVE_POINTS = 8 VOICE = None HABITAT = (context.HAB_TUNNELS, context.HAB_DESERT, context.SET_EVERY, context.DES_SOLAR, context.MTY_BEAST, context.MTY_CREATURE) ENC_LEVEL = 7 TECHNIQUES = (invocations.MPInvocation( "Draining Breath", effects.TargetIsEnemy( on_true=(effects.OpposedRoll( att_skill=stats.PHYSICAL_ATTACK, att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage( (1, 8, 0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_FIRE, anim=animobs.PurpleExplosion), ), on_failure=(effects.HealthDamage( (1, 4, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.PurpleExplosion), )), ), on_false=(effects.NoEffect(anim=animobs.PurpleExplosion), )), com_tar=targetarea.Cone(reach=4), ai_tar=invocations.TargetEnemy(), mp_cost=3), ) ATTACK = items.Attack((1, 6, 0), element=stats.RESIST_PIERCING, extra_effect=abilities.POISON_ATTACK_2d6) def init_monster(self): self.levels.append(base.Beast(7, self))
class DragonTurtle(base.Monster): name = "Dragon Turtle" statline = { stats.STRENGTH: 28, stats.TOUGHNESS: 36, stats.REFLEXES: 10, \ stats.INTELLIGENCE: 6, stats.PIETY: 14, stats.CHARISMA: 6, \ stats.RESIST_WATER: 50 } SPRITENAME = "monster_animals.png" FRAME = 34 TEMPLATES = (stats.REPTILE, stats.DRAGON, stats.WATER) MOVE_POINTS = 6 VOICE = None TREASURE = treasuretype.Swallowed() HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.DES_WATER, context.MTY_BEAST, context.MTY_CREATURE, context.MTY_BOSS, context.GEN_NATURE, context.GEN_DRAGON) ENC_LEVEL = 18 ATTACK = items.Attack((4, 6, 0), element=stats.RESIST_CRUSHING) TECHNIQUES = (invocations.MPInvocation( "Steam Breath", effects.OpposedRoll(att_skill=stats.PHYSICAL_ATTACK, att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage( (10, 10, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.Steam), ), on_failure=(effects.HealthDamage( (2, 20, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.Steam), )), com_tar=targetarea.Cone(reach=8), ai_tar=invocations.TargetEnemy(), mp_cost=15), ) def init_monster(self): self.levels.append(base.Beast(18, self))
class FireGlove(Enhancer): NAMEPAT = "{0} of Fire" DESCPAT = "{0} The user may project an arc of fire from the fingertips." PLUSRANK = 4 AFFECTS = (GLOVE, GAUNTLET) BONUSES_PER_RANK = stats.StatMod({stats.RESIST_FIRE: 15}) TYPE = ET_PRIMARY TECH = (invocations.Invocation("Flamethrower", effects.OpposedRoll( att_skill=stats.PHYSICAL_ATTACK, att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage( (2, 5, 0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_FIRE, anim=animobs.RedCloud), ), on_failure=(effects.HealthDamage( (1, 6, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.RedCloud), )), com_tar=targetarea.Cone(reach=4), ai_tar=invocations.TargetEnemy()), )
class Roc(base.Monster): name = "Roc" statline = { stats.STRENGTH: 35, stats.TOUGHNESS: 24, stats.REFLEXES: 18, \ stats.INTELLIGENCE: 2, stats.PIETY: 13, stats.CHARISMA: 12 } SPRITENAME = "monster_animals.png" FRAME = 30 TEMPLATES = () MOVE_POINTS = 16 VOICE = None TREASURE = treasuretype.Swallowed() HABITAT = (context.HAB_FOREST, context.HAB_DESERT, context.SET_EVERY, context.MAP_WILDERNESS, context.MTY_BEAST, context.MTY_CREATURE, context.GEN_NATURE, context.DES_AIR, context.DES_SOLAR) ENC_LEVEL = 14 ATTACK = items.Attack((3, 8, 0), element=stats.RESIST_PIERCING) TECHNIQUES = (invocations.MPInvocation( "Wing Sweep", effects.OpposedRoll(att_skill=stats.PHYSICAL_ATTACK, att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage( (3, 6, 0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_WIND, anim=animobs.Spiral), ), on_failure=(effects.HealthDamage( (1, 8, 0), stat_bonus=None, element=stats.RESIST_WIND, anim=animobs.Spiral), )), com_tar=targetarea.Cone(reach=4), ai_tar=invocations.TargetEnemy(), mp_cost=10), ) def init_monster(self): self.levels.append(base.Beast(14, self))
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 WaterElemental( base.Monster ): name = "Water Elemental" statline = { stats.STRENGTH: 25, stats.TOUGHNESS: 25, stats.REFLEXES: 20, \ stats.INTELLIGENCE: 12, stats.PIETY: 12, stats.CHARISMA: 12, stats.RESIST_WATER: 100 } SPRITENAME = "monster_e_water.png" FRAME = 0 TEMPLATES = (stats.ELEMENTAL,stats.WATER) MOVE_POINTS = 20 HABITAT = ( context.HAB_EVERY, context.SET_EVERY, context.DES_WATER, context.SUMMON_ELEMENTAL ) ENC_LEVEL = 12 ATTACK = items.Attack( (1,10,0), element = stats.RESIST_CRUSHING, extra_effect = effects.HealthDamage( (1,10,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_WATER, anim=animobs.Spiral ) ) TECHNIQUES = ( invocations.MPInvocation( "Tidal Wave", effects.OpposedRoll( def_stat=stats.REFLEXES, on_success = ( effects.HealthDamage( (3,8,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_WATER, anim=animobs.Bubbles ) ,), on_failure = ( effects.HealthDamage( (1,12,0), stat_bonus=None, element=stats.RESIST_WATER, anim=animobs.Bubbles ) ,) ), mp_cost=10, com_tar=targetarea.Cone(), ai_tar=invocations.TargetEnemy() ), ) def init_monster( self ): self.levels.append( base.Beast( 12, self ) )
effects.HealthDamage( (1,9,1), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_LUNAR, anim=animobs.PurpleExplosion ), effects.StatDamage( stats.STRENGTH, amount=1 ) ,) ), rank=3, gems={LUNAR:2}, com_tar=targetarea.SingleTarget(),ai_tar=invocations.TargetEnemy(),shot_anim=animobs.MysticBolt ) # CIRCLE 4 HELLBLAST = Spell( "Hellblast", "Eldritch flames spew forth to damage targets for 3d6 dark damage. Those touched by the flames will have their energy drained.", effects.OpposedRoll( on_success = ( effects.HealthDamage( (3,6,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_LUNAR, anim=animobs.PurpleExplosion ), effects.ManaDamage((3,6,0), stat_bonus=stats.INTELLIGENCE ), ), on_failure = ( effects.HealthDamage( (1,6,2), stat_bonus=None, element=stats.RESIST_LUNAR, anim=animobs.PurpleExplosion ), effects.ManaDamage((1,8,0), stat_bonus=None ), ) ), rank=4, gems={LUNAR:2}, com_tar=targetarea.Cone(reach=8), ai_tar=invocations.TargetEnemy() ) # CIRCLE 5 DEEP_SLEEP = Spell( "Deep Sleep", "Causes living creatures in a 4 tile radius to fall asleep.", effects.TargetIs( pat=effects.ANIMAL, anim=animobs.PurpleSparkle, on_true = ( effects.OpposedRoll( att_modifier=10, on_success = ( effects.CauseSleep(), )) ,) ), rank=5, gems={LUNAR:2}, com_tar=targetarea.Blast(radius=4), ai_tar=invocations.TargetMobileEnemy(min_distance=5) ) DEATH_RAY = Spell( "Death Ray",
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), )), rank=2, gems={AIR: 2}, com_tar=targetarea.Cone(reach=4), ai_tar=invocations.TargetEnemy(), mpfudge=-1) # CIRCLE THREE THUNDER_STRIKE = Spell( "Thunder Strike", "A bolt of lightning strikes all in its path for 3d6 damage.", effects.OpposedRoll(on_success=(effects.HealthDamage( (3, 6, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_LIGHTNING, anim=animobs.Spark), ), on_failure=(effects.HealthDamage( (1, 8, 0),
import animobs import stats import invocations import context # Mages get AIR, FIRE, and LUNAR magic. These spells use a combination of colors. # CIRCLE ONE FIRE_ARC = Spell( "Fire Arc", "Conjures an arc of intense heat which burns enemies for 1d6 damage. This spell has a short range but can affect several targets.", effects.OpposedRoll( on_success = ( effects.HealthDamage( (1,6,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion ) ,), on_failure = ( effects.HealthDamage( (1,2,0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion ) ,) ), rank=1, gems={FIRE:1,LUNAR:1}, com_tar=targetarea.Cone(reach=3), ai_tar=invocations.TargetEnemy() ) SHOCK_SPHERE = Spell( "Shock Sphere", "An electrical burst will deal 1-6 points of damage to all enemies within two tiles of the caster.", effects.TargetIsEnemy( on_true = ( effects.OpposedRoll( on_success = ( effects.HealthDamage( (1,6,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_LIGHTNING, anim=animobs.BlueZap ) ,), on_failure = ( effects.HealthDamage( (1,3,0), stat_bonus=None, element=stats.RESIST_LIGHTNING, anim=animobs.BlueZap ) ,) ) ,) ), rank=1, gems={AIR:1,LUNAR:1}, com_tar=targetarea.SelfCentered(radius=2,exclude_middle=True), ai_tar=invocations.TargetEnemy() ) # CIRCLE TWO LIGHTNING_BOLT = Spell( "Lightning Bolt", "This spell conjures magical lightning, which will unerringly hit one foe for 2d8 damage.",
HEAT_WAVE = Spell( "Heat Wave", "A rapidly expanding wall of heat is projected from your hands. Anyone standing in its way takes 6d6 points of fire damage.", effects.OpposedRoll(on_success=(effects.HealthDamage( (6, 6, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_FIRE, anim=animobs.DragonFire), ), on_failure=(effects.HealthDamage( (3, 6, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.DragonFire), )), rank=5, gems={FIRE: 3}, com_tar=targetarea.Cone(), ai_tar=invocations.TargetEnemy()) # CIRCLE 6 CALL_FIRE_ELEMENTAL = Spell( "Call Fire Elemental", "This spell will call forth a living vortex of fire to serve you for the duration of combat.", effects.CallMonster( { context.DES_FIRE: True, context.SUMMON_ELEMENTAL: True }, 12, anim=animobs.RedSparkle), rank=6,
import stats import context import invocations # Druids get EARTH, FIRE, and SOLAR magic. These spells use a combination of # those colors. # CIRCLE ONE ACID_SPRAY = Spell( "Acid Spray", "A stream of acid sprays forth, burning enemies for 1d6 damage. This spell has a short range but can affect several targets.", effects.OpposedRoll( on_success = ( effects.HealthDamage( (1,6,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_ACID, anim=animobs.GreenExplosion ) ,), on_failure = ( effects.HealthDamage( (1,2,0), stat_bonus=None, element=stats.RESIST_ACID, anim=animobs.GreenExplosion ) ,) ), rank=1, gems={FIRE:1,EARTH:1}, com_tar=targetarea.Cone(reach=3), ai_tar=invocations.TargetEnemy() ) # CIRCLE TWO CALL_ANIMAL = Spell( "Call Animal", "This spell will summon a natural creature 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}, 4, anim=animobs.OrangeSparkle ), rank=2, gems={EARTH:1,SOLAR:1}, com_tar=targetarea.SingleTarget(reach=2), ai_tar=invocations.TargetEmptySpot(), mpfudge = 4 ) # CIRCLE THREE CALL_CREATURE = Spell( "Call Creature", "This spell will summon a large natural creature 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}, 6, anim=animobs.OrangeSparkle ), rank=3, gems={EARTH:2,SOLAR:1}, com_tar=targetarea.SingleTarget(reach=2), ai_tar=invocations.TargetEmptySpot(), mpfudge = 6 )