Files
turnstone/examples/door-game/understone/world/data/items.json
T
Patrick Buckley 393a6fc2b2 feat(examples): Understone v0.10 — the satchel, the ore-forge, and the vault
A game-loop mechanics patch: the satchel becomes a real stacking inventory,
forging now demands ore won in combat (not just gold), and a vault lets a
hero protect coin from ambush.

- Stacking satchel: the bag re-encodes from a flat id list to "id:qty"
  stacks, so potions stack (three Minor Potions fill one slot, not three)
  and materials ride alongside. satchel_max now caps distinct KINDS (3);
  per-kind quantity is unbounded. quaff/death-save still pull the strongest
  potion and ignore materials. One pure codec (engine/satchel.py) owns the
  encoding; the façade, the Watch, and the sim all decode through it — no
  three-way drift (the v0.9 single-source lesson). The codec parses a bare
  id as qty 1, so it can never silently drop a malformed stack.
- Ore-gated forge: ore is a material that drops from won dungeon-rung
  fights (and, less often, forest fights), stacks in the satchel, and is
  not buyable or sellable — you earn your edge by fighting for it. Forging
  now costs gold AND ore ((plus+1) ore per tier), so a rich-but-idle hero
  can no longer buy power at the dice table. The dungeon is now also the
  mine.
- The vault: deposit/withdraw at the inn moves coin to a strongbox that
  ambush cannot touch and that SURVIVES the Wyrm-win legacy reset — the
  carry-vs-protect decision the PvP economy was missing.
- Surfaced on both the /watch lobby TV and the in-chat door_status sheet:
  each hero's stacked satchel, carried gold, and vaulted gold.
- Tuning (the sim is the instrument): the ore gate added ~2 days to the
  Vale and ~1.6 to the Cinder Wastes; the greedy bot still slays the Wyrm
  3/3 on both, fully forged to +3/+3, so the loop is not stalled. Defaults
  held — no numbers needed retuning.

Four new banded settings (forge_ore_item, forge_ore_per_plus,
ore_dungeon_drop, ore_forest_chance); both worlds gained an ore item.
Schema mutated in place (banked column, satchel re-encoding) — pre-1.0, no
migration by design; a real migration story is owed at 1.0. Tests 382 ->
419; the vault-survives-rebirth invariant and the codec are revert-verified.
2026-06-13 04:40:40 -07:00

86 lines
1.3 KiB
JSON

[
{
"id": "rusty_dagger",
"name": "Rusty Dagger",
"slot": "weapon",
"atk": 2,
"price": 0
},
{
"id": "short_sword",
"name": "Short Sword",
"slot": "weapon",
"atk": 5,
"price": 40
},
{
"id": "iron_sword",
"name": "Iron Sword",
"slot": "weapon",
"atk": 7,
"price": 80
},
{
"id": "war_axe",
"name": "War Axe",
"slot": "weapon",
"atk": 9,
"price": 120
},
{
"id": "cloth_tunic",
"name": "Cloth Tunic",
"slot": "armor",
"def": 1,
"price": 0
},
{
"id": "padded_jerkin",
"name": "Padded Jerkin",
"slot": "armor",
"def": 2,
"price": 25
},
{
"id": "leather_armor",
"name": "Leather Armor",
"slot": "armor",
"def": 3,
"price": 50
},
{
"id": "chainmail",
"name": "Chainmail",
"slot": "armor",
"def": 6,
"price": 140
},
{
"id": "minor_potion",
"name": "Minor Potion",
"slot": "consumable",
"heal": 15,
"price": 12
},
{
"id": "greater_potion",
"name": "Greater Potion",
"slot": "consumable",
"heal": 40,
"price": 35
},
{
"id": "elixir_of_the_vale",
"name": "Elixir of the Vale",
"slot": "consumable",
"heal": 70,
"price": 60
},
{
"id": "iron_ore",
"name": "Iron Ore",
"slot": "material",
"price": 0
}
]