KINBARROW modding reference
v0.2.0+main.a22009f4c dataset b2f73c2ab65ff925

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, so worth ≥ materials holds by construction on any yield: 1 row) — 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. The bedroll is 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.station ids resolve at boot against the union of the building types’ stations lists (today: smithy, tannery, carpentry, weaver, ovens, mash_house); tier is the ladder; tool references 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 carry strike: Some(Strike(good: "<id>", odds: <0..1>)). Each unit the face earns then rolls a SECOND die for its IDENTITY: the rare good at odds, 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’s iron_ore row strikes mithral_ore at 0.08; its stone row strikes iron_ore at 0.15. An unknown good or a non-probability odds fails boot.
  • Richer ground, richer vein ( §5): a Strike may carry mods: [(tag, multiplier)] — the terrain_mods rule applied to the odds. The effective chance at a venue is odds × Π(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 against tables/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_lb feeds the arbitrage cart loads.
  • Batch yield (RAY-22): yield names 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, while rate already expresses per-unit labour. Ammunition is consumed in combat (RAY-1038). Every recipe states its yield explicitly; one means ordinary single-unit production.