aboutsummaryrefslogtreecommitdiff
path: root/data/recipes.ts
diff options
context:
space:
mode:
Diffstat (limited to 'data/recipes.ts')
-rw-r--r--data/recipes.ts118
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()