aboutsummaryrefslogtreecommitdiff
path: root/data/recipes/default.ts
diff options
context:
space:
mode:
Diffstat (limited to 'data/recipes/default.ts')
-rw-r--r--data/recipes/default.ts143
1 files changed, 143 insertions, 0 deletions
diff --git a/data/recipes/default.ts b/data/recipes/default.ts
new file mode 100644
index 00000000..4efdb16a
--- /dev/null
+++ b/data/recipes/default.ts
@@ -0,0 +1,143 @@
+/*
+ Undercooked - a game about cooking
+ Copyright 2024 metamuffin
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, version 3 of the License only.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+*/
+
+//? Is is a good idea? Probably not.
+
+interface Recipe {
+ tile?: string,
+ inputs: (string | null)[],
+ outputs: (string | null)[],
+ action: "instant" | "passive" | "active" | "demand"
+ duration?: number
+ revert_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 == "foodprocessor") 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 => i ? all_items.add(i) : void 0)
+ r.outputs.forEach(i => i ? all_items.add(i) : void 0)
+ r.inputs = r.inputs.filter(e => e)
+ r.outputs = r.outputs.filter(e => e)
+ console.log(`- ${JSON.stringify(r).replaceAll("\"active\"", "!active").replaceAll("\"passive\"", "!passive").replaceAll("\"instant\"", "!instant")}`);
+}
+
+function cut(from: string, to?: string, to2?: string) {
+ out({ action: "active", duration: 2, tile: "cuttingboard", inputs: [from], outputs: [to ?? ("sliced-" + from), to2 ?? null] })
+}
+function cook(from: string, to?: string) {
+ const i = from.endsWith("-pot") ? from : from + "-pot"
+ const o = (to ?? ("cooked-" + from)) + "-pot"
+ if (!from.endsWith("-pot")) out({ action: "instant", inputs: ["pot", from], outputs: [i] })
+ out({ action: "passive", duration: 20, revert_duration: 40, tile: "stove", inputs: [i], outputs: [o] })
+ out({ action: "passive", duration: 5, revert_duration: 10, tile: "stove", inputs: [o], outputs: ["burned-pot"], warn: true })
+}
+function process(from: string, to?: string) {
+ const i = from + "-foodprocessor"
+ const o = (to ?? (from + "-juice")) + "-foodprocessor"
+ out({ action: "instant", inputs: ["foodprocessor", from], outputs: [i] })
+ out({ action: "active", duration: 3, inputs: [i], outputs: [o] })
+}
+function bake(from: string, to?: string) {
+ const o = (to ?? ("cooked-" + from))
+ out({ action: "passive", duration: 25, tile: "oven", inputs: [from], outputs: [o] })
+ out({ action: "passive", duration: 15, revert_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", "foodprocessor"].includes(ic)) return [iparts.join("-"), ic]
+ return [ifull, null]
+}
+
+function combine(container: string, ...inputs: string[]) {
+ 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 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
+ open.push(parts)
+ out({
+ action: "instant",
+ inputs: [c, ifull],
+ outputs: [o, ic]
+ })
+ }
+ }
+}
+
+out({ action: "active", duration: 2, tile: "sink", inputs: ["dirty-plate"], outputs: ["plate"] })
+
+crate("tomato")
+crate("raw-steak")
+crate("flour")
+crate("leek")
+
+cut("tomato")
+
+cook("raw-steak", "steak")
+
+process("flour", "dough")
+out({ action: "instant", inputs: ["dough-foodprocessor"], outputs: ["foodprocessor", "dough"] })
+bake("dough", "bread")
+cut("bread", "bread-slice", "bread-slice")
+
+process("tomato")
+combine("pot", "leek", "tomato-juice-foodprocessor")
+cook("leek-tomato-juice-pot", "tomato-soup")
+out({ action: "instant", inputs: ["tomato-soup-pot", "plate"], outputs: ["pot", "tomato-soup-plate"] })
+
+combine("plate", "steak-pot", "sliced-tomato", "bread-slice")
+
+auto_trash()