class LongbowArrow(Arrow): name = "Longbow Arrow" ammunition_type = Arrow ammunition_damage = dice.D6(1) price = coins.Silver(1) weight = units.Pound(0.1)
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)
class Warhammer(Bludgeon): name = "Maul" melee_damage = dice.D6(1) price = coins.Gold(4) size = Size.Small weight = units.Pound(6)
class Spear(MeleeWeapon): name = "Spear" melee_damage = dice.D6(1) price = coins.Gold(5) size = Size.Medium weight = units.Pound(5)
class Quarterstaff(Staff): name = "Quarterstaff" melee_damage = dice.D6(1) price = coins.Gold(2) size = Size.Large weight = units.Pound(4)
class LightMace(Bludgeon): name = "Light Mace" melee_damage = dice.D6(1) price = coins.Gold(5) size = Size.Small weight = units.Pound(5)
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
class Shortsword(Sword): name = "Shortsword" melee_damage = dice.D6(1) price = coins.Gold(6) size = Size.Small weight = units.Pound(3)
class LightQuarrel(Bolt): name = "Light Quarrel" ammunition_type = Bolt ammunition_damage = dice.D6(1) price = coins.Silver(2) weight = units.Pound(0.1)
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
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)
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
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
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
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
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
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)
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))
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
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
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)
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
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
class Arrow(Trap): name = "Arrow Trap" attack = WeaponAttack(dice.D6(1, flat_bonus=1), attack_bonus=1) target_type = targettypes.Touch
class Portcullis(Trap): name = "Portcullis Trap" attack = Attack(dice.D6(3)) saving_throw = savingthrows.DeathPoison target_type = targettypes.Touch
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))
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)
class ShortbowArrow(Arrow): name = "Shortbow Arrow" damage = dice.D6(1) price = coins.Silver(1) weight = units.Pound(0.1)
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))))