Exemple #1
0
class LongbowArrow(Arrow):
    name = "Longbow Arrow"

    ammunition_type = Arrow
    ammunition_damage = dice.D6(1)
    price = coins.Silver(1)
    weight = units.Pound(0.1)
Exemple #2
0
class PotionOfHealing(Potion):
    name = "Potion of Healing"

    effect = effects.Healing(units.CombatRound(0), dice.D6(1, 1))
    price = None
    size = Size.Small
    weight = units.Pound(0.5)
Exemple #3
0
class Warhammer(Bludgeon):
    name = "Maul"

    melee_damage = dice.D6(1)
    price = coins.Gold(4)
    size = Size.Small
    weight = units.Pound(6)
Exemple #4
0
class Spear(MeleeWeapon):
    name = "Spear"

    melee_damage = dice.D6(1)
    price = coins.Gold(5)
    size = Size.Medium
    weight = units.Pound(5)
Exemple #5
0
class Quarterstaff(Staff):
    name = "Quarterstaff"

    melee_damage = dice.D6(1)
    price = coins.Gold(2)
    size = Size.Large
    weight = units.Pound(4)
Exemple #6
0
class LightMace(Bludgeon):
    name = "Light Mace"

    melee_damage = dice.D6(1)
    price = coins.Gold(5)
    size = Size.Small
    weight = units.Pound(5)
Exemple #7
0
class GiantAnt(Ant):
    name = "Giant Ant"
    hit_dice = dice.D8(4)

    attack_bonus = AttackBonusTable.get_by_hit_dice(hit_dice.amount)
    attack_sets = [AttackSet(Bite(dice.D6(2)))]
    base_armor_class = 17
    morale = 7
    movement = movement.MovementSet(walk=units.FeetPerGameTurn(60), turning_distance=units.Feet(10))
    no_appearing = AppearingSet(dice_dungeon=dice.D6(2), dice_wild=dice.D6(2), dice_lair=dice.D6(4))
    save_as = Fighter.level_table.levels[hit_dice.amount].saving_throws_set
    size = Size.Medium
    special_abilities = specialabilities.CombatFrenzy,
    treasure_type = TreasureType.U
    weight = units.Pound(200)
    xp = 25
Exemple #8
0
class Shortsword(Sword):
    name = "Shortsword"

    melee_damage = dice.D6(1)
    price = coins.Gold(6)
    size = Size.Small
    weight = units.Pound(3)
Exemple #9
0
class LightQuarrel(Bolt):
    name = "Light Quarrel"

    ammunition_type = Bolt
    ammunition_damage = dice.D6(1)
    price = coins.Silver(2)
    weight = units.Pound(0.1)
Exemple #10
0
class GiantBombardierBeetle(Beetle):
    name = "Giant Bombardier Beetle"
    hit_dice = dice.D8(2)

    attack_bonus = AttackBonusTable.get_by_hit_dice(hit_dice.amount)
    attack_sets = [AttackSet(Bite(dice.D4(1)))]
    base_armor_class = 16
    morale = 9
    movement = movement.MovementSet(walk=units.FeetPerGameTurn(10), fly=units.Feet(50))
    no_appearing = AppearingSet(dice_dungeon=dice.D6(1), dice_wild=dice.D6(1), dice_lair=dice.D6(5))
    save_as = Fighter.level_table.levels[hit_dice.amount].saving_throws_set
    size = Size.Small
    special_abilities = specialabilities.CombatFrenzy,
    treasure_type = TreasureType.Special
    weight = units.Pound(50)
    xp = 13
Exemple #11
0
class Lantern(LightItem):
    name = "Lantern"

    bright_light_radius = units.Feet(30)
    dim_light_radius = units.Feet(20)
    fuel = items.weapons.throwing.common.OilFlask
    fuel_duration = units.GameTurn(18)
    last_life_dice = dice.D6(1)
    light_shape = Shape.Circle
    price = coins.Gold(5)
    weight = units.Pound(2)
