class ReptalDruid(base.Monster):
    name = "Reptal Druid"
    statline = { stats.STRENGTH: 17, stats.TOUGHNESS: 15, stats.REFLEXES: 12, \
        stats.INTELLIGENCE: 13, stats.PIETY: 13, stats.CHARISMA: 9 }
    SPRITENAME = "monster_draconic.png"
    FRAME = 6
    TEMPLATES = (stats.REPTILE, )
    MOVE_POINTS = 10
    VOICE = dialogue.voice.DRACONIAN
    HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.DES_WATER,
               context.MTY_HUMANOID, context.MTY_MAGE, context.MTY_PRIEST,
               context.GEN_DRAGON, context.GEN_NATURE)
    ENC_LEVEL = 5
    TECHNIQUES = (spells.solarspells.MODERATE_CURE, spells.firespells.IGNITE,
                  spells.earthspells.ACID_BOLT, spells.firespells.EXPLOSION,
                  spells.waterspells.REGENERATION)
    ATTACK = items.Attack((1, 8, 0), element=stats.RESIST_SLASHING)
    TREASURE = treasuretype.HighItems(
        (items.scrolls.Rank2Scroll, items.scrolls.Rank3Scroll,
         items.potions.PotionOfStrength))
    COMPANIONS = (ReptalWarrior, ReptalArcher)
    LONER = True

    def init_monster(self):
        self.levels.append(base.Humanoid(4, self))
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 OgreMage(base.Monster):
    name = "Ogre Mage"
    statline = { stats.STRENGTH: 18, stats.TOUGHNESS: 18, stats.REFLEXES: 12, \
        stats.INTELLIGENCE: 14, stats.PIETY: 14, stats.CHARISMA: 10, \
        stats.RESIST_COLD: 100 }
    SPRITENAME = "monster_giants.png"
    FRAME = 17
    TEMPLATES = ()
    MOVE_POINTS = 10
    HABITAT = (context.HAB_EVERY, context.HAB_FOREST, context.SET_EVERY,
               context.SET_RENFAN, context.DES_WATER, context.DES_AIR,
               context.DES_FIRE, context.MTY_HUMANOID, context.MTY_MAGE,
               context.MTY_BOSS, context.GEN_GIANT)
    ENC_LEVEL = 10
    TREASURE = treasuretype.HighItems(
        (items.scrolls.Rank4Scroll, items.scrolls.Rank5Scroll))
    LONER = True
    COMPANIONS = (Ogre, OgreChamp, OgreShaman, OgreLeader, Ettin)
    ATTACK = items.Attack((4, 6, 0), element=stats.RESIST_CRUSHING)
    TECHNIQUES = (spells.priestspells.BLIZZARD,
                  spells.solarspells.MODERATE_CURE,
                  spells.magespells.INCINERATE,
                  spells.airspells.THUNDER_STRIKE)

    def init_monster(self):
        self.levels.append(base.Terror(5, self))
        self.levels.append(base.Spellcaster(5, self))
class CloudGiant(base.Monster):
    name = "Cloud Giant"
    statline = { stats.STRENGTH: 31, stats.TOUGHNESS: 21, stats.REFLEXES: 9, \
        stats.INTELLIGENCE: 10, stats.PIETY: 14, stats.CHARISMA: 11 }
    SPRITENAME = "monster_giants.png"
    FRAME = 11
    TEMPLATES = (stats.FIRE, )
    MOVE_POINTS = 14
    HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.DES_FIRE,
               context.MTY_HUMANOID, context.MTY_FIGHTER, context.GEN_GIANT)
    ENC_LEVEL = 13
    TREASURE = treasuretype.HighItems()
    ATTACK = items.Attack((4, 6, 0), element=stats.RESIST_CRUSHING)
    TECHNIQUES = (invocations.Invocation(
        "Rock",
        effects.PhysicalAttackRoll(
            att_stat=stats.REFLEXES,
            on_success=(effects.HealthDamage((2, 8, 0),
                                             stat_bonus=stats.STRENGTH,
                                             element=stats.RESIST_CRUSHING,
                                             anim=animobs.RedBoom), ),
            on_failure=(effects.NoEffect(anim=animobs.SmallBoom), )),
        com_tar=targetarea.SingleTarget(reach=10),
        shot_anim=animobs.SlingStone,
        ai_tar=invocations.TargetEnemy()), )

    def init_monster(self):
        self.levels.append(base.Humanoid(15, self))
