Skip to content

Commit

Permalink
finalized treasure tables
Browse files Browse the repository at this point in the history
  • Loading branch information
mmacy committed Jan 23, 2024
1 parent 6bd683f commit 4a79a3e
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 81 deletions.
85 changes: 8 additions & 77 deletions osrlib/osrlib/treasure.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -138,124 +138,55 @@ 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),
},
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"),
Expand Down
11 changes: 7 additions & 4 deletions tests/test_unit_treasure.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,26 @@
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


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
Expand Down

0 comments on commit 4a79a3e

Please sign in to comment.