Exemple #12
0
class CarnivorousApe(Animal):
    name = "Carnivorous Ape"
    hit_dice = dice.D8(4)
    attack_bonus = AttackBonusTable.get_by_hit_dice(hit_dice.amount)
    attack_sets = [AttackSet(Claw(dice.D4(1)), amount=2)]
    base_armor_class = 14

    morale = 7
    movement = movement.MovementSet(walk=units.FeetPerGameTurn(40))
    no_appearing = AppearingSet(dice_dungeon=dice.D6(1), dice_wild=dice.D4(2), dice_lair=dice.D4(2))
    save_as = Fighter.level_table.levels[hit_dice.amount].saving_throws_set
    xp = 240
Exemple #13
0
class BlackBear(Bear):
    name = "Black Bear"
    hit_dice = dice.D8(4)
    attack_bonus = AttackBonusTable.get_by_hit_dice(hit_dice.amount)
    attack_sets = [
        AttackChain(
            AttackSet(Claw(dice.D4(1)), amount=2, special_properties=specialproperties.BearHug),
            AttackSet(Bite(dice.D6(1)))
        ),
        AttackSet(Crush(dice.D6(2)))
    ]
    base_armor_class = 14

    morale = 7
    movement = movement.MovementSet(walk=units.FeetPerGameTurn(40))
    no_appearing = AppearingSet(dice_dungeon=dice.D4(1), dice_wild=dice.D4(1), dice_lair=dice.D4(1))
    save_as = Fighter.level_table.levels[hit_dice.amount].saving_throws_set
    special_abilities = SpecialAbilitySet((LastBreath,))
    size = Size.Large
    weight = units.Pound(200)
    xp = 240
Exemple #14
0
class Moose(Animal):
    name = "Moose"
    hit_dice = dice.D8(3)
    attack_bonus = AttackBonusTable.get_by_hit_dice(hit_dice.amount)
    attack_sets = [AttackSet(Headbutt(dice.D6(1)))]
    base_armor_class = 13

    morale = 5
    movement = movement.MovementSet(walk=units.FeetPerGameTurn(80), turning_distance=units.Feet(10))
    no_appearing = AppearingSet(dice_wild=dice.D10(3))
    save_as = Fighter.level_table.levels[hit_dice.amount].saving_throws_set
    xp = 145
Exemple #15
0
class Basilisk(Reptilian):
    name = "Basilisk"
    hit_dice = dice.D8(6)

    attack_bonus = AttackBonusTable.get_by_hit_dice(hit_dice.amount)
    attack_sets = [
        AttackSet(Bite(dice.D10(1))),
        AttackSet(Gaze(None), special_properties=specialproperties.Petrify)
    ]
    base_armor_class = 16
    morale = 9
    movement = movement.MovementSet(walk=units.FeetPerGameTurn(20),
                                    turning_distance=units.Feet(10))
    no_appearing = AppearingSet(dice_dungeon=dice.D6(1),
                                dice_wild=dice.D6(1),
                                dice_lair=dice.D6(1))
    save_as = Fighter.level_table.levels[hit_dice.amount].saving_throws_set
    size = Size.Large
    special_abilities = specialabilities.CombatFrenzy,
    treasure_type = TreasureType.F
    weight = units.Pound(300)
    xp = 610
Exemple #16
0
class Auroch(Antelope):
    name = "Auroch"
    hit_dice = dice.D8(2)
    attack_bonus = AttackBonusTable.get_by_hit_dice(hit_dice.amount)
    attack_sets = [AttackSet(Headbutt(dice.D6(1)))]
    base_armor_class = 13

    morale = 5
    movement = movement.MovementSet(walk=units.FeetPerGameTurn(80), turning_distance=units.Feet(10))
    no_appearing = AppearingSet(dice_wild=dice.D10(3))
    save_as = Fighter.level_table.levels[hit_dice.amount].saving_throws_set
    size = Size.Large
    weight = units.Pound(1000)
    xp = 75
