summaryrefslogtreecommitdiff
path: root/data/recipes.ts
blob: dcd73d8e08cc1c2dabddc3c9790676dfe7bc4284 (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
//? Is is a good idea? Probably not.

interface Recipe {
    tile?: string,
    inputs: string[],
    outputs: string[],
    action: "instant" | "passive" | "active"
    duration?: number
}

const all_items = new Set<string>()
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 ?? "")} }`);
}
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)] })
}
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] })
}
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 combine(container: string, ...inputs: string[]) {
    const open = inputs.map(i => [i])
    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]
            parts.sort()
            const o = parts.join("-") + "-" + container
            if (all_items.has(o)) continue
            open.push(parts)
            out({
                action: "instant",
                inputs: [cur, i],
                outputs: [o]
            })
        }
    }
}

item("tomato", cut(), crate, cook("tomato-soop"))
combine("plate", "steak", "sliced-tomato", "bread")

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: [] })
    }
}