{ "_comment": "ECONOMY TUNING (the knobs, not the data). goods.json is WHAT exists; this file is HOW it prices and stocks. Everything here is a tunable number so you can rebalance the whole economy without touching code or the catalog. MODEL (full version in docs/ECONOMY.md §5): for a good at a place there are TWO FIXED prices in credits — a BUY price (cheap where the place's class produces the good) and a SELL price (a premium where the class wants it, growing with the hops between this system and the good's home region). Prices are fixed per (good, location), decided once at generation, and never depend on where the player bought the good or what's in their hold. Distance is enforced by REGIONAL AVAILABILITY (goods only cheap in their home region), not a live per-trade multiplier. Credits are the go-between — buying spends them, selling earns them, no barter.", "shop": { "_comment": "Stock size per settlement kind. `station` and `capital` get wider stock (more variety to resell) than a single world.", "minStock": 8, "maxStock": 16, "stockByKind": { "colony": { "min": 8, "max": 12 }, "miningStation":{ "min": 8, "max": 12 }, "cloudBase": { "min": 8, "max": 12 }, "capital": { "min": 12, "max": 16 }, "deepSpaceStation": { "min": 10, "max": 16 } } }, "pricing": { "_comment": "All multipliers are dimensionless and multiply baseValue. BUY price = baseValue * (1 - producerDiscount if the place's class produces the good) * jitter. SELL price = baseValue * (1 + demandBonusPerClass * #demand-classes) * (1 + distancePerHop * min(hops, cap)) * jitter. `jitter` is a per-good, per-place seeded wobble (±%) so no two shops are identical.", "demandBonusPerClass": 0.12, "producerDiscount": 0.35, "distancePerHop": 0.22, "distanceCapHops": 6, "jitter": 0.10 }, "cargo": { "_comment": "The hold is a set of fixed BAYS — one good per bay (unitPerGood=1). `capacitySource` is the UNLOCKED-bay count (ship.stats.cargoHold, starts at 4; cargo upgrades raise it). `maxSlots` is the fixed grid the shop UI always shows (16 slots) — locked bays are just capacity the ship hasn't bought yet. You CARRY goods between shops; that's the whole game loop.", "capacitySource": "ship.stats.cargoHold", "maxSlots": 16, "unitPerGood": 1 }, "credits": { "_comment": "The trade currency (the go-between). Displayed next to the minerals HUD (upper-right). Player starts at 0 (startingCredits). Trading is LOCKED until the third story quest (not yet written); until then first credits come from quest rewards and, later, asteroid gemstone mining. Buying spends credits; selling earns them.", "startingCredits": 0, "display": { "nextTo": "mineralHud", "anchor": "upper-right" }, "tradingLockedUntilQuest": 3, "earning": ["sellGoods", "questRewards", "miningLaserGems (later)"] }, "restock": { "_comment": "Shops are NON-persistent. When the player leaves and later returns, the shop re-derives its stock from the seed — the same goods and prices every time, so there is no inventory to track and no 'you just bought out their stock' bookkeeping. The engine treats a shop's stock as a pure function of (seed, place, economy version).", "policy": "deterministic-derivation", "stockIsPureFunction": true, "note": "No per-player sold/bought counters are stored. Revisiting a shop yields identical stock & prices." }, "reputation": { "_comment": "DEFERRED (decision #3 — wanted, later). Hook: standing with a place's owner faction nudges prices (good standing = better deal). `maxPriceShift` is the max +/- fraction of price. Wired to js/reputation/Reputation.js standingFor(place). OFF for v1.", "enabled": false, "maxPriceShift": 0.08 }, "faction": { "_comment": "DEFERRED (decision #3). Hook: some factions may levy a tariff or patron a good class. `tariffRange` is the +/- fraction. `patronGoods` (a future map of factionId -> [goodId]) lets a faction pay premium for its favored goods. Left empty — populate when factions take an economic role.", "tariffRange": 0.05, "patronGoods": {} }, "version": 1 }