Пример #1
0
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))
Пример #2
0
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))
Пример #3
0
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))
Пример #4
0
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))
Пример #5
0
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 ) )
Пример #6
0
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))
Пример #7
0
class SwampDragonfly(base.Monster):
    name = "Swamp Dragonfly"
    statline = { stats.STRENGTH: 10, stats.TOUGHNESS: 9, stats.REFLEXES: 13, \
        stats.INTELLIGENCE: 1, stats.PIETY: 7, stats.CHARISMA: 1, \
        stats.RESIST_ACID: 150 }
    SPRITENAME = "monster_bugs.png"
    FRAME = 2
    TEMPLATES = (stats.BUG, )
    MOVE_POINTS = 14
    VOICE = None
    HABITAT = (context.HAB_FOREST, context.SET_EVERY, context.DES_EARTH,
               context.MTY_BEAST, context.MTY_CREATURE, context.GEN_DRAGON)
    ENC_LEVEL = 3

    ATTACK = items.Attack((1, 6, 0), element=stats.RESIST_PIERCING)

    TECHNIQUES = (invocations.MPInvocation(
        "Acid Breath",
        effects.OpposedRoll(
            att_skill=stats.PHYSICAL_ATTACK,
            att_stat=stats.REFLEXES,
            att_modifier=10,
            def_stat=stats.REFLEXES,
            on_success=(effects.HealthDamage((1, 6, 0),
                                             stat_bonus=None,
                                             element=stats.RESIST_ACID,
                                             anim=animobs.GreenExplosion), ),
            on_failure=(effects.NoEffect(anim=animobs.SmallBoom), )),
        com_tar=targetarea.SingleTarget(),
        shot_anim=animobs.GreenSpray,
        ai_tar=invocations.TargetEnemy(),
        mp_cost=3), )

    def init_monster(self):
        self.levels.append(base.Beast(2, self))
Пример #8
0
class CorpseEater( base.Monster ):
    name = "Corpse Eater"
    statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 14, stats.REFLEXES: 8, \
        stats.INTELLIGENCE: 2, stats.PIETY: 12, stats.CHARISMA: 2 }
    SPRITENAME = "monster_default.png"
    FRAME = 13
    TEMPLATES = (stats.BUG,)
    MOVE_POINTS = 8
    VOICE = None
    HABITAT = ( context.HAB_EVERY, context.HAB_TUNNELS, context.SET_EVERY,
     context.MAP_DUNGEON,
     context.DES_LUNAR,
     context.MTY_BEAST )
    ENC_LEVEL = 4
    ATTACK = items.Attack( (3,4,0), element = stats.RESIST_PIERCING, extra_effect =
         effects.OpposedRoll( att_stat=stats.TOUGHNESS, on_success = (
            effects.Paralyze( max_duration = 6 )
        ,) )
     )
    TECHNIQUES = ( invocations.MPInvocation( "Tentacle Slime",
      effects.TargetIsEnemy( on_true = (
          effects.OpposedRoll( anim=animobs.GreenSplat, att_stat=stats.TOUGHNESS, on_success = (
            effects.Paralyze( max_duration = 3 )
          ,), on_failure = (
            effects.NoEffect( anim=animobs.SmallBoom )
          ,) ),
          )
      ), com_tar=targetarea.SelfCentered(radius=1,exclude_middle=True), ai_tar=invocations.TargetEnemy(), mp_cost=8 ), )
    def init_monster( self ):
        self.levels.append( base.Beast( 4, self ) )
Пример #9
0
class Harpy( base.Monster ):
    name = "Harpy"    
    statline = { stats.STRENGTH: 10, stats.TOUGHNESS: 10, stats.REFLEXES: 15, \
        stats.INTELLIGENCE: 7, stats.PIETY: 12, stats.CHARISMA: 17 }
    SPRITENAME = "monster_default.png"
    FRAME = 38
    TEMPLATES = ()
    MOVE_POINTS = 8
    VOICE = dialogue.voice.GREEK
    HABITAT = ( context.HAB_EVERY, context.HAB_CAVE, context.SET_EVERY,
     context.DES_LUNAR,
     context.MTY_HUMANOID, context.MTY_BOSS, context.GEN_CHAOS )
    ENC_LEVEL = 6
    TREASURE = treasuretype.Standard()
    ATTACK = items.Attack( (2,4,0), element = stats.RESIST_SLASHING )
    TECHNIQUES = (invocations.MPInvocation( "Sleep Song",
        effects.TargetIsEnemy( anim=animobs.SonicHit, on_true = (
            effects.TargetIs( pat=effects.ANIMAL, on_true = (
                effects.OpposedRoll( att_modifier=0, on_success = (
                    effects.CauseSleep(),
                )),)
        ,), )), com_tar=targetarea.SelfCentered(radius=6,delay_from=-1), 
        ai_tar=invocations.TargetMobileEnemy(), mp_cost=8 ),
    )
    def init_monster( self ):
        self.levels.append( base.Humanoid( 7, self ) )
