Files
ByteDiceWeb/toys/crafting/tree_generator.js
T

120 lines
2.5 KiB
JavaScript

import { parse } from "https://esm.sh/smol-toml"
let tomlInput = document.getElementById("tomlInput")
let genButton = document.getElementById("generateButton")
let trees = document.getElementById("trees")
let recipes = {}
let startItems = []
let products = []
genButton.onclick = getDataFromInput
function getDataFromInput() {
let input = tomlInput.value
try {
let json = parse(input)
startItems = json.io.inputs
products = json.io.products
recipes = json.recipes
} catch (e) { alert(e) }
clearTrees()
for (let product of products) {
console.log("generating: \"" + product + "\"")
genTreeForProduct(product)
}
}
function genTreeForProduct(product) {
let treeData = RecursivelyGetRecipes(product)
let treeNode = document.createElement("div")
treeNode.className = "tree"
makeTreeHTML(treeData, treeNode, true)
trees.appendChild(treeNode)
}
function RecursivelyGetRecipes(product) {
let recipe = recipes[product]
if (recipe == undefined) {
alert("ERROR: Recipe not found for \"" + product + "\"")
return [product]
}
let children = []
for (let item of recipe) {
if (startItems.includes(item)) { children.push(item) }
else { children.push(...RecursivelyGetRecipes(item)) }
}
return [product, children]
}
function prettyTreeString(tree, indent=0) {
let string = ""
for (let item of tree) {
if (typeof item == "string")
{ string += "| ".repeat(indent) + item + "\n" }
else { string += prettyTreeString(item, indent + 1) }
}
return string
}
function clearTrees() {
let children = trees.children
for (let c of children) { c.remove() }
}
function makeTreeHTML(tree, parentNode, blue = false) {
let previouslyAdded = undefined
let stringCount = tree.filter((x) => typeof(x) == "string").length
let arrCount = tree.length - stringCount
// add .siblings container if theres more than 1 .item
if (stringCount > 1) {
let s = document.createElement("div")
s.className = "siblings"
parentNode.prepend(s)
parentNode = s
}
if (arrCount == 0) { blue = true }
for (let i = 0; i < tree.length; i++) {
if (typeof(tree[i]) == "string") {
if (tree.length - 1 == i || tree[i + 1] == "string") { blue = true }
let n = makeItemNode(tree[i], blue)
parentNode.prepend(n)
previouslyAdded = n
}
else { makeTreeHTML(tree[i], previouslyAdded, false) }
}
}
function makeItemNode(name, blue = false) {
let node = document.createElement("div")
node.className = "item"
let p = document.createElement("p")
if (blue) { p.className = "blue" }
p.textContent = name
node.appendChild(p)
return node
}