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 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 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 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 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 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))