Пример #10
0
class Chimera( base.Monster ):
    name = "Chimera"
    # This is based on the version from the Pathfinder SRD rather than the
    # regular SRD; the only difference is the beefed-up breath weapon.
    statline = { stats.STRENGTH: 19, stats.TOUGHNESS: 17, stats.REFLEXES: 13, \
        stats.INTELLIGENCE: 4, stats.PIETY: 13, stats.CHARISMA: 10,
        stats.AWARENESS: 50 }
    SPRITENAME = "monster_by_Joe.png"
    FRAME = 0
    TEMPLATES = ()
    MOVE_POINTS = 12
    VOICE = dialogue.voice.GREEK
    HABITAT = ( context.HAB_EVERY, context.SET_EVERY, context.DES_FIRE,
     context.MTY_BEAST, context.GEN_CHAOS, context.MTY_BOSS )
    ENC_LEVEL = 9
    TREASURE = treasuretype.Standard()
    ATTACK = items.Attack( (2,8,0), element = stats.RESIST_PIERCING )
    TECHNIQUES = ( invocations.MPInvocation( "Fire Breath",
      effects.OpposedRoll( att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success = (
        effects.HealthDamage( (6,8,0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_FIRE, anim=animobs.RedCloud )
      ,), on_failure = (
        effects.HealthDamage( (3,8,0), stat_bonus=None, element=stats.RESIST_FIRE, anim=animobs.RedCloud )
      ,) ), com_tar=targetarea.Cone(reach=4), ai_tar=invocations.TargetEnemy(), mp_cost=16
    ), )
    def init_monster( self ):
        self.levels.append( base.Terror( 9, self ) )
Пример #11
0
class EvilEye( base.Monster ):
    name = "Evil Eye"
    statline = { stats.STRENGTH: 6, stats.TOUGHNESS: 12, stats.REFLEXES: 12, \
        stats.INTELLIGENCE: 10, stats.PIETY: 10, stats.CHARISMA: 2, \
        stats.MAGIC_ATTACK: 20, stats.MAGIC_DEFENSE: 10 }
    SPRITENAME = "monster_default.png"
    FRAME = 18
    TEMPLATES = ()
    MOVE_POINTS = 6
    VOICE = None
    HABITAT = ( context.HAB_CAVE, context.HAB_TUNNELS, context.SET_EVERY,
     context.DES_LUNAR, context.MTY_BOSS,
     context.MTY_BEAST, context.GEN_CHAOS )
    ENC_LEVEL = 3
    ATTACK = items.Attack( (2,4,0), element = stats.RESIST_LUNAR,
     skill_mod=stats.REFLEXES, hit_anim=animobs.PurpleExplosion, extra_effect =
         effects.OpposedRoll( att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, on_success = (
            effects.Paralyze( max_duration = 3 )
        ,) )
     )
    TECHNIQUES = ( invocations.MPInvocation( "Evil Gaze",
      effects.OpposedRoll( att_stat=stats.REFLEXES, def_stat=stats.REFLEXES, att_modifier=10, on_success = (
        effects.Paralyze( max_duration = 3 )
      ,), on_failure = (
        effects.NoEffect( anim=animobs.SmallBoom )
      ,) ), com_tar=targetarea.SingleTarget(reach=4), shot_anim=animobs.PurpleVortex,
      ai_tar=invocations.TargetMobileEnemy(), mp_cost=3
    ), )
    def init_monster( self ):
        self.levels.append( base.Beast( 3, self ) )
Пример #12
0
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() )
Пример #13
0
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 ) )
Пример #14
0
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 ) )
Пример #15
0
class Unicorn(base.Monster):
    name = "Unicorn"
    statline = { stats.STRENGTH: 16, stats.TOUGHNESS: 18, stats.REFLEXES: 16, \
        stats.INTELLIGENCE: 16, stats.PIETY: 20, stats.CHARISMA: 18, \
        stats.RESIST_LUNAR: 100, stats.MAGIC_DEFENSE: 25 }
    SPRITENAME = "monster_animals.png"
    FRAME = 31
    TEMPLATES = ()
    MOVE_POINTS = 12
    VOICE = None
    HABITAT = (context.HAB_FOREST, context.SET_EVERY, context.DES_SOLAR,
               context.MTY_BEAST, context.MTY_CREATURE, context.MTY_LEADER,
               context.MTY_BOSS, context.GEN_NATURE)
    ENC_LEVEL = 13
    ATTACK = items.Attack((3, 6, 0), element=stats.RESIST_PIERCING)
    TECHNIQUES = (invocations.MPInvocation(
        "Radiance",
        effects.HealthRestore(dice=(5, 8, 20)),
        mp_cost=7,
        com_tar=targetarea.SingleTarget(reach=10),
        ai_tar=invocations.TargetWoundedAlly(),
        exp_tar=targetarea.SinglePartyMember(),
        shot_anim=animobs.YellowVortex), )

    def init_monster(self):
        self.levels.append(base.Defender(12, self))