Exemple #17
0
 def update(self, game_object):
     """
     At Each Update it deals damage to the game_object and shows a message
     :param game_object:
     :return:
     """
     super().update(game_object)
     damage = dice.D6(self.power).roll_total()
     # TODO This should be elemental Fire Damage.
     context = contexts.Action(game_object, None)
     message = StringBuilder(Actor, Verb("burn", Actor),
                             "for %s damage!" % damage)
     game_object.game.echo.see(game_object, message, context)
     game_object.health.take_damage(damage)
Exemple #18
0
    def walk_somewhere_or_continue(cls, host, last_behavior):
        if last_behavior and not last_behavior.finished:
            return last_behavior

        if random.randint(0, 100) < 10:
            level = host.location.level
            target_coordinate = (
                random.randint(1, level.max_x),
                random.randint(1, level.max_y)
            )
    
            return behaviors.Move(host, target_coordinate)
        else:
            return behaviors.Wait(host, dice.D6(1))
Exemple #19
0
class WarHorse(Horse):
    name = "War Horse"
    attack_bonus = AttackBonusTable.get_by_hit_dice(3)
    attack_sets = [AttackSet(Hoof(dice.D6(1)), amount=2)]
    base_armor_class = 13
    carry_capacity = CarryCapacity(units.Pound(250), units.Pound(500))
    hit_dice = dice.D8(3)
    morale = 9
    movement = movement.MovementSet(walk=units.FeetPerGameTurn(60),
                                    turning_distance=units.Feet(10))
    no_appearing = None
    save_as = Fighter.level_table.levels[3].saving_throws_set
    special_abilities = None
    treasure_type = None
    xp = 145
Exemple #20
0
class Orc(Humanoid):
    name = "Orc"
    hit_dice = dice.D8(1)
    attack_bonus = AttackBonusTable.get_by_hit_dice(1)
    attack_sets = None
    base_armor_class = 11

    morale = 8
    movement = movement.MovementSet(walk=units.FeetPerGameTurn(40))
    no_appearing = AppearingSet(dice_dungeon=dice.D4(2),
                                dice_wild=dice.D6(3),
                                dice_lair=dice.D10(6))
    save_as = Fighter.level_table.levels[hit_dice.amount].saving_throws_set
    special_abilities = SpecialAbilitySet((Darkvision, ))
    size = Size.Medium
    weight = units.Pound(210)
    xp = 25
Exemple #21
0
class GemsAndJewelryQualityTable(object):
    rows = [
        GJQRow(0, 20, QualityType.Ornamental, 10, dice.D10(1)),
        GJQRow(21, 45, QualityType.Semiprecious, 50, dice.D8(1)),
        GJQRow(46, 75, QualityType.Fancy, 100, dice.D6(1)),
        GJQRow(76, 95, QualityType.Precious, 500, dice.D4(1)),
        GJQRow(96, 100, QualityType.Gem, 1000, dice.D2(1)),
        GJQRow(None, None, QualityType.Fancy, 5000, 1),
    ]
    _inner_table = {row.quality_type: row for row in rows}

    @classmethod
    def get_row_from_percent(cls, percent):
        return next((row for row in cls.rows
                     if row.min_percent <= percent <= row.max_percent))

    @classmethod
    def get_row_from_quality(cls, quality_type):
        return cls._inner_table.get(quality_type)
Exemple #22
0
class Skeleton(Undead):
    name = "Skeleton"
    hit_dice = dice.D8(1)

    attack_bonus = AttackBonusTable.get_by_hit_dice(hit_dice.amount)
    base_armor_class = 13
    morale = 12
    movement = movement.MovementSet(walk=units.FeetPerGameTurn(40))
    no_appearing = AppearingSet(dice_dungeon=dice.D6(3), dice_wild=dice.D10(3))
    save_as = Fighter.level_table.levels[hit_dice.amount].saving_throws_set
    size = Size.Medium
    special_abilities = (specialabilities.EdgedWeaponResistance,
                         specialabilities.ProjectileResistance,
                         specialabilities.SleepImmunity,
                         specialabilities.CharmImmunity,
                         specialabilities.HoldImmunity,
                         specialabilities.Mindless)
    treasure_type = None
    weight = units.Pound(100)
    xp = 25
