diff options
Diffstat (limited to 'data/recipes.ts')
-rw-r--r-- | data/recipes.ts | 118 |
1 files changed, 73 insertions, 45 deletions
diff --git a/data/recipes.ts b/data/recipes.ts index dcd73d8e..534f1e6d 100644 --- a/data/recipes.ts +++ b/data/recipes.ts @@ -3,74 +3,102 @@ interface Recipe { tile?: string, - inputs: string[], - outputs: string[], + inputs: (string | null)[], + outputs: (string | null)[], action: "instant" | "passive" | "active" duration?: number + warn?: boolean } const all_items = new Set<string>() +function auto_trash() { + for (const ifull of all_items) { + let [i, ic] = get_container(ifull) + if (i == "plate") continue + if (i == "pot") continue + if (i == "dirty") continue + if (ic == "plate") ic = "dirty-plate" + out({ + action: "instant", + tile: "trash", + inputs: [ifull], + outputs: [ic] + }) + } +} + function out(r: Recipe) { - r.inputs.forEach(i => all_items.add(i)) - r.outputs.forEach(i => all_items.add(i)) - console.log(`- { tile: ${r.tile ?? null}, inputs: ${JSON.stringify(r.inputs)}, outputs: ${JSON.stringify(r.outputs)}, action: !${r.action + " " + (r.duration ?? "")} }`); + r.inputs.forEach(i => i ? all_items.add(i) : void 0) + r.outputs.forEach(i => i ? all_items.add(i) : void 0) + console.log(`- { tile: ${r.tile ?? null}, inputs: ${JSON.stringify(r.inputs.filter(e => e))}, outputs: ${JSON.stringify(r.outputs.filter(e => e))}, action: !${r.action + " " + (r.duration ?? "")}, warn: ${r.warn ?? false} }`); } -type Component = (e: string) => void -const cut = (new_name?: string): Component => e => { - out({ action: "active", duration: 2, tile: "cuttingboard", inputs: [e], outputs: [new_name ?? ("sliced-" + e)] }) +function cut(from: string, to?: string) { + out({ action: "active", duration: 2, tile: "cuttingboard", inputs: [from], outputs: [to ?? ("sliced-" + from)] }) } -const cook = (new_name?: string): Component => e => { - const i = e + "-pot" - const o = (new_name ?? ("cooked-" + e)) + "-pot" - out({ action: "instant", inputs: ["pot", e], outputs: [i] }) - out({ action: "passive", duration: 2, tile: "stove", inputs: [i], outputs: [o] }) +function cook(from: string, to?: string) { + const i = from + "-pot" + const o = (to ?? ("cooked-" + from)) + "-pot" + out({ action: "instant", inputs: ["pot", from], outputs: [i] }) + out({ action: "passive", duration: 10, tile: "stove", inputs: [i], outputs: [o] }) + out({ action: "passive", duration: 10, tile: "stove", inputs: [o], outputs: ["burned-pot"], warn: true }) } -const crate: Component = e => out({ action: "instant", tile: e + "-crate", inputs: [], outputs: [e], }) - -function item(name: string, ...components: Component[]) { - for (const f of components) { - f(name) - } +function bake(from: string, to?: string) { + const o = (to ?? ("cooked-" + from)) + out({ action: "passive", duration: 20, tile: "oven", inputs: [from], outputs: [o] }) + out({ action: "passive", duration: 20, tile: "oven", inputs: [o], outputs: ["burned"], warn: true }) +} +function crate(item: string) { + out({ action: "instant", tile: item + "-crate", inputs: [], outputs: [item], }) } +function get_container(ifull: string): [string, string | null] { + const iparts = ifull.split("-") + const ic = iparts.pop() + if (ic && iparts.length && ["pot", "plate"].includes(ic)) return [iparts.join("-"), ic] + return [ifull, null] +} function combine(container: string, ...inputs: string[]) { - const open = inputs.map(i => [i]) + const open = inputs.map(ifull => { + const [i, ic] = get_container(ifull) + out({ action: "instant", inputs: [container, ifull], outputs: [i + "-" + container, ic] }) + return [i] + }) + const seen = new Set<string>() while (1) { - const e = open.pop() - if (!e) break; - const cur = e.join("-") + "-" + container - for (const i of inputs) { - if (e.includes(i)) continue - const parts = [...e, i] + const cur = open.pop() + if (!cur) break; + const c = cur.join("-") + "-" + container + for (const ifull of inputs) { + const [i, ic] = get_container(ifull) + if (cur.includes(i)) continue + const rkey = cur.join("-") + "#" + i + if (seen.has(rkey)) continue + seen.add(rkey) + + const parts = [...cur, i] parts.sort() const o = parts.join("-") + "-" + container - if (all_items.has(o)) continue open.push(parts) out({ action: "instant", - inputs: [cur, i], - outputs: [o] + inputs: [c, ifull], + outputs: [o, ic] }) } } } -item("tomato", cut(), crate, cook("tomato-soop")) -combine("plate", "steak", "sliced-tomato", "bread") +out({ action: "active", duration: 3, inputs: ["flour"], outputs: ["dough"] }) +out({ action: "active", duration: 2, tile: "sink", inputs: ["dirty-plate"], outputs: ["plate"] }) -for (const i of all_items) { - const parts = i.split("-"); - const container = parts.pop()!; - if (parts.length >= 1 && ["pot", "plate"].includes(container)) { - out({ - action: "instant", - tile: "trash", - inputs: [i], - outputs: [container] - }) - } else { - out({ action: "instant", tile: "trash", inputs: [i], outputs: [] }) - } -} +crate("tomato") +crate("raw-steak") +crate("flour") +crate("dirty-plate") +cut("tomato") +bake("dough", "bread") +cook("raw-steak", "steak") +combine("plate", "steak-pot", "sliced-tomato", "bread") +auto_trash() |