Crafting: goods and embedded recipes (ORIGINAL content)
The content tree — the contract for the
data/ tree.
The SRD prices finished arms but has NO material recipes — its downtime
crafting is gp-rates only. Everything in this section is therefore OURS
(the alignment_bias precedent: original additions living inside or
beside .srd.ron files, explicitly marked): the goods/ collection,
every recipes: list, and all quantities, tiers, and hours.
- The goods collection (
goods/<id>.ron,source: Original, one file per material): a starter set of 12 sufficient to give every SRD weapon and armor a plausible recipe — iron_ore, coal, iron_ingot, timber, hide, leather, cotton, cloth, sinew, and the four artisan’s tools. Raw naturals (ore, coal, timber, hide, sinew, cotton) have no recipes — they are gathered or traded; intermediates (iron_ingot from ore+coal at the smithy, leather from hide at the tannery, cloth woven from cotton at the loom) carry theirs. The tools’ WEIGHTS are aligned with the SRD equipment table’s artisan’s-tools rows (noted per file); their VALUES, and every other good’s, now DERIVE (/0396): worth = material cost ÷yield+labour_rate(tier)÷rate, and no file states a price. Weapons and armour are the same rule since §5: the book’s price column is no longer transcribed at all. It never reached a price — only a materials-≤-price sanity bound, which the derivation makes unrepresentable (labour is non-negative, soworth ≥ materialsholds by construction on anyyield: 1row) — and while it sat in the file it was a second, quieter authority over the same quantity. What the SRD’s plate price actually recorded, a brand/scarcity premium some 300× the raw craft cost, belongs to the market layer, and the market layer is where it now lives. Thebedrollis the first TERMINAL consumer good — a carpentry product off the timber and cloth chains,quality_class: "good"marking it a fitted item (used, not crafted onward), so the orphan check reads it as a legitimate sink; its weight aligns with the SRD’s bedroll row and its value derives like every crafted good’s. - Recipes are EMBEDDED in item definitions —
recipes:on Weapon, Armor, and Good. Craftable is DERIVED from having recipes, never a flag.Recipe.stationids resolve at boot against the union of the building types’stationslists (today: smithy, tannery, carpentry, weaver, ovens, mash_house);tieris the ladder;toolreferences a good id (None= bare hands — a club is whittled). Constructive inputs are CLASS-GENERIC (Class("metal")— any material of the class satisfies; a mithral dagger needs no dagger variant); process inputs stay specific ids (Good("coal")— iron ingots come from iron ore, not “any metal”). - The strike table (the rare find in the bulk): an
EXTRACTION recipe (one with no
inputs) may carrystrike: Some(Strike(good: "<id>", odds: <0..1>)). Each unit the face earns then rolls a SECOND die for its IDENTITY: the rare good atodds, the bulk good otherwise. It splits identity, NEVER quantity — bulk + rare equals exactly what the face would have minted without it, so a strike never mints or loses a unit. The mountain mine’siron_orerow strikesmithral_oreat 0.08; itsstonerow strikesiron_oreat 0.15. An unknown good or a non-probabilityoddsfails boot. - Richer ground, richer vein ( §5): a
Strikemay carrymods: [(tag, multiplier)]— theterrain_modsrule applied to the odds. The effective chance at a venue isodds × Π(multiplier for each town terrain tag present), clamped to a probability. One row can therefore run a fat seam in one town and a thin one in the next without a second recipe or a hand-wired deposit: the ground decides. Tags resolve againsttables/terrain_tags.ron; a negative or non-finite multiplier fails boot. - Boot feeds these into the EXISTING production machinery:
recipes become graph structure, worldgen assigns the venues, and
there is NO parallel crafting system. The make-check quality rule
generalizes here later (tier + check → quality); material
weight_lbfeeds the arbitrage cart loads. - Batch yield (RAY-22):
yieldnames the integer units fed by one run of the listed inputs. The production edge carries it only above one. Production burns each run once and spends the post’s open units before burning another; different goods keep separate balances, including across a save. Per-unit feed costs divide the materials by yield, whileratealready expresses per-unit labour. Ammunition is consumed in combat (RAY-1038). Every recipe states its yield explicitly; one means ordinary single-unit production.