class Spark(base.Monster): name = "Spark" statline = { stats.STRENGTH: 13, stats.TOUGHNESS: 8, stats.REFLEXES: 14, \ stats.INTELLIGENCE: 12, stats.PIETY: 6, stats.CHARISMA: 14, stats.RESIST_PIERCING: 50, stats.RESIST_CRUSHING: 50, stats.RESIST_SLASHING: 50 } SPRITENAME = "monster_by_Joe.png" FRAME = 4 TEMPLATES = (stats.ELEMENTAL, stats.FIRE) MOVE_POINTS = 12 HABITAT = (context.HAB_BUILDING, context.SET_EVERY, context.GEN_IGNAN, context.DES_FIRE, context.DES_SOLAR, context.MTY_ELEMENTAL, context.MTY_CELESTIAL) ENC_LEVEL = 3 COMBAT_AI = aibrain.ArcherAI(approach_allies=0, technique_chance=75) ATTACK = items.Attack((1, 6, 0), element=stats.RESIST_SOLAR, hit_anim=animobs.OrangeExplosion, extra_effect=abilities.BURN_ATTACK) TECHNIQUES = (invocations.Invocation( "Fire Bolt", effects.OpposedRoll( att_modifier=10, att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success=(effects.HealthDamage((1, 6, 0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion), ), on_failure=(effects.NoEffect(anim=animobs.SmallBoom), )), com_tar=targetarea.SingleTarget(reach=5), shot_anim=animobs.FireBolt, ai_tar=invocations.TargetEnemy()), ) def init_monster(self): self.levels.append(base.Spellcaster(3, 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 Centaur(base.Monster): name = "Centaur" statline = { stats.STRENGTH: 13, stats.TOUGHNESS: 13, stats.REFLEXES: 12, \ stats.INTELLIGENCE: 10, stats.PIETY: 10, stats.CHARISMA: 12 } SPRITENAME = "monster_chaos.png" FRAME = 19 TEMPLATES = () MOVE_POINTS = 12 VOICE = dialogue.voice.GREEK HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.MAP_WILDERNESS, context.DES_SOLAR, context.MTY_HUMANOID, context.MTY_FIGHTER, context.GEN_CHAOS) ENC_LEVEL = 3 COMBAT_AI = aibrain.ArcherAI() TREASURE = treasuretype.Standard() ATTACK = items.Attack((1, 6, 0), element=stats.RESIST_SLASHING) TECHNIQUES = (abilities.SHORTBOW, ) def init_monster(self): self.levels.append(base.Humanoid(2, self))
class Manticore( base.Monster ): name = "Manticore" statline = { stats.STRENGTH: 20, stats.TOUGHNESS: 19, stats.REFLEXES: 15, \ stats.INTELLIGENCE: 7, stats.PIETY: 12, stats.CHARISMA: 9 } SPRITENAME = "monster_default.png" FRAME = 26 TEMPLATES = () MOVE_POINTS = 12 HABITAT = ( context.HAB_EVERY, context.SET_EVERY, context.MAP_WILDERNESS, context.MTY_BEAST, context.MTY_BOSS ) ENC_LEVEL = 7 COMBAT_AI = aibrain.ArcherAI() TREASURE = treasuretype.Standard() ATTACK = items.Attack( (2,4,0), element = stats.RESIST_PIERCING, extra_effect=abilities.POISON_ATTACK ) TECHNIQUES = (invocations.MPInvocation( "Tail Spikes", effects.NoEffect( children=( effects.PhysicalAttackRoll( att_stat=stats.REFLEXES, att_modifier=5, on_success = ( effects.HealthDamage( (1,8,0), stat_bonus=stats.STRENGTH, element=stats.RESIST_PIERCING, anim=animobs.RedBoom ), ), on_failure = ( effects.NoEffect( anim=animobs.SmallBoom ), )), effects.PhysicalAttackRoll( att_stat=stats.REFLEXES, att_modifier=5, on_success = ( effects.HealthDamage( (1,8,0), stat_bonus=stats.STRENGTH, element=stats.RESIST_PIERCING, anim=animobs.RedBoom ), ), on_failure = ( effects.NoEffect( anim=animobs.SmallBoom ), ) ), effects.PhysicalAttackRoll( att_stat=stats.REFLEXES, att_modifier=5, on_success = ( effects.HealthDamage( (1,8,0), stat_bonus=stats.STRENGTH, element=stats.RESIST_PIERCING, anim=animobs.RedBoom ), ), on_failure = ( effects.NoEffect( anim=animobs.SmallBoom ), ) ), effects.PhysicalAttackRoll( att_stat=stats.REFLEXES, att_modifier=5, on_success = ( effects.HealthDamage( (1,8,0), stat_bonus=stats.STRENGTH, element=stats.RESIST_PIERCING, anim=animobs.RedBoom ), ), on_failure = ( effects.NoEffect( anim=animobs.SmallBoom ), ) ), ),), mp_cost=10, com_tar=targetarea.SingleTarget(reach=9), shot_anim=animobs.GoldStone, ai_tar=invocations.TargetEnemy() ), ) def init_monster( self ): self.levels.append( base.Beast( 6, 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 ChaosMage(base.Monster): name = "Chaos Mage" statline = { stats.STRENGTH: 10, stats.TOUGHNESS: 14, stats.REFLEXES: 12, \ stats.INTELLIGENCE: 14, stats.PIETY: 14, stats.CHARISMA: 12 } SPRITENAME = "monster_chaos.png" FRAME = 15 TEMPLATES = () MOVE_POINTS = 10 HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.MTY_HUMANOID, context.MTY_MAGE, context.GEN_CHAOS) ENC_LEVEL = 4 TREASURE = treasuretype.Standard( (items.scrolls.Rank1Scroll, items.scrolls.Rank2Scroll)) COMBAT_AI = aibrain.ArcherAI() COMPANIONS = (animals.MadDog, ) ATTACK = items.Attack((1, 4, 0), element=stats.RESIST_PIERCING) TECHNIQUES = (spells.otherspells.CHAOS_BOLT, spells.lunarspells.WIZARD_MISSILE, spells.otherspells.CHAOTIC_AID) def init_monster(self): self.levels.append(base.Spellcaster(5, self))
class Medusa( base.Monster ): name = "Medusa" statline = { stats.STRENGTH: 10, stats.TOUGHNESS: 12, stats.REFLEXES: 15, \ stats.INTELLIGENCE: 12, stats.PIETY: 13, stats.CHARISMA: 15 } SPRITENAME = "monster_default.png" FRAME = 30 TEMPLATES = () MOVE_POINTS = 10 VOICE = dialogue.voice.GREEK HABITAT = ( context.HAB_EVERY, context.SET_EVERY, context.MTY_HUMANOID ) ENC_LEVEL = 9 COMBAT_AI = aibrain.ArcherAI(approach_allies=0,technique_chance=75) ATTACK = items.Attack( (1,6,0), element = stats.RESIST_PIERCING, extra_effect=abilities.POISON_ATTACK_2d6 ) TECHNIQUES = ( invocations.MPInvocation( "Death Gaze", effects.OpposedRoll( att_stat=stats.PIETY, att_modifier=-10, on_success = ( effects.InstaKill( anim=animobs.CriticalHit ) ,), on_failure = ( effects.NoEffect( anim=animobs.SmallBoom ) ,) ), com_tar=targetarea.SingleTarget(reach=6), shot_anim=animobs.PurpleVortex, ai_tar=invocations.TargetEnemy(), mp_cost=9 ), abilities.LONGBOW ) def init_monster( self ): self.levels.append( base.Humanoid( 6, self ) )
class CentaurChampion(base.Monster): name = "Centaur Champion" statline = { stats.STRENGTH: 17, stats.TOUGHNESS: 17, stats.REFLEXES: 15, \ stats.INTELLIGENCE: 13, stats.PIETY: 15, stats.CHARISMA: 13, \ stats.NATURAL_DEFENSE: 10 } SPRITENAME = "monster_chaos.png" FRAME = 9 TEMPLATES = () MOVE_POINTS = 10 VOICE = dialogue.voice.GREEK HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.MAP_WILDERNESS, context.DES_SOLAR, context.MTY_HUMANOID, context.MTY_FIGHTER, context.MTY_LEADER, context.MTY_BOSS, context.GEN_CHAOS) ENC_LEVEL = 9 COMBAT_AI = aibrain.ArcherAI() TREASURE = treasuretype.Standard((items.ARROW, items.POLEARM)) COMPANIONS = (CentaurKnight, CentaurWarrior) ATTACK = items.Attack((2, 6, 0), element=stats.RESIST_SLASHING, extra_effect=abilities.POISON_ATTACK) TECHNIQUES = (abilities.COMPOSITEBOW, ) def init_monster(self): self.levels.append(base.Leader(12, self))
class CentaurHero(base.Monster): name = "Centaur Hero" statline = { stats.STRENGTH: 18, stats.TOUGHNESS: 18, stats.REFLEXES: 16, \ stats.INTELLIGENCE: 13, stats.PIETY: 15, stats.CHARISMA: 13 } SPRITENAME = "monster_chaos.png" FRAME = 23 TEMPLATES = () MOVE_POINTS = 10 VOICE = dialogue.voice.GREEK HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.MAP_WILDERNESS, context.DES_SOLAR, context.MTY_HUMANOID, context.MTY_FIGHTER, context.MTY_LEADER, context.MTY_BOSS, context.GEN_CHAOS) ENC_LEVEL = 11 TREASURE = treasuretype.Standard((items.ARROW, items.POLEARM, items.BOW)) COMBAT_AI = aibrain.ArcherAI() LONER = True COMPANIONS = (CentaurKnight, CentaurChampion) ATTACK = items.Attack((2, 6, 0), element=stats.RESIST_SLASHING, extra_effect=effects.OpposedRoll( att_stat=None, def_stat=stats.TOUGHNESS, on_success=( effects.HealthDamage( (1, 6, 0), stat_bonus=None, element=stats.RESIST_POISON, anim=animobs.PoisonCloud), effects.Enchant(enchantments.PoisonClassic), ))) TECHNIQUES = (invocations.Invocation( "Arrow 23", effects.PhysicalAttackRoll( att_stat=stats.REFLEXES, on_success=( effects.HealthDamage((2, 8, 0), stat_bonus=stats.STRENGTH, element=stats.RESIST_PIERCING, anim=animobs.RedBoom), 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), )), ), on_failure=(effects.HealthDamage((1, 8, 0), stat_bonus=None, element=stats.RESIST_PIERCING, anim=animobs.RedBoom), )), com_tar=targetarea.SingleTarget(reach=9), shot_anim=animobs.Arrow, ai_tar=invocations.TargetEnemy()), spells.solarspells.MAJOR_CURE, spells.solarspells.CURE_POISON) def init_monster(self): self.levels.append(base.Leader(15, self))