Пример #16
0
class Bodak( base.Monster ):
    name = "Bodak"
    statline = { stats.STRENGTH: 13, stats.TOUGHNESS: 12, stats.REFLEXES: 15, \
        stats.INTELLIGENCE: 6, stats.PIETY: 12, stats.CHARISMA: 12,
        stats.RESIST_ACID: 75, stats.RESIST_LIGHTNING: 155 }
    SPRITENAME = "monster_undead.png"
    FRAME = 0
    TEMPLATES = (stats.UNDEAD,stats.DEMON)
    MOVE_POINTS = 8
    VOICE = None
    HABITAT = ( context.HAB_EVERY, context.SET_EVERY,
     context.MTY_UNDEAD, context.MTY_BOSS,
     context.DES_LUNAR, context.GEN_UNDEAD )
    ENC_LEVEL = 10
    TREASURE = None
    ATTACK = items.Attack( (1,8,0), element = stats.RESIST_CRUSHING)
    TECHNIQUES = ( invocations.MPInvocation( "Death Gaze",
      effects.OpposedRoll( att_stat=stats.CHARISMA, 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=10
    ),)
    def init_monster( self ):
        self.levels.append( base.Terror( 9, self ) )
Пример #17
0
class Kaiju( base.Monster ):
    name = "Kaiju"    
    statline = { stats.STRENGTH: 45, stats.TOUGHNESS: 35, stats.REFLEXES: 16, \
        stats.INTELLIGENCE: 3, stats.PIETY: 14, stats.CHARISMA: 14, stats.RESIST_ATOMIC: 50,
        stats.RESIST_FIRE: 200, stats.RESIST_POISON: 200, stats.RESIST_LUNAR: 200 }
    SPRITENAME = "monster_default.png"
    FRAME = 14
    TEMPLATES = ()
    MOVE_POINTS = 8
    HABITAT = ( context.HAB_EVERY, context.SET_EVERY,
     context.MAP_WILDERNESS,
     context.MTY_BEAST )
    ENC_LEVEL = 22
    VOICE = dialogue.voice.DRACONIAN
    COMBAT_AI = aibrain.BruiserAI()
    TREASURE = None
    ATTACK = items.Attack( (4,8,0), element = stats.RESIST_CRUSHING )
    TECHNIQUES = ( invocations.MPInvocation( "Atomic Breath",
      effects.OpposedRoll( att_stat=stats.REFLEXES, on_success = (
        effects.HealthDamage( (10,6,0), stat_bonus=stats.TOUGHNESS, element=stats.RESIST_ATOMIC, anim=animobs.Nuclear )
      ,), on_failure = (
        effects.HealthDamage( (3,10,0), stat_bonus=None, element=stats.RESIST_ATOMIC, anim=animobs.Nuclear )
      ,) ), com_tar=targetarea.Cone(reach=8), ai_tar=invocations.TargetEnemy(), mp_cost=60
    ), )
    def init_monster( self ):
        self.levels.append( base.Beast( 48, self ) )
        self.condition.append( enchantments.PermaMegaRegeneration() )
Пример #18
0
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 ) )
Пример #19
0
class ShieldOfBashing(Enhancer):
    NAMEPAT = "{0} of Bashing"
    DESCPAT = "{0} It may be used to bash enemies, doing 2d6 damage and potentially stunning them."
    PLUSRANK = 2
    AFFECTS = (SHIELD, )
    TECH = (invocations.MPInvocation(
        "Shield Bash",
        effects.PhysicalAttackRoll(
            att_stat=stats.STRENGTH,
            on_success=(
                effects.HealthDamage((2, 6, 0),
                                     stat_bonus=stats.STRENGTH,
                                     element=stats.RESIST_CRUSHING,
                                     stat_mod=2,
                                     anim=animobs.RedBoom),
                effects.OpposedRoll(
                    att_skill=stats.PHYSICAL_ATTACK,
                    def_stat=stats.TOUGHNESS,
                    on_success=(effects.Paralyze(max_duration=3), )),
            ),
            on_failure=(effects.NoEffect(anim=animobs.SmallBoom), )),
        com_tar=targetarea.SingleTarget(reach=1),
        ai_tar=invocations.TargetEnemy(),
        mp_cost=3), )
    TYPE = ET_SECONDARY