Exemple #23
0
class PolarBear(Animal):
    name = "Polar Bear"
    hit_dice = dice.D8(6)
    attack_bonus = AttackBonusTable.get_by_hit_dice(hit_dice.amount)
    attack_sets = [
        AttackChain(
            AttackSet(Claw(dice.D6(1)),
                      amount=2,
                      special_properties=specialproperties.BearHug),
            AttackSet(Bite(dice.D10(1)))),
        AttackSet(Crush(dice.D8(2)))
    ]
    base_armor_class = 14

    morale = 8
    movement = movement.MovementSet(walk=units.FeetPerGameTurn(40))
    no_appearing = AppearingSet(dice_dungeon=dice.D1(1),
                                dice_wild=dice.D2(1),
                                dice_lair=dice.D2(1))
    save_as = Fighter.level_table.levels[hit_dice.amount].saving_throws_set
    special_abilities = SpecialAbilitySet((LastBreath, ))
    xp = 500
Exemple #24
0
class Arrow(Trap):
    name = "Arrow Trap"
    attack = WeaponAttack(dice.D6(1, flat_bonus=1), attack_bonus=1)
    target_type = targettypes.Touch
Exemple #25
0
class Portcullis(Trap):
    name = "Portcullis Trap"
    attack = Attack(dice.D6(3))
    saving_throw = savingthrows.DeathPoison
    target_type = targettypes.Touch
Exemple #26
0
class RollingBoulder(Trap):
    name = "Rolling Boulder Trap"
    attack = Attack(dice.D6(2))
    saving_throw = savingthrows.DeathPoison
    target_type = targettypes.AreaOfEffect(Shape.Line, units.Feet(1000))
