mirror of
https://github.com/turnstonelabs/turnstone.git
synced 2026-08-12 23:12:23 -06:00
393a6fc2b2
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.
86 lines
1.3 KiB
JSON
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
|
|
}
|
|
]
|