Пример #20
0
class FireBat(base.Monster):
    name = "Fire Bat"
    statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 12, stats.REFLEXES: 14, \
        stats.INTELLIGENCE: 2, stats.PIETY: 9, stats.CHARISMA: 3, }
    SPRITENAME = "monster_animals.png"
    FRAME = 26
    TEMPLATES = (stats.FIRE, )
    MOVE_POINTS = 14
    VOICE = None
    HABITAT = (context.HAB_CAVE, context.SET_EVERY, context.DES_FIRE,
               context.DES_LUNAR, context.MTY_BEAST)
    ENC_LEVEL = 4

    ATTACK = items.Attack((2, 4, 0),
                          element=stats.RESIST_PIERCING,
                          extra_effect=effects.OpposedRoll(
                              att_stat=stats.TOUGHNESS,
                              att_modifier=-10,
                              on_success=(
                                  effects.HealthDamage(
                                      (1, 6, 0),
                                      stat_bonus=None,
                                      element=stats.RESIST_FIRE,
                                      anim=animobs.OrangeExplosion),
                                  effects.Enchant(enchantments.BurnLowEn),
                              )))

    TECHNIQUES = (invocations.MPInvocation(
        "Fire Breath",
        effects.OpposedRoll(att_skill=stats.PHYSICAL_ATTACK,
                            att_stat=stats.REFLEXES,
                            att_modifier=-10,
                            def_stat=stats.REFLEXES,
                            on_success=(
                                effects.HealthDamage(
                                    (1, 8, 0),
                                    stat_bonus=None,
                                    element=stats.RESIST_FIRE,
                                    anim=animobs.OrangeExplosion),
                                effects.Enchant(enchantments.BurnLowEn),
                            ),
                            on_failure=(effects.HealthDamage(
                                (1, 8, 0),
                                stat_bonus=None,
                                element=stats.RESIST_FIRE,
                                anim=animobs.OrangeExplosion), )),
        com_tar=targetarea.SingleTarget(),
        shot_anim=animobs.Fireball,
        ai_tar=invocations.TargetEnemy(),
        mp_cost=3), )

    def init_monster(self):
        self.levels.append(base.Beast(3, self))
Пример #21
0
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))
Пример #22
0
class FireWeasel(base.Monster):
    name = "Fire Weasel"
    statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 12, stats.REFLEXES: 15, \
        stats.INTELLIGENCE: 3, stats.PIETY: 14, stats.CHARISMA: 9 }
    SPRITENAME = "monster_animals.png"
    FRAME = 29
    TEMPLATES = (stats.FIRE, )
    MOVE_POINTS = 10
    VOICE = None
    HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.MAP_WILDERNESS,
               context.DES_FIRE, context.MTY_BEAST, context.MTY_CREATURE,
               context.MTY_BOSS, context.GEN_NATURE)
    ENC_LEVEL = 4

    ATTACK = items.Attack((1, 6, 0),
                          element=stats.RESIST_PIERCING,
                          extra_effect=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),
                              )))

    TECHNIQUES = (invocations.MPInvocation(
        "Fire Breath",
        effects.OpposedRoll(att_skill=stats.PHYSICAL_ATTACK,
                            att_stat=stats.REFLEXES,
                            def_stat=stats.REFLEXES,
                            on_success=(effects.HealthDamage(
                                (1, 6, 0),
                                stat_bonus=stats.TOUGHNESS,
                                element=stats.RESIST_FIRE,
                                anim=animobs.RedCloud), ),
                            on_failure=(effects.HealthDamage(
                                (1, 3, 0),
                                stat_bonus=None,
                                element=stats.RESIST_FIRE,
                                anim=animobs.RedCloud), )),
        com_tar=targetarea.Cone(reach=4),
        ai_tar=invocations.TargetEnemy(),
        mp_cost=3), )

    def init_monster(self):
        self.levels.append(base.Beast(4, self))
