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 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 Avoral(base.Monster): name = "Avoral" statline = { stats.STRENGTH: 15, stats.TOUGHNESS: 20, stats.REFLEXES: 23, \ stats.INTELLIGENCE: 15, stats.PIETY: 16, stats.CHARISMA: 16, \ stats.AWARENESS: 65, stats.MAGIC_DEFENSE: 25 } SPRITENAME = "monster_celestial.png" FRAME = 12 TEMPLATES = (stats.CELESTIAL, stats.AIR) MOVE_POINTS = 16 HABITAT = (context.SET_EVERY, context.DES_SOLAR, context.DES_AIR, context.MTY_HUMANOID, context.MTY_CELESTIAL) ENC_LEVEL = 12 COMBAT_AI = aibrain.ArcherAI() TREASURE = treasuretype.Standard() TECHNIQUES = (invocations.Invocation("Avoral Missile", effects.HealthDamage( (1, 8, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_LUNAR, anim=animobs.PurpleExplosion), com_tar=targetarea.SingleTarget(), shot_anim=animobs.WizardMissile, ai_tar=invocations.TargetEnemy()), invocations.Invocation( "Hold Person", effects.OpposedRoll( att_modifier=20, on_success=(effects.Paralyze(max_duration=3), ), on_failure=(effects.NoEffect( anim=animobs.SmallBoom), )), com_tar=targetarea.SingleTarget(), shot_anim=animobs.BlueComet, ai_tar=invocations.TargetMobileEnemy()), invocations.MPInvocation( "Thunder Strike", 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), stat_bonus=None, element=stats.RESIST_LIGHTNING, anim=animobs.Spark), )), mp_cost=16, com_tar=targetarea.Line(), ai_tar=invocations.TargetEnemy())) ATTACK = items.Attack((2, 8, 0), element=stats.RESIST_SLASHING) def init_monster(self): self.levels.append(base.Terror(7, self))
class Ankheg(base.Monster): # OGL monster http://www.d20srd.org/srd/monsters/ankheg.htm name = "Ankheg" statline = { stats.STRENGTH: 21, stats.TOUGHNESS: 17, stats.REFLEXES: 10, \ stats.INTELLIGENCE: 1, stats.PIETY: 13, stats.CHARISMA: 6, stats.STEALTH: 30 } SPRITENAME = "monster_bugs.png" FRAME = 40 TEMPLATES = (stats.BUG, ) MOVE_POINTS = 10 VOICE = None TREASURE = treasuretype.Swallowed(swag_chance=35) HABITAT = (context.HAB_CAVE, context.HAB_TUNNELS, context.SET_EVERY, context.DES_EARTH, context.MTY_BOSS, context.MTY_BEAST, context.MTY_CREATURE, context.GEN_NATURE) ENC_LEVEL = 5 ATTACK = items.Attack((2, 6, 3), element=stats.RESIST_SLASHING, extra_effect=effects.HealthDamage( (1, 6, 0), stat_bonus=None, element=stats.RESIST_ACID, anim=animobs.GreenExplosion)) TECHNIQUES = (invocations.MPInvocation( "Acid Breath", effects.OpposedRoll(att_skill=stats.PHYSICAL_ATTACK, att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage( (4, 4, 0), stat_bonus=None, element=stats.RESIST_ACID, anim=animobs.GreenExplosion), ), on_failure=(effects.HealthDamage( (1, 8, 0), stat_bonus=None, element=stats.RESIST_ACID, anim=animobs.GreenExplosion), )), com_tar=targetarea.Line(reach=5), ai_tar=invocations.TargetEnemy(), mp_cost=10), ) def init_monster(self): self.levels.append(base.Defender(2, self)) self.levels.append(base.Beast(2, self))
class AncientSkyDragon(base.Monster): name = "Ancient Sky Dragon" statline = { stats.STRENGTH: 27, stats.TOUGHNESS: 21, stats.REFLEXES: 10, \ stats.INTELLIGENCE: 18, stats.PIETY: 19, stats.CHARISMA: 18, stats.RESIST_LIGHTNING: 100 } SPRITENAME = "monster_dragons.png" FRAME = 38 TEMPLATES = (stats.DRAGON, ) MOVE_POINTS = 10 VOICE = dialogue.voice.DRACONIAN HABITAT = (context.HAB_EVERY, context.HAB_DESERT, context.SET_EVERY, context.MAP_WILDERNESS, context.MTY_BOSS, context.MTY_DRAGON, context.DES_AIR, context.GEN_DRAGON) ENC_LEVEL = 17 COMBAT_AI = aibrain.ArcherAI(approach_allies=0) TREASURE = treasuretype.DragonHoard() LONER = True COMPANIONS = (YoungSkyDragon, ) ATTACK = items.Attack((4, 8, 0), element=stats.RESIST_SLASHING) TECHNIQUES = (invocations.MPInvocation( "Lightning Breath", effects.OpposedRoll(att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage( (14, 4, 0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_LIGHTNING, anim=animobs.Spark), ), on_failure=(effects.HealthDamage( (7, 4, 0), stat_bonus=None, element=stats.RESIST_LIGHTNING, anim=animobs.Spark), )), com_tar=targetarea.Line(reach=9), ai_tar=invocations.TargetEnemy(), mp_cost=32), ) def init_monster(self): self.levels.append(base.Terror(23, self))
class FireScorpion(base.Monster): name = "Fire Scorpion" statline = { stats.STRENGTH: 19, stats.TOUGHNESS: 13, stats.REFLEXES: 18, \ stats.INTELLIGENCE: 4, stats.PIETY: 12, stats.CHARISMA: 1 } SPRITENAME = "monster_bugs.png" FRAME = 16 TEMPLATES = (stats.BUG, stats.FIRE) MOVE_POINTS = 10 VOICE = None HABITAT = (context.HAB_CAVE, context.HAB_DESERT, context.SET_EVERY, context.DES_FIRE, context.MTY_BEAST, context.MTY_BOSS, context.MTY_CREATURE, context.GEN_NATURE) ENC_LEVEL = 8 TECHNIQUES = (invocations.MPInvocation( "Flamethrower", effects.OpposedRoll(att_stat=stats.REFLEXES, on_success=( effects.HealthDamage( (2, 6, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_FIRE, anim=animobs.Ignite), effects.Enchant(enchantments.BurnLowEn), ), on_failure=(effects.HealthDamage( (2, 6, 0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_FIRE, anim=animobs.Ignite), )), com_tar=targetarea.Line(reach=6), ai_tar=invocations.TargetEnemy(), mp_cost=12), ) ATTACK = items.Attack((2, 8, 0), element=stats.RESIST_PIERCING, extra_effect=abilities.POISON_ATTACK_1d8) def init_monster(self): self.levels.append(base.Beast(8, self))
class LightningBug(base.Monster): name = "Lightning Bug" statline = { stats.STRENGTH: 10, stats.TOUGHNESS: 13, stats.REFLEXES: 12, \ stats.INTELLIGENCE: 1, stats.PIETY: 12, stats.CHARISMA: 1, \ stats.RESIST_LIGHTNING: 150 } SPRITENAME = "monster_bugs.png" FRAME = 13 TEMPLATES = (stats.BUG, ) MOVE_POINTS = 14 VOICE = None HABITAT = (context.HAB_FOREST, context.HAB_CAVE, context.SET_EVERY, context.DES_AIR, context.MTY_BEAST, context.MTY_CREATURE, context.GEN_NATURE) ENC_LEVEL = 5 ATTACK = items.Attack((1, 6, 0), element=stats.RESIST_PIERCING) TECHNIQUES = (invocations.MPInvocation( "Zap", effects.OpposedRoll(att_skill=stats.PHYSICAL_ATTACK, att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage( (2, 6, 0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_LIGHTNING, anim=animobs.Spark), ), on_failure=(effects.HealthDamage( (1, 6, 0), stat_bonus=None, element=stats.RESIST_LIGHTNING, anim=animobs.Spark), )), com_tar=targetarea.Line(reach=6), ai_tar=invocations.TargetEnemy(), mp_cost=5), ) def init_monster(self): self.levels.append(base.Beast(4, self))
class AncientSwampDragon(base.Monster): name = "Ancient Swamp Dragon" statline = { stats.STRENGTH: 29, stats.TOUGHNESS: 21, stats.REFLEXES: 10, \ stats.INTELLIGENCE: 12, stats.PIETY: 13, stats.CHARISMA: 12, stats.RESIST_ACID: 100 } SPRITENAME = "monster_dragons.png" FRAME = 30 TEMPLATES = (stats.DRAGON, ) MOVE_POINTS = 10 VOICE = dialogue.voice.DRACONIAN HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.MTY_LEADER, context.MTY_DRAGON, context.MTY_BOSS, context.DES_EARTH, context.DES_WATER, context.GEN_DRAGON) ENC_LEVEL = 16 TREASURE = treasuretype.DragonHoard() LONER = True COMPANIONS = (OldSwampDragon, ) ATTACK = items.Attack((3, 12, 0), element=stats.RESIST_SLASHING) TECHNIQUES = (invocations.MPInvocation( "Acid Breath", effects.OpposedRoll(att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage( (8, 6, 0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_ACID, anim=animobs.GreenExplosion), ), on_failure=(effects.HealthDamage( (4, 6, 0), stat_bonus=None, element=stats.RESIST_ACID, anim=animobs.GreenExplosion), )), com_tar=targetarea.Line(reach=10), ai_tar=invocations.TargetEnemy(), mp_cost=20), ) def init_monster(self): self.levels.append(base.Terror(24, self))
class LivingStatue(base.Monster): name = "Living Statue" statline = { stats.STRENGTH: 14, stats.TOUGHNESS: 13, stats.REFLEXES: 10, \ stats.INTELLIGENCE: 10, stats.PIETY: 10, stats.CHARISMA: 1, \ stats.RESIST_FIRE: 155 } SPRITENAME = "monster_constructs.png" FRAME = 13 TEMPLATES = (stats.CONSTRUCT, ) MOVE_POINTS = 10 VOICE = None HABITAT = (context.HAB_BUILDING, context.HAB_TUNNELS, context.SET_EVERY, context.MTY_CONSTRUCT, context.DES_FIRE, context.DES_SOLAR) ENC_LEVEL = 8 TREASURE = treasuretype.Low() COMBAT_AI = aibrain.SteadyAI() ATTACK = items.Attack((1, 6, 0), element=stats.RESIST_SLASHING) TECHNIQUES = (invocations.MPInvocation( "Magma Blast", effects.OpposedRoll(att_modifier=10, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage( (2, 8, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion), ), on_failure=(effects.HealthDamage( (1, 6, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion), )), com_tar=targetarea.Line(), ai_tar=invocations.TargetEnemy(), mp_cost=1), ) def init_monster(self): self.levels.append(base.Defender(7, self))
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), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.Ignite), )), rank=4, gems={FIRE: 3}, com_tar=targetarea.Line(), ai_tar=invocations.TargetEnemy()) # CIRCLE 5 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,