Exemple #27
0
class TreasureTable(object):
    rows = [
        TreasureRow(TreasureType.A,
                    TreasureElement(50, coins.Copper, dice.D6(5)),
                    TreasureElement(60, coins.Silver, dice.D6(5)),
                    TreasureElement(40, coins.Electrum, dice.D4(5)),
                    TreasureElement(70, coins.Gold, dice.D6(10)),
                    TreasureElement(50, coins.Platinum, dice.D10(1)),
                    TreasureElement(50, (Gem, ), dice.D6(6)),
                    TreasureElement(50, (Jewelry, ), dice.D6(6)),
                    TreasureElement(30, (RandomMagicItem, ), 3)),
        TreasureRow(TreasureType.B,
                    TreasureElement(75, coins.Copper, dice.D10(5)),
                    TreasureElement(50, coins.Silver, dice.D6(5)),
                    TreasureElement(50, coins.Electrum, dice.D4(5)),
                    TreasureElement(50, coins.Gold, dice.D6(3)),
                    TreasureElement(25, Gem, dice.D6(1)),
                    TreasureElement(25, Jewelry, dice.D6(1)),
                    TreasureElement(10, (
                        Armor,
                        Weapon,
                    ), 1)),
        TreasureRow(TreasureType.C,
                    TreasureElement(60, coins.Copper, dice.D6(6)),
                    TreasureElement(60, coins.Silver, dice.D4(5)),
                    TreasureElement(30, coins.Electrum, dice.D6(2)),
                    TreasureElement(25, Gem, dice.D4(1)),
                    TreasureElement(25, Jewelry, dice.D4(1)),
                    TreasureElement(15, (
                        Armor,
                        Weapon,
                    ), dice.D2(1))),
        TreasureRow(TreasureType.D,
                    TreasureElement(30, coins.Copper, dice.D6(4)),
                    TreasureElement(45, coins.Silver, dice.D6(6)),
                    TreasureElement(90, coins.Gold, dice.D8(5)),
                    TreasureElement(30, Gem, dice.D8(1)),
                    TreasureElement(30, Jewelry, dice.D8(1)),
                    TreasureElement(20, RandomMagicItem, dice.D2(1), Potion)),
        TreasureRow(
            TreasureType.E, TreasureElement(30, coins.Copper, dice.D8(2)),
            TreasureElement(60, coins.Silver, dice.D6(10)),
            TreasureElement(50, coins.Electrum, dice.D8(3)),
            TreasureElement(50, coins.Gold, dice.D10(4)),
            TreasureElement(10, Gem, dice.D10(1)),
            TreasureElement(10, Jewelry, dice.D10(1)),
            TreasureElement(30, RandomMagicItem, dice.D4(1), MagicScroll)),
        TreasureRow(
            TreasureType.F, TreasureElement(40, coins.Silver, dice.D8(3)),
            TreasureElement(50, coins.Electrum, dice.D8(4)),
            TreasureElement(85, coins.Gold, dice.D10(6)),
            TreasureElement(70, coins.Platinum, dice.D8(2)),
            TreasureElement(20, Gem, dice.D12(2)),
            TreasureElement(10, Jewelry, dice.D12(1)),
            TreasureElement(35, RandomMagicItem, dice.D4(1), Potion,
                            MagicScroll)),
        TreasureRow(
            TreasureType.G,
            TreasureElement(90, coins.Gold, dice.D6(4, multiplier=10)),
            TreasureElement(75, coins.Platinum, dice.D8(5)),
            TreasureElement(25, Gem, dice.D6(3)),
            TreasureElement(25, Jewelry, dice.D10(1)),
            TreasureElement(50, RandomMagicItem, dice.D4(1), MagicScroll)),
        TreasureRow(
            TreasureType.H, TreasureElement(75, coins.Copper, dice.D10(8)),
            TreasureElement(75, coins.Silver, dice.D10(6, multiplier=10)),
            TreasureElement(75, coins.Electrum, dice.D10(3, multiplier=10)),
            TreasureElement(75, coins.Gold, dice.D8(5, multiplier=10)),
            TreasureElement(75, coins.Platinum, dice.D8(9)),
            TreasureElement(50, Gem, dice.D100(1)),
            TreasureElement(50, Jewelry, dice.D4(10)),
            TreasureElement(20, RandomMagicItem, dice.D4(1), Potion,
                            MagicScroll)),
        TreasureRow(TreasureType.I,
                    TreasureElement(80, coins.Platinum, dice.D10(3)),
                    TreasureElement(50, Gem, dice.D6(2)),
                    TreasureElement(50, Jewelry, dice.D6(2)),
                    TreasureElement(15, RandomMagicItem, 1)),
        TreasureRow(
            TreasureType.J,
            TreasureElement(45, coins.Copper, dice.D8(3)),
            TreasureElement(45, coins.Silver, dice.D8(1)),
        ),
        TreasureRow(
            TreasureType.K,
            TreasureElement(90, coins.Silver, dice.D10(2)),
            TreasureElement(35, coins.Electrum, dice.D8(1)),
        ),
        TreasureRow(
            TreasureType.L,
            TreasureElement(50, Gem, dice.D4(1)),
        ),
        TreasureRow(
            TreasureType.M,
            TreasureElement(90, coins.Gold, dice.D10(4)),
            TreasureElement(90, coins.Platinum, dice.D8(2, multiplier=10)),
            TreasureElement(55, Gem, dice.D4(5)),
            TreasureElement(45, Jewelry, dice.D6(2)),
        ),
        TreasureRow(
            TreasureType.N,
            TreasureElement(40, Potion, dice.D4(2)),
        ),
        TreasureRow(
            TreasureType.O,
            TreasureElement(50, MagicScroll, dice.D4(1)),
        ),
        TreasureRow(
            TreasureType.P,
            TreasureElement(100, coins.Copper, dice.D8(3)),
        ),
        TreasureRow(
            TreasureType.Q,
            TreasureElement(100, coins.Silver, dice.D6(3)),
        ),
        TreasureRow(
            TreasureType.R,
            TreasureElement(100, coins.Electrum, dice.D6(2)),
        ),
        TreasureRow(
            TreasureType.S,
            TreasureElement(100, coins.Gold, dice.D4(2)),
        ),
        TreasureRow(
            TreasureType.T,
            TreasureElement(100, coins.Platinum, dice.D6(1)),
        ),
        TreasureRow(
            TreasureType.U,
            TreasureElement(50, coins.Copper, dice.D20(1)),
            TreasureElement(50, coins.Silver, dice.D20(1)),
            TreasureElement(25, coins.Gold, dice.D20(1)),
            TreasureElement(5, Gem, dice.D4(1)),
            TreasureElement(5, Jewelry, dice.D4(1)),
            TreasureElement(2, RandomMagicItem, 1),
        ),
        TreasureRow(
            TreasureType.V,
            TreasureElement(25, coins.Silver, dice.D20(1)),
            TreasureElement(25, coins.Electrum, dice.D20(1)),
            TreasureElement(50, coins.Gold, dice.D20(1)),
            TreasureElement(25, coins.Platinum, dice.D20(1)),
            TreasureElement(10, Gem, dice.D4(1)),
            TreasureElement(10, Jewelry, dice.D4(1)),
            TreasureElement(5, RandomMagicItem, 1),
        ),
    ]
    inner_table = {row.treasure_type: row for row in rows}

    @classmethod
    def get_row(cls, treasure_type):
        """
        :type treasure_type: TreasureType
        :rtype: TreasureRow
        """
        return cls.inner_table.get(treasure_type)