Пример #23
0
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))
Пример #24
0
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))
Пример #25
0
class Belker(base.Monster):
    name = "Belker"
    statline = { stats.STRENGTH: 14, stats.TOUGHNESS: 13, stats.REFLEXES: 21, \
        stats.INTELLIGENCE: 6, stats.PIETY: 11, stats.CHARISMA: 11 }
    SPRITENAME = "monster_e_air.png"
    FRAME = 10
    TEMPLATES = (stats.ELEMENTAL, stats.AIR, stats.INCORPOREAL)
    MOVE_POINTS = 12
    VOICE = None
    HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.DES_AIR,
               context.DES_LUNAR, context.MTY_ELEMENTAL)
    ENC_LEVEL = 8
    ATTACK = items.Attack((2, 4, 0), element=stats.RESIST_WIND)
    TECHNIQUES = (invocations.MPInvocation(
        "Smoke Claw",
        effects.OpposedRoll(
            att_stat=stats.STRENGTH,
            def_stat=stats.TOUGHNESS,
            on_success=(
                effects.HealthDamage((2, 4, 0),
                                     stat_bonus=stats.STRENGTH,
                                     element=stats.RESIST_WIND,
                                     anim=animobs.RedBoom),
                effects.TargetIs(effects.ALIVE,
                                 on_true=(
                                     effects.HealthDamage(
                                         (3, 4, 0),
                                         stat_bonus=None,
                                         element=None,
                                         anim=animobs.BloodSplat),
                                     effects.Enchant(enchantments.Bleeding),
                                 )),
            ),
            on_failure=(effects.HealthDamage((2, 4, 0),
                                             stat_bonus=None,
                                             element=stats.RESIST_WIND,
                                             anim=animobs.RedBoom), )),
        mp_cost=5,
        com_tar=targetarea.SingleTarget(reach=1),
        ai_tar=invocations.TargetEnemy()), )

    def init_monster(self):
        self.levels.append(base.Humanoid(8, self))
Пример #26
0
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 ) )
Пример #27
0
class Scarab(base.Monster):
    name = "Scarab"
    statline = { stats.STRENGTH: 13, stats.TOUGHNESS: 16, stats.REFLEXES: 14, \
        stats.INTELLIGENCE: 1, stats.PIETY: 12, stats.CHARISMA: 1,
        stats.RESIST_SOLAR: 50 }
    SPRITENAME = "monster_bugs.png"
    FRAME = 5
    TEMPLATES = (stats.BUG, )
    MOVE_POINTS = 8
    VOICE = None
    HABITAT = (context.HAB_TUNNELS, context.HAB_DESERT, context.SET_EVERY,
               context.DES_SOLAR, context.MTY_BEAST, context.MTY_CREATURE)
    ENC_LEVEL = 7
    TECHNIQUES = (invocations.MPInvocation(
        "Draining Breath",
        effects.TargetIsEnemy(
            on_true=(effects.OpposedRoll(
                att_skill=stats.PHYSICAL_ATTACK,
                att_stat=stats.REFLEXES,
                def_stat=stats.REFLEXES,
                on_success=(effects.HealthDamage(
                    (1, 8, 0),
                    stat_bonus=stats.TOUGHNESS,
                    element=stats.RESIST_FIRE,
                    anim=animobs.PurpleExplosion), ),
                on_failure=(effects.HealthDamage(
                    (1, 4, 0),
                    stat_bonus=None,
                    element=stats.RESIST_FIRE,
                    anim=animobs.PurpleExplosion), )), ),
            on_false=(effects.NoEffect(anim=animobs.PurpleExplosion), )),
        com_tar=targetarea.Cone(reach=4),
        ai_tar=invocations.TargetEnemy(),
        mp_cost=3), )
    ATTACK = items.Attack((1, 6, 0),
                          element=stats.RESIST_PIERCING,
                          extra_effect=abilities.POISON_ATTACK_2d6)

    def init_monster(self):
        self.levels.append(base.Beast(7, self))
