diff --git a/osrlib/osrlib/treasure.py b/osrlib/osrlib/treasure.py index 645810a..9e9cb01 100644 --- a/osrlib/osrlib/treasure.py +++ b/osrlib/osrlib/treasure.py @@ -19,7 +19,7 @@ class TreasureDetail: """Defines the characteristics of a particular "unit" of treasure (coins, gems, magic items, ...) in a treasure type. - This class dictatd the attributes of each item type within a defined treasure type. It outlines the chance of + This class dictates the attributes of each item type within a defined treasure type. It outlines the chance of occurrence, the amount (in dice notation or a fixed number), and whether the item is magical. This class is used by the `Treasure` class, but you can also use it to customize the contents of treasure hauls by creating your own treasure types. @@ -138,10 +138,6 @@ class Treasure: ItemType.MAGIC_ITEM: TreasureDetail(chance=15, amount="6", magical=True), }, TreasureType.I: { - CoinType.COPPER: TreasureDetail(chance=0, amount="0"), - CoinType.SILVER: TreasureDetail(chance=0, amount="0"), - CoinType.ELECTRUM: TreasureDetail(chance=0, amount="0"), - CoinType.GOLD: TreasureDetail(chance=0, amount="0"), CoinType.PLATINUM: TreasureDetail(chance=30, amount="1d8"), ItemType.GEMS_JEWELRY: TreasureDetail(chance=50, amount="2d6"), ItemType.MAGIC_ITEM: TreasureDetail(chance=15, amount="1", magical=True), @@ -149,113 +145,48 @@ class Treasure: TreasureType.J: { CoinType.COPPER: TreasureDetail(chance=25, amount="1d4"), CoinType.SILVER: TreasureDetail(chance=10, amount="1d3"), - CoinType.ELECTRUM: TreasureDetail(chance=0, amount="0"), - CoinType.GOLD: TreasureDetail(chance=0, amount="0"), - CoinType.PLATINUM: TreasureDetail(chance=0, amount="0"), - ItemType.GEMS_JEWELRY: TreasureDetail(chance=0, amount="0"), - ItemType.MAGIC_ITEM: TreasureDetail(chance=0, amount="0", magical=True), }, TreasureType.K: { - CoinType.COPPER: TreasureDetail(chance=0, amount="0"), CoinType.SILVER: TreasureDetail(chance=30, amount="1d6"), CoinType.ELECTRUM: TreasureDetail(chance=10, amount="1d2"), - CoinType.GOLD: TreasureDetail(chance=0, amount="0"), - CoinType.PLATINUM: TreasureDetail(chance=0, amount="0"), - ItemType.GEMS_JEWELRY: TreasureDetail(chance=0, amount="0"), - ItemType.MAGIC_ITEM: TreasureDetail(chance=0, amount="0", magical=True), }, TreasureType.L: { - CoinType.COPPER: TreasureDetail(chance=0, amount="0"), - CoinType.SILVER: TreasureDetail(chance=0, amount="0"), - CoinType.ELECTRUM: TreasureDetail(chance=0, amount="0"), - CoinType.GOLD: TreasureDetail(chance=100, amount="1d100"), - CoinType.PLATINUM: TreasureDetail(chance=0, amount="0"), - ItemType.GEMS_JEWELRY: TreasureDetail(chance=50, amount="1d6"), - ItemType.MAGIC_ITEM: TreasureDetail(chance=30, amount="2", magical=True), + ItemType.GEMS_JEWELRY: TreasureDetail(chance=50, amount="1d4"), }, TreasureType.M: { - CoinType.COPPER: TreasureDetail(chance=0, amount="0"), - CoinType.SILVER: TreasureDetail(chance=0, amount="0"), - CoinType.ELECTRUM: TreasureDetail(chance=0, amount="0"), - CoinType.GOLD: TreasureDetail(chance=40, amount="2d8"), - CoinType.PLATINUM: TreasureDetail(chance=50, amount="5d30"), - ItemType.GEMS_JEWELRY: TreasureDetail(chance=55, amount="5d20"), - ItemType.MAGIC_ITEM: TreasureDetail(chance=0, amount="0", magical=True), + CoinType.GOLD: TreasureDetail(chance=40, amount="2d4"), + CoinType.PLATINUM: TreasureDetail(chance=50, amount="5d6"), + ItemType.GEMS_JEWELRY: TreasureDetail(chance=55, amount="5d4"), }, TreasureType.N: { - CoinType.COPPER: TreasureDetail(chance=0, amount="0"), - CoinType.SILVER: TreasureDetail(chance=0, amount="0"), - CoinType.ELECTRUM: TreasureDetail(chance=0, amount="0"), - CoinType.GOLD: TreasureDetail(chance=0, amount="0"), - CoinType.PLATINUM: TreasureDetail(chance=0, amount="0"), - ItemType.GEMS_JEWELRY: TreasureDetail(chance=45, amount="2d12"), - ItemType.MAGIC_ITEM: TreasureDetail(chance=40, amount="2d8", magical=True), + ItemType.MAGIC_ITEM: TreasureDetail(chance=40, amount="2d4", magical=True), }, TreasureType.O: { - CoinType.COPPER: TreasureDetail(chance=0, amount="0"), - CoinType.SILVER: TreasureDetail(chance=0, amount="0"), - CoinType.ELECTRUM: TreasureDetail(chance=0, amount="0"), - CoinType.GOLD: TreasureDetail(chance=0, amount="0"), - CoinType.PLATINUM: TreasureDetail(chance=0, amount="0"), - ItemType.GEMS_JEWELRY: TreasureDetail(chance=50, amount="1d4"), - ItemType.MAGIC_ITEM: TreasureDetail(chance=0, amount="0", magical=True), + ItemType.MAGIC_ITEM: TreasureDetail(chance=50, amount="1d4", magical=True), }, TreasureType.P: { CoinType.COPPER: TreasureDetail(chance=100, amount="4d6"), - CoinType.SILVER: TreasureDetail(chance=0, amount="0"), - CoinType.ELECTRUM: TreasureDetail(chance=0, amount="0"), - CoinType.GOLD: TreasureDetail(chance=0, amount="0"), - CoinType.PLATINUM: TreasureDetail(chance=0, amount="0"), - ItemType.GEMS_JEWELRY: TreasureDetail(chance=0, amount="0"), - ItemType.MAGIC_ITEM: TreasureDetail(chance=0, amount="0", magical=True), }, TreasureType.Q: { - CoinType.COPPER: TreasureDetail(chance=0, amount="0"), CoinType.SILVER: TreasureDetail(chance=100, amount="3d6"), - CoinType.ELECTRUM: TreasureDetail(chance=0, amount="0"), - CoinType.GOLD: TreasureDetail(chance=0, amount="0"), - CoinType.PLATINUM: TreasureDetail(chance=0, amount="0"), - ItemType.GEMS_JEWELRY: TreasureDetail(chance=0, amount="0"), - ItemType.MAGIC_ITEM: TreasureDetail(chance=0, amount="0", magical=True), }, TreasureType.R: { - CoinType.COPPER: TreasureDetail(chance=0, amount="0"), - CoinType.SILVER: TreasureDetail(chance=0, amount="0"), CoinType.ELECTRUM: TreasureDetail(chance=100, amount="2d6"), - CoinType.GOLD: TreasureDetail(chance=0, amount="0"), - CoinType.PLATINUM: TreasureDetail(chance=0, amount="0"), - ItemType.GEMS_JEWELRY: TreasureDetail(chance=0, amount="0"), - ItemType.MAGIC_ITEM: TreasureDetail(chance=0, amount="0", magical=True), }, TreasureType.S: { - CoinType.COPPER: TreasureDetail(chance=0, amount="0"), - CoinType.SILVER: TreasureDetail(chance=0, amount="0"), - CoinType.ELECTRUM: TreasureDetail(chance=0, amount="0"), CoinType.GOLD: TreasureDetail(chance=100, amount="2d4"), - CoinType.PLATINUM: TreasureDetail(chance=0, amount="0"), - ItemType.GEMS_JEWELRY: TreasureDetail(chance=0, amount="0"), - ItemType.MAGIC_ITEM: TreasureDetail(chance=0, amount="0", magical=True), }, TreasureType.T: { - CoinType.COPPER: TreasureDetail(chance=0, amount="0"), - CoinType.SILVER: TreasureDetail(chance=0, amount="0"), - CoinType.ELECTRUM: TreasureDetail(chance=0, amount="0"), - CoinType.GOLD: TreasureDetail(chance=0, amount="0"), CoinType.PLATINUM: TreasureDetail(chance=100, amount="1d6"), - ItemType.GEMS_JEWELRY: TreasureDetail(chance=0, amount="0"), - ItemType.MAGIC_ITEM: TreasureDetail(chance=0, amount="0", magical=True), }, TreasureType.U: { CoinType.COPPER: TreasureDetail(chance=10, amount="1d100"), CoinType.SILVER: TreasureDetail(chance=10, amount="1d100"), - CoinType.ELECTRUM: TreasureDetail(chance=0, amount="0"), CoinType.GOLD: TreasureDetail(chance=5, amount="1d100"), - CoinType.PLATINUM: TreasureDetail(chance=100, amount="0"), ItemType.GEMS_JEWELRY: TreasureDetail(chance=5, amount="1d4"), - ItemType.MAGIC_ITEM: TreasureDetail(chance=200, amount="1", magical=True), + ItemType.MAGIC_ITEM: TreasureDetail(chance=2, amount="1", magical=True), }, TreasureType.V: { - CoinType.COPPER: TreasureDetail(chance=0, amount="0"), CoinType.SILVER: TreasureDetail(chance=10, amount="1d100"), CoinType.ELECTRUM: TreasureDetail(chance=5, amount="1d100"), CoinType.GOLD: TreasureDetail(chance=10, amount="1d100"), diff --git a/tests/test_unit_treasure.py b/tests/test_unit_treasure.py index 8807dec..e4f3730 100644 --- a/tests/test_unit_treasure.py +++ b/tests/test_unit_treasure.py @@ -6,14 +6,16 @@ def test_treasure_total_gold_piece_value(): custom_type = { CoinType.GOLD: TreasureDetail( + # Always 10 GP chance=100, amount="10", magical=False - ), # 10 gold coins + ), CoinType.SILVER: TreasureDetail( + # Always 100 SP chance=100, amount="100", magical=False - ), # 100 silver coins + ), } treasure = Treasure.from_custom_type(custom_type) - expected_total_gp = 20 # 10 gold + 100 silver converted to gold (10 + 10) + expected_total_gp = 20 # 10 GP + 100 SP (10 SP = 1 GP) assert treasure.total_gp_value == expected_total_gp @@ -21,8 +23,9 @@ def test_treasure_from_custom_type(): # Define a custom treasure type with specific items custom_type = { CoinType.GOLD: TreasureDetail( + # Always 5 GP chance=100, amount="5", magical=False - ), # Always 5 gold coins + ), ItemType.MAGIC_ITEM: TreasureDetail( chance=50, amount="1", magical=True ), # 50% chance of 1 magic item