Exemple #28
0
class ShortbowArrow(Arrow):
    name = "Shortbow Arrow"

    damage = dice.D6(1)
    price = coins.Silver(1)
    weight = units.Pound(0.1)
Exemple #29
0
class Cleric(CharacterClass):
    name = "Cleric"
    restriction_set = restrictions.RestrictionSet(
        ability_score=restrictions.AbilityScoreRestrictionSet(
            minimum_set=abilityscores.AbilityScoreSet(wisdom=9)),
        weapons=restrictions.WeaponRestrictionSet(
            included=(weapons.types.Club, weapons.types.Mace,
                      weapons.types.Maul, weapons.types.Quarterstaff,
                      weapons.types.Sling, weapons.types.Warhammer)))
    special_abilities = specialabilities.SpecialAbilitySet(
        special_abilities=(specialabilities.DivineCaster,
                           specialabilities.TurnUndead))
    level_table = LevelTable(levels=(
        Level(value=1,
              attack_bonus=1,
              experience_required=0,
              hit_dice=dice.D6(1),
              saving_throws_set=SavingThrowSet(death_poison=11,
                                               dragon_breath=16,
                                               paralysis_stone=14,
                                               spells=15,
                                               wands=12)),
        Level(value=2,
              attack_bonus=1,
              experience_required=1500,
              hit_dice=dice.D6(2),
              saving_throws_set=SavingThrowSet(death_poison=10,
                                               dragon_breath=15,
                                               paralysis_stone=13,
                                               spells=14,
                                               wands=11),
              spell_slots_set=SpellSlotSet(level_1=1)),
        Level(value=3,
              attack_bonus=2,
              experience_required=3000,
              hit_dice=dice.D6(3),
              saving_throws_set=SavingThrowSet(death_poison=10,
                                               dragon_breath=15,
                                               paralysis_stone=13,
                                               spells=14,
                                               wands=11),
              spell_slots_set=SpellSlotSet(level_1=2)),
        Level(value=4,
              attack_bonus=2,
              experience_required=6000,
              hit_dice=dice.D6(4),
              saving_throws_set=SavingThrowSet(death_poison=9,
                                               dragon_breath=15,
                                               paralysis_stone=13,
                                               spells=14,
                                               wands=10),
              spell_slots_set=SpellSlotSet(level_1=2, level_2=1)),
        Level(value=5,
              attack_bonus=3,
              experience_required=12000,
              hit_dice=dice.D6(5),
              saving_throws_set=SavingThrowSet(death_poison=9,
                                               dragon_breath=15,
                                               paralysis_stone=13,
                                               spells=14,
                                               wands=10),
              spell_slots_set=SpellSlotSet(level_1=2, level_2=2)),
        Level(value=6,
              attack_bonus=3,
              experience_required=24000,
              hit_dice=dice.D6(6),
              saving_throws_set=SavingThrowSet(death_poison=9,
                                               dragon_breath=14,
                                               paralysis_stone=12,
                                               spells=13,
                                               wands=10),
              spell_slots_set=SpellSlotSet(level_1=2, level_2=2, level_3=1)),
        Level(value=7,
              attack_bonus=4,
              experience_required=48000,
              hit_dice=dice.D6(7),
              saving_throws_set=SavingThrowSet(death_poison=9,
                                               dragon_breath=14,
                                               paralysis_stone=12,
                                               spells=13,
                                               wands=10),
              spell_slots_set=SpellSlotSet(level_1=3, level_2=2, level_3=2)),
        Level(value=8,
              attack_bonus=4,
              experience_required=90000,
              hit_dice=dice.D6(8),
              saving_throws_set=SavingThrowSet(death_poison=8,
                                               dragon_breath=14,
                                               paralysis_stone=12,
                                               spells=13,
                                               wands=9),
              spell_slots_set=SpellSlotSet(
                  level_1=3, level_2=2, level_3=2, level_4=1)),
        Level(value=9,
              attack_bonus=5,
              experience_required=180000,
              hit_dice=dice.D6(9),
              saving_throws_set=SavingThrowSet(death_poison=8,
                                               dragon_breath=14,
                                               paralysis_stone=12,
                                               spells=13,
                                               wands=9),
              spell_slots_set=SpellSlotSet(
                  level_1=3, level_2=3, level_3=2, level_4=2)),
        Level(value=10,
              attack_bonus=5,
              experience_required=270000,
              hit_dice=dice.D6(9),
              hit_dice_flat_bonus=1,
              saving_throws_set=SavingThrowSet(death_poison=8,
                                               dragon_breath=13,
                                               paralysis_stone=11,
                                               spells=12,
                                               wands=9),
              spell_slots_set=SpellSlotSet(
                  level_1=3, level_2=3, level_3=2, level_4=2, level_5=1)),
        Level(value=11,
              attack_bonus=5,
              experience_required=360000,
              hit_dice=dice.D6(9),
              hit_dice_flat_bonus=2,
              saving_throws_set=SavingThrowSet(death_poison=8,
                                               dragon_breath=13,
                                               paralysis_stone=11,
                                               spells=12,
                                               wands=9),
              spell_slots_set=SpellSlotSet(
                  level_1=4, level_2=3, level_3=3, level_4=2, level_5=2)),
        Level(value=12,
              attack_bonus=6,
              experience_required=450000,
              hit_dice=dice.D6(9),
              hit_dice_flat_bonus=3,
              saving_throws_set=SavingThrowSet(death_poison=7,
                                               dragon_breath=13,
                                               paralysis_stone=11,
                                               spells=12,
                                               wands=8),
              spell_slots_set=SpellSlotSet(level_1=4,
                                           level_2=4,
                                           level_3=3,
                                           level_4=2,
                                           level_5=2,
                                           level_6=1)),
        Level(value=13,
              attack_bonus=6,
              experience_required=540000,
              hit_dice=dice.D6(9),
              hit_dice_flat_bonus=4,
              saving_throws_set=SavingThrowSet(death_poison=7,
                                               dragon_breath=13,
                                               paralysis_stone=11,
                                               spells=12,
                                               wands=8),
              spell_slots_set=SpellSlotSet(level_1=4,
                                           level_2=4,
                                           level_3=3,
                                           level_4=3,
                                           level_5=2,
                                           level_6=2)),
        Level(value=14,
              attack_bonus=6,
              experience_required=630000,
              hit_dice=dice.D6(9),
              hit_dice_flat_bonus=5,
              saving_throws_set=SavingThrowSet(death_poison=7,
                                               dragon_breath=12,
                                               paralysis_stone=10,
                                               spells=11,
                                               wands=8),
              spell_slots_set=SpellSlotSet(level_1=4,
                                           level_2=4,
                                           level_3=4,
                                           level_4=3,
                                           level_5=2,
                                           level_6=2)),
        Level(value=15,
              attack_bonus=7,
              experience_required=720000,
              hit_dice=dice.D6(9),
              hit_dice_flat_bonus=6,
              saving_throws_set=SavingThrowSet(death_poison=7,
                                               dragon_breath=12,
                                               paralysis_stone=10,
                                               spells=11,
                                               wands=8),
              spell_slots_set=SpellSlotSet(level_1=4,
                                           level_2=4,
                                           level_3=4,
                                           level_4=3,
                                           level_5=3,
                                           level_6=2)),
        Level(value=16,
              attack_bonus=7,
              experience_required=810000,
              hit_dice=dice.D6(9),
              hit_dice_flat_bonus=7,
              saving_throws_set=SavingThrowSet(death_poison=6,
                                               dragon_breath=12,
                                               paralysis_stone=10,
                                               spells=11,
                                               wands=7),
              spell_slots_set=SpellSlotSet(level_1=5,
                                           level_2=4,
                                           level_3=4,
                                           level_4=3,
                                           level_5=3,
                                           level_6=2)),
        Level(value=17,
              attack_bonus=7,
              experience_required=900000,
              hit_dice=dice.D6(9),
              hit_dice_flat_bonus=8,
              saving_throws_set=SavingThrowSet(death_poison=6,
                                               dragon_breath=12,
                                               paralysis_stone=10,
                                               spells=11,
                                               wands=7),
              spell_slots_set=SpellSlotSet(level_1=5,
                                           level_2=5,
                                           level_3=4,
                                           level_4=3,
                                           level_5=3,
                                           level_6=2)),
        Level(value=18,
              attack_bonus=8,
              experience_required=990000,
              hit_dice=dice.D6(9),
              hit_dice_flat_bonus=9,
              saving_throws_set=SavingThrowSet(death_poison=6,
                                               dragon_breath=11,
                                               paralysis_stone=9,
                                               spells=10,
                                               wands=7),
              spell_slots_set=SpellSlotSet(level_1=5,
                                           level_2=5,
                                           level_3=4,
                                           level_4=4,
                                           level_5=3,
                                           level_6=3)),
        Level(value=19,
              attack_bonus=8,
              experience_required=1080000,
              hit_dice=dice.D6(9),
              hit_dice_flat_bonus=10,
              saving_throws_set=SavingThrowSet(death_poison=6,
                                               dragon_breath=11,
                                               paralysis_stone=9,
                                               spells=10,
                                               wands=7),
              spell_slots_set=SpellSlotSet(level_1=6,
                                           level_2=5,
                                           level_3=4,
                                           level_4=4,
                                           level_5=3,
                                           level_6=3)),
        Level(value=20,
              attack_bonus=8,
              experience_required=1170000,
              hit_dice=dice.D6(9),
              hit_dice_flat_bonus=11,
              saving_throws_set=SavingThrowSet(death_poison=5,
                                               dragon_breath=11,
                                               paralysis_stone=9,
                                               spells=10,
                                               wands=6),
              spell_slots_set=SpellSlotSet(level_1=6,
                                           level_2=5,
                                           level_3=5,
                                           level_4=4,
                                           level_5=3,
                                           level_6=3))))