class SkeletonMage(base.Monster):
    name = "Skeleton Mage"
    statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 14, stats.REFLEXES: 14, \
        stats.INTELLIGENCE: 16, stats.PIETY: 14, stats.CHARISMA: 10 }
    SPRITENAME = "monster_skeletons.png"
    FRAME = 15
    TEMPLATES = (stats.UNDEAD, stats.BONE)
    MOVE_POINTS = 10
    VOICE = None
    HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.SET_RENFAN,
               context.MTY_UNDEAD, context.MTY_HUMANOID, context.MTY_MAGE,
               context.MTY_BOSS, context.DES_EARTH, context.GEN_UNDEAD)
    ENC_LEVEL = 5
    TREASURE = treasuretype.HighItems(
        (items.scrolls.Rank2Scroll, items.scrolls.Rank3Scroll))
    COMPANIONS = (SkeletonFighter, SkeletonGuard)
    LONER = True
    TECHNIQUES = (spells.necrospells.ACID_CLOUD,
                  spells.waterspells.WINTER_WIND, spells.firespells.EXPLOSION,
                  spells.airspells.THUNDER_STRIKE)
    COMBAT_AI = aibrain.SteadySpellAI()
    ATTACK = items.Attack((1, 8, 2), element=stats.RESIST_CRUSHING)

    def init_monster(self):
        self.levels.append(base.Spellcaster(4, self))
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 Planetar(base.Monster):
    name = "Planetar"
    statline = { stats.STRENGTH: 25, stats.TOUGHNESS: 20, stats.REFLEXES: 19, \
        stats.INTELLIGENCE: 22, stats.PIETY: 23, stats.CHARISMA: 22,
        stats.MAGIC_DEFENSE: 50, stats.RESIST_CRUSHING: 75, stats.RESIST_PIERCING: 75,
        stats.RESIST_SLASHING: 75 }
    SPRITENAME = "monster_celestial.png"
    FRAME = 4
    TEMPLATES = (stats.CELESTIAL, )
    MOVE_POINTS = 12
    HABITAT = (context.SET_EVERY, context.DES_SOLAR, context.MTY_CELESTIAL)
    ENC_LEVEL = 18
    TREASURE = treasuretype.HighItems((None, items.POTION, items.SCROLL))
    ATTACK = items.Attack((3, 6, 0),
                          element=stats.RESIST_SLASHING,
                          extra_effect=effects.HealthDamage(
                              (1, 10, 0),
                              stat_bonus=stats.INTELLIGENCE,
                              element=stats.RESIST_SOLAR,
                              anim=animobs.YellowExplosion))
    # Planetars are supposed to get a whole lot more abilities; fill in later.
    TECHNIQUES = (
        spells.solarspells.RENEWAL,
        spells.solarspells.SUNBURST,
    )

    def init_monster(self):
        self.levels.append(base.Terror(16, self))
        self.condition.append(enchantments.PermaMegaRegeneration())
class Necromancer( base.Monster ):
    name = "Necromancer"
    statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 12, stats.REFLEXES: 13, \
        stats.INTELLIGENCE: 15, stats.PIETY: 13, stats.CHARISMA: 12 }
    SPRITENAME = "monster_spellcasters.png"
    FRAME = 23
    TEMPLATES = ()
    MOVE_POINTS = 10
    HABITAT = ( context.HAB_EVERY, context.HAB_BUILDING, context.SET_EVERY,
     context.DES_CIVILIZED, context.DES_LUNAR,
     context.MTY_HUMANOID, context.MTY_MAGE, context.GEN_UNDEAD )
    ENC_LEVEL = 5
    TREASURE = treasuretype.HighItems( ( items.scrolls.Rank2Scroll, items.scrolls.Rank3Scroll ) )
    COMBAT_AI = aibrain.BasicTechnicalAI()
    COMPANIONS = (undead.Ghoul,undead.SkeletonWithMorningstar)
    ATTACK = items.Attack( (1,6,0), element = stats.RESIST_CRUSHING )
    TECHNIQUES = ( spells.lunarspells.ENERVATE, spells.necrospells.ACID_CLOUD,
        spells.necrospells.TOUCH_OF_DEATH, spells.necrospells.RAISE_CORPSE )
    def init_monster( self ):
        self.levels.append( base.Spellcaster( 5, self ) )
