class Fossil( base.Monster ):
    name = "Fossil"
    statline = { stats.STRENGTH: 24, stats.TOUGHNESS: 19, stats.REFLEXES: 12, \
        stats.INTELLIGENCE: 1, stats.PIETY: 14, stats.CHARISMA: 1,
        stats.RESIST_LUNAR: 155 }
    SPRITENAME = "monster_skeletons.png"
    FRAME = 27
    TEMPLATES = (stats.UNDEAD,stats.BONE)
    MOVE_POINTS = 6
    VOICE = None
    HABITAT = ( context.HAB_CAVE, context.SET_EVERY,
     context.DES_LUNAR, context.DES_EARTH,
     context.MTY_UNDEAD, context.MTY_BEAST, context.MTY_BOSS,
     context.GEN_UNDEAD, context.GEN_NATURE )
    ENC_LEVEL = 10

    COMBAT_AI = aibrain.BrainDeadAI()

    ATTACK = items.Attack( (3,8,0), element = stats.RESIST_CRUSHING )

    TECHNIQUES = ( invocations.MPInvocation( "Hellfire",
      effects.OpposedRoll( att_skill=stats.PHYSICAL_ATTACK, att_stat=stats.REFLEXES, att_modifier=10, def_stat=stats.REFLEXES, on_success = (
        effects.HealthDamage( (1,10,0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_LUNAR, anim=animobs.PurpleExplosion, on_success = (
            effects.SavingThrow( roll_skill=stats.RESIST_LUNAR, roll_stat=stats.TOUGHNESS, on_failure = (
                effects.StatDamage( stats.STRENGTH, anim=animobs.GreenBoom )
            ,))
         ,))
      ,), on_failure = (
        effects.HealthDamage( (1,6,0), stat_bonus=None, element=stats.RESIST_LUNAR, anim=animobs.PurpleExplosion )
      ,) ), com_tar=targetarea.Blast(radius=2), shot_anim=animobs.MysticBolt, ai_tar=invocations.TargetEnemy(), mp_cost=3
    ), )

    def init_monster( self ):
        self.levels.append( base.Beast( 16, self ) )
class Hydra( base.Monster ):
    name = "Hydra"    
    statline = { stats.STRENGTH: 21, stats.TOUGHNESS: 20, stats.REFLEXES: 12, \
        stats.INTELLIGENCE: 3, stats.PIETY: 10, stats.CHARISMA: 9,
        stats.PHYSICAL_ATTACK: 20 }
    SPRITENAME = "monster_default.png"
    FRAME = 3
    TEMPLATES = (stats.REPTILE,stats.EARTH,)
    MOVE_POINTS = 8
    HABITAT = ( context.HAB_EVERY, context.SET_EVERY,
     context.DES_EARTH, context.MTY_BOSS )
    ENC_LEVEL = 11
    VOICE = dialogue.voice.GREEK
    COMBAT_AI = aibrain.BruiserAI()
    TREASURE = treasuretype.Low()
    ATTACK = items.Attack( (2,10,0), element = stats.RESIST_PIERCING )
    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 ),
        effects.TargetIs( effects.ALIVE, on_true=( effects.OpposedRoll( att_stat=None, def_stat=stats.TOUGHNESS, on_success = (
            effects.Enchant( enchantments.PoisonClassic )
        ,) ), ))
      ), on_failure = (
        effects.HealthDamage( (2,6,0), stat_bonus=None, element=stats.RESIST_POISON, anim=animobs.PoisonCloud )
      ,) ), com_tar=targetarea.Blast(radius=2), ai_tar=invocations.TargetEnemy(min_distance=3), mp_cost=20, shot_anim=animobs.GreenComet
    ), )
    def init_monster( self ):
        self.levels.append( base.Terror( 10, self ) )
        self.condition.append( enchantments.PermaMegaRegeneration() )
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 AirElemental(base.Monster):
    name = "Air Elemental"
    statline = { stats.STRENGTH: 20, stats.TOUGHNESS: 20, stats.REFLEXES: 30, \
        stats.INTELLIGENCE: 12, stats.PIETY: 12, stats.CHARISMA: 12,
        stats.RESIST_WIND: 100 }
    SPRITENAME = "monster_e_air.png"
    FRAME = 0
    TEMPLATES = (stats.ELEMENTAL, stats.AIR)
    MOVE_POINTS = 20
    HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.DES_AIR,
               context.MTY_ELEMENTAL, context.SUMMON_ELEMENTAL)
    ENC_LEVEL = 12
    ATTACK = items.Attack((1, 10, 0),
                          element=stats.RESIST_SLASHING,
                          extra_effect=effects.HealthDamage(
                              (1, 10, 0),
                              stat_bonus=stats.INTELLIGENCE,
                              element=stats.RESIST_WIND,
                              anim=animobs.Spiral))
    TECHNIQUES = (invocations.MPInvocation(
        "Tornado",
        effects.OpposedRoll(def_stat=stats.REFLEXES,
                            on_success=(effects.HealthDamage(
                                (3, 8, 0),
                                stat_bonus=stats.INTELLIGENCE,
                                element=stats.RESIST_WIND,
                                anim=animobs.Spiral), ),
                            on_failure=(effects.HealthDamage(
                                (1, 12, 0),
                                stat_bonus=None,
                                element=stats.RESIST_WIND,
                                anim=animobs.Spiral), )),
        mp_cost=10,
        com_tar=targetarea.Blast(radius=3),
        shot_anim=animobs.Whirlwind,
        ai_tar=invocations.TargetEnemy()),
                  invocations.MPInvocation(
                      "Lightning Bolt",
                      effects.OpposedRoll(def_stat=stats.REFLEXES,
                                          on_success=(effects.HealthDamage(
                                              (3, 12, 0),
                                              stat_bonus=stats.INTELLIGENCE,
                                              element=stats.RESIST_LIGHTNING,
                                              anim=animobs.BlueZap), ),
                                          on_failure=(effects.HealthDamage(
                                              (2, 10, 0),
                                              stat_bonus=None,
                                              element=stats.RESIST_LIGHTNING,
                                              anim=animobs.BlueZap), )),
                      mp_cost=5,
                      com_tar=targetarea.SingleTarget(),
                      shot_anim=animobs.Lightning,
                      ai_tar=invocations.TargetEnemy()))

    def init_monster(self):
        self.levels.append(base.Beast(12, self))
