class Bugbear(CharacterClass): name = "Bugbear" restriction_set = restrictions.RestrictionSet( armor=restrictions.ArmorRestrictionSet(included=(LeatherArmor, ))) level_table = LevelTable(levels=( Level( value=-1, attack_bonus=1, experience_required=-3000, hit_dice=dice.D8(1), saving_throws_set=Fighter.level_table.get(1).saving_throws_set, ), Level(value=0, attack_bonus=2, experience_required=-1500, hit_dice=dice.D8(2), saving_throws_set=Fighter.level_table.get(1).saving_throws_set), Level( value=1, attack_bonus=2, experience_required=0, hit_dice=dice.D8(2), saving_throws_set=Fighter.level_table.get(1).saving_throws_set, special_ability_set=SpecialAbilitySet(( specialabilities.BugBearStealth, specialabilities.MoveSilently(20), specialabilities.Hide(10))), )))
class Bison(Animal): name = "Bison" hit_dice = dice.D8(4) attack_bonus = AttackBonusTable.get_by_hit_dice(hit_dice.amount) attack_sets = [AttackSet(Headbutt(dice.D8(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 = 240
class Mace(Bludgeon): name = "Mace" melee_damage = dice.D8(1) price = coins.Gold(6) size = Size.Medium weight = units.Pound(10)
class Longsword(Sword): name = "Longsword" melee_damage = dice.D8(1) price = coins.Gold(10) size = Size.Medium weight = units.Pound(4)
class Scimitar(Sword): name = "Scimitar" melee_damage = dice.D8(1) price = coins.Gold(10) size = Size.Medium weight = units.Pound(4)
class BattleAxe(Axe): name = "Battle Axe" melee_damage = dice.D8(1) price = coins.Gold(7) size = Size.Medium weight = units.Pound(7)
class HeavyQuarrel(Bolt): name = "Heavy Quarrel" ammunition_type = Bolt ammunition_damage = dice.D8(1) price = coins.Silver(4) weight = units.Pound(0.1)
class Gnoll(CharacterClass): name = "Gnoll" restriction_set = restrictions.RestrictionSet( armor=restrictions.ArmorRestrictionSet(included=(LeatherArmor, ))) level_table = LevelTable(levels=( Level(value=0, attack_bonus=1, experience_required=-1500, hit_dice=dice.D8(1), saving_throws_set=Fighter.level_table.get(1).saving_throws_set), Level( value=1, attack_bonus=2, experience_required=0, hit_dice=dice.D8(2), saving_throws_set=Fighter.level_table.get(1).saving_throws_set, )))
class AssassinVine(Plant): name = "Assassin Vine" hit_dice = dice.D8(6) attack_bonus = AttackBonusTable.get_by_hit_dice(hit_dice.amount) attack_sets = [ AttackSet(Crush(dice.D8(1)), special_properties=(CrushingEntanglement, )) ] base_armor_class = 15 morale = 12 movement = movement.MovementSet(walk=units.FeetPerGameTurn(5)) no_appearing = AppearingSet(dice_dungeon=dice.D4(1, 1)) save_as = Fighter.level_table.levels[hit_dice.amount].saving_throws_set size = Size.Small treasure_type = TreasureType.U weight = units.Pound(15) xp = 500
class PolarBear(Bear): 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,)) size = Size.Large weight = units.Pound(992) xp = 500
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 CaveBear(Animal): name = "Cave Bear" hit_dice = dice.D8(7) attack_bonus = AttackBonusTable.get_by_hit_dice(hit_dice.amount) attack_sets = [ AttackChain( AttackSet(Claw(dice.D8(1)), amount=2, special_properties=specialproperties.BearHug), AttackSet(Bite(dice.D6(2)))), AttackSet(Crush(dice.D8(2))) ] base_armor_class = 15 morale = 9 movement = movement.MovementSet(walk=units.FeetPerGameTurn(40)) no_appearing = AppearingSet(dice_dungeon=dice.D2(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 = 670
class Moose(Antelope): 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 size = Size.Large weight = units.Pound(1190) xp = 145
class Pony(Horse): name = "Pony" attack_bonus = AttackBonusTable.get_by_hit_dice(1) attack_sets = [AttackSet(Bite(dice.D4(1)))] base_armor_class = 13 carry_capacity = CarryCapacity(units.Pound(275), units.Pound(550)) hit_dice = dice.D8(2) morale = 6 movement = movement.MovementSet(walk=units.FeetPerGameTurn(40), turning_distance=units.Feet(10)) no_appearing = None save_as = Fighter.level_table.levels[1].saving_throws_set special_abilities = None treasure_type = None xp = 25
class DraftHorse(Horse): name = "Draft Horse" attack_bonus = AttackBonusTable.get_by_hit_dice(3) attack_sets = [AttackSet(Hoof(dice.D4(1)), amount=2)] base_armor_class = 13 carry_capacity = CarryCapacity(units.Pound(350), units.Pound(700)) hit_dice = dice.D8(3) morale = 7 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 GiantBat(Animal): name = "Giant Bat" 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 = 14 morale = 8 movement = movement.MovementSet(walk=units.FeetPerGameTurn(10), fly=units.FeetPerGameTurn(60)) no_appearing = AppearingSet(dice_dungeon=dice.D10(1), dice_wild=dice.D10(1), dice_lair=dice.D10(1)) save_as = Fighter.level_table.levels[hit_dice.amount].saving_throws_set xp = 75
class Donkey(Horse): name = "Donkey" attack_bonus = AttackBonusTable.get_by_hit_dice(2) attack_sets = [AttackSet(Bite(dice.D2(1)))] base_armor_class = 13 carry_capacity = CarryCapacity(units.Pound(400), units.Pound(800)) hit_dice = dice.D8(2) morale = 7 movement = movement.MovementSet(walk=units.FeetPerGameTurn(40), turning_distance=units.Feet(10)) no_appearing = AppearingSet(dice_wild=dice.D4(2)) save_as = Fighter.level_table.levels[2].saving_throws_set special_abilities = None treasure_type = None xp = 75
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 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 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 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 Fighter(CharacterClass): name = "Fighter" restriction_set = restrictions.RestrictionSet( ability_score=restrictions.AbilityScoreRestrictionSet( minimum_set=abilityscores.AbilityScoreSet(strength=9)), ) level_table = LevelTable( levels=(Level(value=1, attack_bonus=1, experience_required=0, hit_dice=dice.D8(1), saving_throws_set=SavingThrowSet(death_poison=12, dragon_breath=15, paralysis_stone=14, spells=17, wands=13)), Level( value=2, attack_bonus=1, experience_required=2000, hit_dice=dice.D8(2), saving_throws_set=SavingThrowSet(death_poison=11, dragon_breath=15, paralysis_stone=14, spells=16, wands=12), ), Level( value=3, attack_bonus=1, experience_required=4000, hit_dice=dice.D8(3), saving_throws_set=SavingThrowSet(death_poison=11, dragon_breath=15, paralysis_stone=14, spells=16, wands=12), ), Level( value=4, attack_bonus=3, experience_required=8000, hit_dice=dice.D8(4), saving_throws_set=SavingThrowSet(death_poison=11, dragon_breath=14, paralysis_stone=13, spells=15, wands=11), ), Level( value=5, attack_bonus=4, experience_required=16000, hit_dice=dice.D8(5), saving_throws_set=SavingThrowSet(death_poison=11, dragon_breath=14, paralysis_stone=13, spells=15, wands=11), ), Level( value=6, attack_bonus=4, experience_required=32000, hit_dice=dice.D8(6), saving_throws_set=SavingThrowSet(death_poison=10, dragon_breath=14, paralysis_stone=12, spells=15, wands=11), ), Level( value=7, attack_bonus=5, experience_required=64000, hit_dice=dice.D8(7), saving_throws_set=SavingThrowSet(death_poison=10, dragon_breath=14, paralysis_stone=12, spells=15, wands=11), ), Level( value=8, attack_bonus=6, experience_required=120000, hit_dice=dice.D8(8), saving_throws_set=SavingThrowSet(death_poison=9, dragon_breath=13, paralysis_stone=12, spells=14, wands=10), ), Level( value=9, attack_bonus=6, experience_required=240000, hit_dice=dice.D8(9), saving_throws_set=SavingThrowSet(death_poison=9, dragon_breath=13, paralysis_stone=12, spells=14, wands=10), ), Level( value=10, attack_bonus=6, experience_required=360000, hit_dice=dice.D8(9), hit_dice_flat_bonus=2, saving_throws_set=SavingThrowSet(death_poison=9, dragon_breath=12, paralysis_stone=11, spells=13, wands=9), ), Level( value=11, attack_bonus=7, experience_required=480000, hit_dice=dice.D8(9), hit_dice_flat_bonus=4, saving_throws_set=SavingThrowSet(death_poison=9, dragon_breath=12, paralysis_stone=11, spells=13, wands=9), ), Level( value=12, attack_bonus=7, experience_required=600000, hit_dice=dice.D8(9), hit_dice_flat_bonus=6, saving_throws_set=SavingThrowSet(death_poison=8, dragon_breath=12, paralysis_stone=10, spells=13, wands=9), ), Level( value=13, attack_bonus=8, experience_required=720000, hit_dice=dice.D8(9), hit_dice_flat_bonus=8, saving_throws_set=SavingThrowSet(death_poison=8, dragon_breath=12, paralysis_stone=10, spells=13, wands=9), ), Level( value=14, attack_bonus=8, experience_required=840000, hit_dice=dice.D8(9), hit_dice_flat_bonus=10, saving_throws_set=SavingThrowSet(death_poison=7, dragon_breath=11, paralysis_stone=10, spells=12, wands=8), ), Level( value=15, attack_bonus=8, experience_required=960000, hit_dice=dice.D8(9), hit_dice_flat_bonus=12, saving_throws_set=SavingThrowSet(death_poison=7, dragon_breath=11, paralysis_stone=10, spells=12, wands=8), ), Level( value=16, attack_bonus=9, experience_required=1080000, hit_dice=dice.D8(9), hit_dice_flat_bonus=14, saving_throws_set=SavingThrowSet(death_poison=7, dragon_breath=10, paralysis_stone=9, spells=11, wands=7), ), Level( value=17, attack_bonus=9, experience_required=1200000, hit_dice=dice.D8(9), hit_dice_flat_bonus=16, saving_throws_set=SavingThrowSet(death_poison=7, dragon_breath=10, paralysis_stone=9, spells=11, wands=7), ), Level( value=18, attack_bonus=10, experience_required=1320000, hit_dice=dice.D8(9), hit_dice_flat_bonus=18, saving_throws_set=SavingThrowSet(death_poison=6, dragon_breath=10, paralysis_stone=8, spells=11, wands=7), ), Level( value=19, attack_bonus=10, experience_required=1440000, hit_dice=dice.D8(9), hit_dice_flat_bonus=20, saving_throws_set=SavingThrowSet(death_poison=6, dragon_breath=10, paralysis_stone=8, spells=11, wands=7), ), Level( value=20, attack_bonus=10, experience_required=1560000, hit_dice=dice.D8(9), hit_dice_flat_bonus=22, saving_throws_set=SavingThrowSet(death_poison=5, dragon_breath=9, paralysis_stone=8, spells=10, wands=6), )))
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 Blade(Trap): name = "Blade Trap" attack = WeaponAttack(dice.D8(1, flat_bonus=1), attack_bonus=1) target_type = targettypes.AreaOfEffect(Shape.Line, units.Feet(10))