-- ===================================================================== -- content/stone_age.lua — T1-modder content pack: Stone-Age items + recipes. -- -- PURE CONTENT via the authoring API `c` (see init.lua's content facade): -- c.T{ id, name, desc, weight, vol, form=, material={...}, affordance={...}, -- atlas="tc"|"stone", uv="", scale? } -- define an item -- c.R{ ...crafting.define_recipe def... } -- define a recipe -- c.S{ template, x, y } -- place item in world -- -- ROLE-BASED RECIPES (the intent): a recipe slot asks for the ROLE it needs, -- and ANY item that fills that role qualifies — not a specific item id. Roles -- are expressed as property-constraints (crafting v0.3 / ADR-0055): -- * `form` — physical role: shaft / cord / fiber / lump / blade / … -- * `composition.*`— material makeup (wood / stone / fiber …) -- * `weight` — size discriminator (light stick vs heavy branch) -- * `affordance.*` — functional capability of a TOOL (cutting/hammering/…) -- e.g. a "haft" = { form="shaft" } → any stick OR branch OR pole works. -- -- Template-id matching ({ template="rock" }) is ALSO valid — it is just the -- trivial one-property constraint — and is used where a recipe genuinely wants -- one specific item (see rock_pick/rock_pile in init.lua). Role-based is the -- default here; template-id is one of the options, not the norm. -- ===================================================================== return function(c) -- ---- items (each tagged with its ROLE via `form`) ---------------- -- NOTE: `rock` (form=lump) and `stick` (form=shaft) are BASE items defined -- in init.lua; this pack's role-based recipes match them by form. -- World-gathered c.T{ id = "branch", name = "Branch", desc = "A heavy springy branch. Snap it into sticks.", weight = 1.5, vol = 0.006, form = "shaft", material = { wood = 1.0 }, atlas = "tc", uv = "log_pile1", scale = 0.85 } c.T{ id = "log", name = "Log", desc = "A heavy wooden log. Saw it into planks.", weight = 20, vol = 0.05, form = "log", material = { wood = 1.0 }, atlas = "tc", uv = "log_pile1" } c.T{ id = "tree", name = "Tree", desc = "A standing tree. Chop it down for logs.", weight = 400, vol = 1.0, form = "tree", material = { wood = 1.0 }, atlas = "tc", uv = "log_pile1", scale = 1.6 } c.T{ id = "plant_fiber", name = "Plant Fiber", desc = "Tough plant fiber. Twist several into cordage.", weight = 0.05, vol = 0.0002, form = "fiber", material = { fiber = 1.0 }, atlas = "tc", uv = "sack1", scale = 0.6 } -- Crafted c.T{ id = "sharp_stone", name = "Sharp Stone", desc = "A knapped stone with a cutting edge.", weight = 1, vol = 0.0004, form = "blade", material = { stone = 1.0 }, affordance = { cutting = true }, atlas = "tc", uv = "spade" } c.T{ id = "cordage", name = "Cordage", desc = "Twisted plant-fiber cord. A binding.", weight = 0.1, vol = 0.0003, form = "cord", material = { fiber = 1.0 }, atlas = "tc", uv = "sack1" } c.T{ id = "plank", name = "Plank", desc = "A sawn wooden plank.", weight = 2, vol = 0.004, form = "plank", material = { wood = 1.0 }, atlas = "tc", uv = "bench1" } c.T{ id = "stone_axe", name = "Stone Axe", desc = "A hafted stone axe. Chops wood.", weight = 1.8, vol = 0.0012, form = "tool", material = { stone = 0.6, wood = 0.3, fiber = 0.1 }, affordance = { chopping = true }, atlas = "tc", uv = "spade" } c.T{ id = "stone_hammer", name = "Stone Hammer", desc = "A stone lashed to a haft. Pounds and knaps.", weight = 1.5, vol = 0.001, form = "tool", material = { stone = 0.6, wood = 0.3, fiber = 0.1 }, affordance = { hammering = true }, atlas = "tc", uv = "spade" } c.T{ id = "sharpened_stick", name = "Sharpened Stick", desc = "A stick whittled to a point. A crude spear.", weight = 0.3, vol = 0.0005, form = "shaft", material = { wood = 1.0 }, affordance = { piercing = true }, atlas = "tc", uv = "log_pile1", scale = 0.9 } -- ---- recipes (match by ROLE, not by item id) -------------------- -- knap: any hard stone LUMP + a HAMMERING tool -> a sharp blade. c.R{ id = "knap_sharp_stone", inputs = { { match = { form = "lump" }, count = 1 } }, tools = { { match = { ["affordance.hammering"] = true } } }, outputs = { { template = "sharp_stone", count = 1 } }, name = "Knap Sharp Stone", description = "Strike a stone with a hammerstone to flake off a sharp edge." } -- cordage: three FIBERS (any fiber source) -> cord. c.R{ id = "twist_cordage", inputs = { { match = { form = "fiber" }, count = 3 } }, outputs = { { template = "cordage", count = 1 } }, name = "Twist Cordage", description = "Twist three plant fibers into a length of cordage." } -- hammer: a LUMP head + a SHAFT haft + a CORD binding. c.R{ id = "craft_stone_hammer", inputs = { { match = { form = "lump" }, count = 1 }, -- head { match = { form = "shaft" }, count = 1 }, -- haft (stick OR branch) { match = { form = "cord" }, count = 1 }, -- binding }, outputs = { { template = "stone_hammer", count = 1 } }, name = "Haft Stone Hammer", description = "Lash a stone to a haft for a pounding tool (enables knapping)." } -- axe: a BLADE head + a SHAFT haft + a CORD binding. c.R{ id = "craft_stone_axe", inputs = { { match = { form = "blade" }, count = 1 }, -- head (a sharp stone) { match = { form = "shaft" }, count = 1 }, -- haft { match = { form = "cord" }, count = 1 }, -- binding }, outputs = { { template = "stone_axe", count = 1 } }, name = "Haft Stone Axe", description = "Bind a sharp stone to a haft with cordage." } -- break: a HEAVY shaft (branch, not a light stick) -> two sticks. c.R{ id = "break_branch", inputs = { { match = { form = "shaft", weight = ">1" }, count = 1 } }, outputs = { { template = "stick", count = 2 } }, name = "Break Branch", description = "Snap a heavy branch over your knee into two sticks." } -- sharpen: a LIGHT shaft (a stick) + a CUTTING tool -> a pointed stick. c.R{ id = "sharpen_stick", inputs = { { match = { form = "shaft", weight = "<1" }, count = 1 } }, tools = { { match = { ["affordance.cutting"] = true } } }, outputs = { { template = "sharpened_stick", count = 1 } }, name = "Sharpen Stick", description = "Whittle a stick to a point with a cutting edge." } -- chop: a TREE + a CHOPPING tool -> two logs (closes axe->log->plank). c.R{ id = "chop_tree", inputs = { { match = { form = "tree" }, count = 1 } }, tools = { { match = { ["affordance.chopping"] = true } } }, outputs = { { template = "log", count = 2 } }, name = "Chop Tree", description = "Fell a tree with a chopping edge — yields two logs." } -- saw: any heavy WOOD (matched by material+weight, not form) + a CUTTING -- tool -> four planks. A light plank (weight 2) is correctly not re-sawable. c.R{ id = "saw_planks", inputs = { { match = { ["composition.wood"] = ">0.5", weight = ">5" }, count = 1 } }, tools = { { match = { ["affordance.cutting"] = true } } }, outputs = { { template = "plank", count = 4 } }, name = "Saw Planks", description = "Saw a heavy wooden log into four planks (needs a cutting edge)." } -- ---- world spawns (backpack sits at 350,400) --------------------- c.S{ template = "log", x = 110, y = 400 } c.S{ template = "sharp_stone", x = 110, y = 330 } for i = 1, 3 do c.S{ template = "plant_fiber", x = 50, y = 300 + (i - 1) * 28 } end c.S{ template = "branch", x = 50, y = 250 } c.S{ template = "branch", x = 85, y = 250 } c.S{ template = "tree", x = 200, y = 190 } end