Exemple #5
0
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))
    "Conjures an intense ball of light which does 5d10 solar damage to all enemies in a 3 tile radius.",
    effects.TargetIsEnemy(
        on_true=(effects.OpposedRoll(on_success=(effects.HealthDamage(
            (5, 10, 0),
            stat_bonus=stats.INTELLIGENCE,
            element=stats.RESIST_SOLAR,
            anim=animobs.YellowExplosion), ),
                                     on_failure=(effects.HealthDamage(
                                         (2, 12, 0),
                                         stat_bonus=None,
                                         element=stats.RESIST_SOLAR,
                                         anim=animobs.YellowExplosion), )), ),
        on_false=(effects.NoEffect(anim=animobs.YellowExplosion), )),
    rank=7,
    gems={SOLAR: 2},
    com_tar=targetarea.Blast(radius=3, delay_from=1),
    shot_anim=animobs.GoldStone,
    ai_tar=invocations.TargetEnemy(min_distance=4))

RENEWAL = Spell(
    "Renewal",
    "This spell will heal one nearby ally for 50-120 damage, retore drained stats, remove curses and cure poisoning.",
    effects.TargetIsAlly(on_true=(
        effects.HealthRestore(dice=(10, 8, 40)),
        effects.TidyEnchantments(enchantments.CURSE, anim=None),
        effects.TidyEnchantments(enchantments.POISON, anim=None),
        effects.StatRestore(anim=None),
    )),
    rank=7,
    gems={SOLAR: 4},
    com_tar=targetarea.SingleTarget(reach=1),
Exemple #7
0
EXPLOSION = Spell(
    "Explosion",
    "Causes a magical explosion which does 2d6 fire damage to all targets within 3 tiles.",
    effects.OpposedRoll(on_success=(effects.HealthDamage(
        (2, 6, 0),
        stat_bonus=stats.INTELLIGENCE,
        element=stats.RESIST_FIRE,
        anim=animobs.RedCloud), ),
                        on_failure=(effects.HealthDamage(
                            (1, 6, 0),
                            stat_bonus=None,
                            element=stats.RESIST_FIRE,
                            anim=animobs.RedCloud), )),
    rank=3,
    gems={FIRE: 2},
    com_tar=targetarea.Blast(radius=3),
    shot_anim=animobs.Fireball,
    ai_tar=invocations.TargetEnemy(min_distance=4))

# CIRCLE 4

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),
Exemple #8
0
              mpfudge=-1,
              com_tar=targetarea.SingleTarget(),
              exp_tar=targetarea.SingleTarget())