Пример #28
0
class AnimatedCandlestick(base.Monster):
    name = "Candlestick"
    statline = { stats.STRENGTH: 12, stats.TOUGHNESS: 12, stats.REFLEXES: 12, \
        stats.INTELLIGENCE: 12, stats.PIETY: 12, stats.CHARISMA: 12 }
    SPRITENAME = "monster_constructs.png"
    FRAME = 19
    TEMPLATES = (stats.CONSTRUCT, )
    MOVE_POINTS = 10
    VOICE = None
    HABITAT = (context.HAB_BUILDING, context.SET_EVERY, context.MTY_CONSTRUCT,
               context.DES_FIRE)
    ENC_LEVEL = 7
    COMBAT_AI = aibrain.SteadyAI()
    ATTACK = items.Attack(
        (2, 6, 0),
        element=stats.RESIST_PIERCING,
        extra_effect=effects.OpposedRoll(att_modifier=-10,
                                         on_success=(effects.Enchant(
                                             enchantments.BurnLowEn,
                                             anim=animobs.RedCloud), )))
    TECHNIQUES = (invocations.MPInvocation(
        "Fireball",
        effects.OpposedRoll(def_stat=stats.REFLEXES,
                            on_success=(effects.HealthDamage(
                                (1, 10, 0),
                                stat_bonus=None,
                                element=stats.RESIST_FIRE,
                                anim=animobs.RedCloud), ),
                            on_failure=(effects.HealthDamage(
                                (1, 6, 0),
                                stat_bonus=None,
                                element=stats.RESIST_FIRE,
                                anim=animobs.RedCloud), )),
        com_tar=targetarea.SingleTarget(),
        ai_tar=invocations.TargetEnemy(),
        shot_anim=animobs.Fireball,
        mp_cost=5), )

    def init_monster(self):
        self.levels.append(base.Beast(7, self))
Пример #29
0
class EarthElemental(base.Monster):
    name = "Earth Elemental"
    statline = { stats.STRENGTH: 25, stats.TOUGHNESS: 35, stats.REFLEXES: 10, \
        stats.INTELLIGENCE: 12, stats.PIETY: 12, stats.CHARISMA: 12,
        stats.RESIST_ACID: 100 }
    SPRITENAME = "monster_e_earth.png"
    FRAME = 1
    TEMPLATES = (stats.ELEMENTAL, stats.EARTH)
    MOVE_POINTS = 6
    HABITAT = (context.HAB_EVERY, context.SET_EVERY, context.DES_EARTH,
               context.MTY_ELEMENTAL, context.GEN_TERRAN,
               context.SUMMON_ELEMENTAL)
    ENC_LEVEL = 12

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

    TECHNIQUES = (invocations.MPInvocation(
        "Earthquake",
        effects.TargetIsEnemy(anim=animobs.EarthBoom,
                              on_true=(effects.OpposedRoll(
                                  def_stat=stats.REFLEXES,
                                  on_success=(effects.HealthDamage(
                                      (5, 6, 0),
                                      stat_bonus=stats.INTELLIGENCE,
                                      element=stats.RESIST_CRUSHING,
                                      anim=animobs.RedBoom), ),
                                  on_failure=(effects.HealthDamage(
                                      (1, 12, 0),
                                      stat_bonus=None,
                                      element=stats.RESIST_CRUSHING,
                                      anim=animobs.RedBoom), )), )),
        mp_cost=15,
        com_tar=targetarea.SelfCentered(radius=8,
                                        delay_from=-1,
                                        exclude_middle=True),
        ai_tar=invocations.TargetEnemy()), )

    def init_monster(self):
        self.levels.append(base.Beast(12, self))
Пример #30
0
class Basilisk( base.Monster ):
    name = "Basilisk"
    statline = { stats.STRENGTH: 15, stats.TOUGHNESS: 15, stats.REFLEXES: 8, \
        stats.INTELLIGENCE: 2, stats.PIETY: 12, stats.CHARISMA: 11 }
    SPRITENAME = "monster_default.png"
    FRAME = 39
    TEMPLATES = (stats.REPTILE,)
    MOVE_POINTS = 8
    VOICE = None
    HABITAT = ( context.HAB_EVERY, context.SET_EVERY,
     context.MTY_BEAST, context.MTY_BOSS )
    ENC_LEVEL = 6
    ATTACK = items.Attack( (1,8,0), element = stats.RESIST_PIERCING )
    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=4), shot_anim=animobs.PurpleVortex, ai_tar=invocations.TargetEnemy(), mp_cost=6
    ), )
    def init_monster( self ):
        self.levels.append( base.Beast( 6, self ) )