class HoundArchon( base.Monster ):
    name = "Hound Archon"
    statline = { stats.STRENGTH: 23, stats.TOUGHNESS: 17, stats.REFLEXES: 8, \
        stats.INTELLIGENCE: 10, stats.PIETY: 13, stats.CHARISMA: 12, \
        stats.AWARENESS: 25, stats.CRITICAL_HIT: 20 }
    SPRITENAME = "monster_celestial.png"
    FRAME = 0
    TEMPLATES = (stats.CELESTIAL,)
    MOVE_POINTS = 16
    HABITAT = ( context.SET_EVERY,
     context.DES_SOLAR,
     context.MTY_HUMANOID, context.MTY_CELESTIAL )
    ENC_LEVEL = 12
    TREASURE = treasuretype.HighItems( ( None, items.POTION, items.SWORD ) )
    TECHNIQUES = ( spells.priestspells.HEROISM, )
    ATTACK = items.Attack( (2,6,0), element = stats.RESIST_SLASHING, extra_effect =
        effects.HealthDamage( (1,4,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_SOLAR, anim=animobs.YellowExplosion )
    )
    def init_monster( self ):
        self.levels.append( base.Humanoid( 14, self ) )
class Priest( base.Monster ):
    name = "Priest"
    statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 14, stats.REFLEXES: 10, \
        stats.INTELLIGENCE: 13, stats.PIETY: 16, stats.CHARISMA: 12 }
    SPRITENAME = "monster_spellcasters.png"
    FRAME = 2
    TEMPLATES = ()
    MOVE_POINTS = 10
    HABITAT = ( context.HAB_EVERY, context.HAB_BUILDING, context.SET_EVERY,
     context.DES_CIVILIZED, context.DES_SOLAR, context.MTY_LEADER,
     context.MTY_HUMANOID, context.MTY_PRIEST, context.GEN_KINGDOM )
    ENC_LEVEL = 6
    TREASURE = treasuretype.HighItems( ( items.scrolls.Rank2Scroll, items.scrolls.Rank3Scroll, items.POTION ) )
    COMBAT_AI = aibrain.BasicTechnicalAI()
    COMPANIONS = (NoviceWarrior,NovicePriest,Warrior)
    ATTACK = items.Attack( (1,8,0), element = stats.RESIST_CRUSHING )
    TECHNIQUES = ( spells.waterspells.FREEZE_FOE, spells.priestspells.HEALING_LIGHT,
        spells.solarspells.SUNRAY, spells.airspells.SILENCE,
        spells.priestspells.HEROISM, spells.priestspells.ARMOR_OF_FAITH )
    def init_monster( self ):
        self.levels.append( base.Humanoid( 6, self ) )
class Conjuoror( base.Monster ):
    name = "Conjuoror"
    statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 12, stats.REFLEXES: 13, \
        stats.INTELLIGENCE: 16, stats.PIETY: 14, stats.CHARISMA: 12 }
    SPRITENAME = "monster_spellcasters.png"
    FRAME = 10
    TEMPLATES = ()
    MOVE_POINTS = 10
    HABITAT = ( context.HAB_EVERY, context.HAB_BUILDING, context.SET_EVERY,
     context.DES_CIVILIZED, context.DES_LUNAR, context.DES_FIRE,
     context.MTY_HUMANOID, context.MTY_MAGE, context.GEN_KINGDOM )
    ENC_LEVEL = 7
    TREASURE = treasuretype.HighItems( ( items.scrolls.Rank3Scroll, items.scrolls.Rank4Scroll ) )
    COMBAT_AI = aibrain.BasicTechnicalAI()
    COMPANIONS = (NovicePriest,NoviceWarrior,Warrior,Mercenary)
    ATTACK = items.Attack( (1,8,0), element = stats.RESIST_CRUSHING )
    TECHNIQUES = ( spells.magespells.LIGHTNING_BOLT, spells.lunarspells.SLEEP,
        spells.lunarspells.HELLBLAST, spells.firespells.EXPLOSION,
        spells.firespells.PYROTECHNICS
         )
    def init_monster( self ):
        self.levels.append( base.Spellcaster( 7, self ) )