# CIRCLE TWO

SILENCE = Spell(
    "Silence",
    "Targets within a 2 tile radius may be silenced, preventing them from casting spells.",
    effects.OpposedRoll(
        att_modifier=0,
        on_success=(effects.CauseSilence(), ),
        on_failure=(effects.NoEffect(anim=animobs.SmallBoom), )),
    rank=2,
    gems={AIR: 1},
    com_tar=targetarea.Blast(radius=2),
    ai_tar=invocations.TargetEnemy())

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), )),
        effects.HealthDamage( (2,5,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_COLD, anim=animobs.BlueExplosion ),
        effects.Paralyze( max_duration = 3 )
    ,), on_failure = (
        effects.HealthDamage( (2,5,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_COLD, anim=animobs.BlueExplosion )
    ,) ), rank=2, gems={LUNAR:1,WATER:1}, com_tar=targetarea.SingleTarget(reach=1),ai_tar=invocations.TargetEnemy(), mpfudge=-2 )


# CIRCLE 3

ACID_CLOUD = Spell( "Acid Cloud",
    "Calls forth billowing clouds of acid which do 2d6 damage to all targets within 3 tiles.",
    effects.OpposedRoll( on_success = (
        effects.HealthDamage( (2,6,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_ACID, anim=animobs.GreenCloud )
    ,), on_failure = (
        effects.HealthDamage( (1,6,0), stat_bonus=None, element=stats.RESIST_ACID, anim=animobs.GreenCloud )
    ,) ), rank=3, gems={EARTH:1,LUNAR:1}, com_tar=targetarea.Blast(radius=3), shot_anim=animobs.GreenComet, 
    ai_tar=invocations.TargetEnemy(min_distance=4) )

PROTECT_FROM_GOOD = Spell( "Protection from Good",
    "All allies within 6 tiles get +10% defense, +10% aura, and 50% resistance to holy damage for the duration of combat.",
    effects.TargetIsAlly( on_true = (
        effects.Enchant( enchantments.ProtectFromGoodEn, anim=animobs.PurpleSparkle ),
    )),
    rank=3, gems={LUNAR:1,WATER:1}, com_tar=targetarea.SelfCentered(),
    ai_tar=invocations.TargetAllyWithoutEnchantment(enchantments.ProtectFromGoodEn) )


# CIRCLE FOUR

RAISE_UNDEAD = Spell( "Raise Undead",
    "You conjure dark forces to animate an undead creature which will fight on your behaf.",
Exemple #10
0
    effects.CallMonster( {context.MTY_CREATURE: True, context.DES_EARTH: context.MAYBE, context.GEN_NATURE: context.MAYBE, context.DES_SOLAR: context.MAYBE}, 10, anim=animobs.OrangeSparkle ),
    rank=5, gems={EARTH:2,SOLAR:2}, com_tar=targetarea.SingleTarget(reach=2), ai_tar=invocations.TargetEmptySpot(), mpfudge = 10 )

ELEMENTAL_STORM = Spell( "Elemental Storm",
    "The wrath of nature is brought to bear on your foes. All targets within a 3 tile radius take 2d4 damage from each of fire, cold, lightning, and acid.",
    effects.OpposedRoll( on_success = (
        effects.HealthDamage( (2,4,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion ),
        effects.HealthDamage( (2,4,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_COLD, anim=animobs.BlueBoom ),
        effects.HealthDamage( (2,4,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_LIGHTNING, anim=animobs.BlueZap ),
        effects.HealthDamage( (2,4,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_ACID, anim=animobs.GreenSplat )
    ), on_failure = (
        effects.HealthDamage( (2,4,0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.OrangeExplosion ),
        effects.HealthDamage( (2,4,0), stat_bonus=None, element=stats.RESIST_COLD, anim=animobs.BlueBoom ),
        effects.HealthDamage( (2,4,0), stat_bonus=None, element=stats.RESIST_LIGHTNING, anim=animobs.BlueZap ),
        effects.HealthDamage( (2,4,0), stat_bonus=None, element=stats.RESIST_ACID, anim=animobs.GreenSplat )
    ) ), rank=5, gems={FIRE:2,SOLAR:1}, com_tar=targetarea.Blast(radius=3), shot_anim=animobs.CrystalBall, 
    ai_tar=invocations.TargetEnemy(min_distance=4) )

TRANSFORMATION = Spell( "Transformation",
    "Transforms all allies within six tiles, providing +10% to defense plus 25% resistance to slashing, crushing, and piercing damage.",
    effects.TargetIsAlly( on_true = (
        effects.Enchant( enchantments.WoodSkinEn, anim=animobs.OrangeSparkle ),
    )), rank=5, gems={EARTH:3,FIRE:1}, com_tar=targetarea.SelfCentered(),
    ai_tar=invocations.TargetAllyWithoutEnchantment(enchantments.WoodSkinEn) )


# CIRCLE SIX

CALL_BEHEMOTH = Spell( "Call Behemoth",
    "This spell will summon a very powerful monster 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}, 12, anim=animobs.OrangeSparkle ),
                                (1, 5, 0),
                                stat_bonus=None,
                                element=stats.RESIST_WIND,
                                anim=animobs.Blizzard), ),
                            on_death=(effects.HealthDamage(
                                (1, 5, 0),
                                stat_bonus=None,
                                element=stats.RESIST_WIND,
                                anim=animobs.Blizzard), ),
                        ), )),
    rank=4,
    gems={
        WATER: 1,
        AIR: 1
    },
    com_tar=targetarea.Blast(radius=4, delay_from=1),
    ai_tar=invocations.TargetEnemy(min_distance=5))

DIVINE_HAMMER = Spell(
    "Divine Hammer",
    "This attack does 4d8 holy damage to a single target. Unholy creatures may be stunned.",
    effects.OpposedRoll(
        def_stat=stats.REFLEXES,
        on_success=(
            effects.HealthDamage((4, 8, 0),
                                 stat_bonus=stats.INTELLIGENCE,
                                 element=stats.RESIST_SOLAR,
                                 anim=animobs.RedBoom),
            effects.TargetIs(pat=effects.UNHOLY,
                             on_true=(effects.Paralyze(max_duration=3), )),
        ),
Exemple #12
0
# CIRCLE SEVEN

FLAMING_SWORD = Spell( "Flaming Sword",
    "Conjures an animated flaming sword, which will fight for your party until the end of combat.",
    effects.CallMonster( {context.SUMMON_FLAMINGSWORD: True, context.DES_AIR: context.MAYBE, context.DES_FIRE: context.MAYBE}, 14, anim=animobs.RedSparkle ),
    rank=7, gems={AIR:2,FIRE:2}, com_tar=targetarea.SingleTarget(reach=5), ai_tar=invocations.TargetEmptySpot(), mpfudge = 16 )

FROSTFIRE = Spell( "Frostfire",
    "This spell creates a sphere of pure anti-fire, which freezes all targets in a 3 tile radius for 4d12 cold damage. The frostfire may continue to burn until the victim is frozen solid.",
    effects.OpposedRoll( on_success = (
        effects.HealthDamage( (4,12,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_COLD, anim=animobs.SnowCloud ),
        effects.Enchant( enchantments.FrostBurnEn )
    ,), on_failure = (
        effects.HealthDamage( (4,8,0), stat_bonus=None, element=stats.RESIST_COLD, anim=animobs.SnowCloud )
    ,) ), rank=7, gems={FIRE:2,LUNAR:3}, com_tar=targetarea.Blast(radius=3), shot_anim=animobs.BlueComet, 
    ai_tar=invocations.TargetEnemy(min_distance=4) )

# CIRCLE EIGHT

METEOR_STORM = Spell( "Meteor Storm",
    "This spell calls down flaming rocks from the heavens, doing 10d8 fire damage and setting targets alight in a 4 tile radius.",
    effects.OpposedRoll( on_success = (
        effects.HealthDamage( (10,8,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_FIRE, anim=animobs.MeteorStorm ),
        effects.Enchant( enchantments.BurnLowEn )
    ), on_failure = (
        effects.HealthDamage( (3,12,0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.MeteorStorm ),
    ) ), rank=8, gems={FIRE:2,AIR:2}, com_tar=targetarea.Blast(radius=4), 
    ai_tar=invocations.TargetEnemy(min_distance=5) )

Exemple #13
0
WIZARD_MISSILE = Spell( "Wizard Missile",
    "This mystic bolt always strikes its target for 1-6 damage.",
    effects.HealthDamage((1,6,0), stat_bonus=None, element=stats.RESIST_LUNAR, anim=animobs.PurpleExplosion ),
    rank=1, gems={LUNAR:1}, com_tar=targetarea.SingleTarget(), shot_anim=animobs.WizardMissile,
    ai_tar=invocations.TargetEnemy(), mpfudge=-1 )

# CIRCLE TWO

SLEEP = Spell( "Sleep",
    "Causes living creatures in a 2 tile radius to fall asleep.",
    effects.TargetIs( pat=effects.ANIMAL, anim=animobs.PurpleSparkle, on_true = (
        effects.OpposedRoll( att_modifier=0, on_success = (
            effects.CauseSleep(),
        ))
    ,) ), rank=2, gems={LUNAR:2}, com_tar=targetarea.Blast(radius=2), 
    ai_tar=invocations.TargetMobileEnemy(min_distance=3) )

ENERVATE = Spell( "Enervate",
    "A ray of negative energy strikes one opponent, draining 4-16 mana instantly.",
    effects.ManaDamage((4,4,0), stat_bonus=stats.INTELLIGENCE, anim=animobs.PurpleExplosion ),
    rank=2, gems={LUNAR:1}, com_tar=targetarea.SingleTarget(), shot_anim=animobs.PurpleVortex, ai_tar=invocations.TargetEnemy(), mpfudge=-1 )


# CIRCLE 3

WITHER = Spell( "Wither",
    "Conjures a sphere of negative energy, draining a single target for 2d10 dark damage and 1d6 points of strength.",
    effects.OpposedRoll( on_success = (
        effects.HealthDamage( (2,10,0), stat_bonus=stats.INTELLIGENCE, element=stats.RESIST_LUNAR, anim=animobs.PurpleExplosion ),
        effects.StatDamage( stats.STRENGTH, amount=6 )