From 761a3172bf4c15aed3836e4d1cd6f815b651b0e0 Mon Sep 17 00:00:00 2001 From: LLLL Colonq Date: Sat, 29 Aug 2026 04:06:51 -0400 Subject: Fix --- 2026/games/the0x539/crafting.js | 98 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 2026/games/the0x539/crafting.js (limited to '2026/games/the0x539/crafting.js') diff --git a/2026/games/the0x539/crafting.js b/2026/games/the0x539/crafting.js new file mode 100644 index 0000000..7a61cfc --- /dev/null +++ b/2026/games/the0x539/crafting.js @@ -0,0 +1,98 @@ +import { recipes, amounts } from './data.js'; + +export function getRecipeOutput() { + const input = readGrid(); + if (input.length === 0) return null; + + const mirroredInput = input.map(row => row.toReversed()); + + for (const [item, recipe] of Object.entries(recipes)) { + const isMatch = compare(input, recipe) || compare(mirroredInput, recipe); + if (!isMatch) continue; + + const amount = amounts[item] ?? 1; + return [item, amount]; + } + + return null; +} + +function last(arr) { + return arr[arr.length - 1]; +} + +function isSymmetric(grid) { + return grid.every(row => row[0] === last(row)); +} + +function readGrid() { + const cells = document.querySelectorAll('crafting-grid > inventory-cell'); + + const rows = []; + for (let y = 0; y < 3; y++) { + const row = []; + for (let x = 0; x < 3; x++) { + let item = null; + const stack = cells[3 * y + x].firstElementChild; + if (!!stack) { + item = stack.getAttribute('data-item'); + } + row.push(item); + } + rows.push(row); + } + + trimGrid(rows); + + return rows; +} + +function trimGrid(grid) { + if (grid.flat().every(v => v === null)) { + while (grid.length > 0) { + grid.pop(); + } + return; + } + + // it is now established that the grid is non-empty, + // so there will always be at least one row+col + + // trim blank rows from bottom + while (last(grid).every(v => v === null)) { + grid.pop(); + } + + // trim blank rows from top + while (grid[0].every(v => v === null)) { + grid.shift(); + } + + // trim blank columns from right + while (grid.every(row => last(row) === null)) { + for (const row of grid) { + row.pop(); + } + } + + // trim blank columns from left + while (grid.every(row => row[0] === null)) { + for (const row of grid) { + row.shift(); + } + } +} + +function compare(a, b) { + if (a.length !== b.length) return false; + + for (let y = 0; y < a.length; y++) { + if (a[y].length !== b[y].length) return false; + + for (let x = 0; x < a[y].length; x++) { + if (a[y][x] !== b[y][x]) return false; + } + } + + return true; +} -- cgit v1.3.1