aboutsummaryrefslogtreecommitdiff
path: root/data/recipes.ts
blob: 04cccf16d87850eb3a0ccced23d85ca29336d48c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//? Is is a good idea? Probably not.

interface Recipe {
    tile?: 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 => 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} }`);
}

function cut(from: string, to?: string) {
    out({ action: "active", duration: 2, tile: "cuttingboard", inputs: [from], outputs: [to ?? ("sliced-" + from)] })
}
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, tile: "stove", inputs: [i], outputs: [o] })
    out({ action: "passive", duration: 5, tile: "stove", inputs: [o], outputs: ["burned-pot"], warn: true })
}
function mix(from: string, to?: string) {
    const i = from + "-mixer"
    const o = (to ?? (from + "-juice")) + "-mixer"
    out({ action: "instant", inputs: ["mixer", 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, 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", "mixer"].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("herbs")

cut("tomato")
cook("raw-steak", "steak")
combine("plate", "steak-pot", "sliced-tomato", "bread")

mix("flour", "dough")
out({ action: "instant", inputs: ["dough-mixer"], outputs: ["mixer", "dough"] })
bake("dough", "bread")

mix("tomato")
combine("pot", "herbs", "tomato-juice-mixer")
cook("herbs-tomato-juice-pot", "tomato-soop")
out({ action: "instant", inputs: ["tomato-soop-pot", "plate"], outputs: ["pot", "tomato-soop-plate"] })

auto_trash()