Add script to wire board game image paths into data files

This commit is contained in:
Jared Miller 2026-02-24 15:38:08 -05:00
parent e541011b94
commit 9e11d7d423
Signed by: shmup
GPG key ID: 22B5C6D66A38B06C

117
scripts/wire-images.js Normal file
View file

@ -0,0 +1,117 @@
#!/usr/bin/env bun
import { existsSync, readFileSync, writeFileSync } from "node:fs";
const MANIFEST_PATH = "assets/images/board_game/image_manifest.json";
const BASE_PATH = "assets/images/board_game/";
const manifest = JSON.parse(readFileSync(MANIFEST_PATH, "utf8"));
// build lookup tables:
// baseById: id -> first non-upgraded path (for base cards, relics, potions, enemies)
// upgradedById: id -> first upgraded path (for + cards)
const baseById = {};
const upgradedById = {};
for (const [key, id] of Object.entries(manifest)) {
const fullPath = `assets/images/board_game/${key}`;
if (!existsSync(fullPath)) continue;
const path = BASE_PATH + key;
const isUpgraded = key.includes("_upgraded/");
if (isUpgraded) {
if (!upgradedById[id]) upgradedById[id] = path;
} else {
if (!baseById[id]) baseById[id] = path;
}
}
// --- cards.json ---
const cardsRaw = readFileSync("data/cards.json", "utf8");
const cards = JSON.parse(cardsRaw);
let cardsUpdated = 0;
let cardsSkipped = 0;
for (const [cardId, card] of Object.entries(cards)) {
const isUpgraded = cardId.endsWith("+");
const baseId = isUpgraded ? cardId.slice(0, -1) : cardId;
const lookup = isUpgraded ? upgradedById : baseById;
const match = lookup[baseId];
if (match) {
card.image = match;
cardsUpdated++;
} else {
cardsSkipped++;
}
}
writeFileSync("data/cards.json", `${JSON.stringify(cards, null, 2)}\n`);
console.debug(`cards.json: ${cardsUpdated} updated, ${cardsSkipped} no match`);
// --- relics.json ---
const relicsRaw = readFileSync("data/relics.json", "utf8");
const relics = JSON.parse(relicsRaw);
let relicsUpdated = 0;
let relicsSkipped = 0;
for (const relic of relics) {
const match = baseById[relic.id];
if (match) {
relic.image = match;
relicsUpdated++;
} else {
relicsSkipped++;
}
}
writeFileSync("data/relics.json", `${JSON.stringify(relics, null, 2)}\n`);
console.debug(
`relics.json: ${relicsUpdated} updated, ${relicsSkipped} no match`,
);
// --- potions.json ---
const potionsRaw = readFileSync("data/potions.json", "utf8");
const potions = JSON.parse(potionsRaw);
let potionsUpdated = 0;
let potionsSkipped = 0;
for (const potion of potions) {
const match = baseById[potion.id];
if (match) {
potion.image = match;
potionsUpdated++;
} else {
potionsSkipped++;
}
}
writeFileSync("data/potions.json", `${JSON.stringify(potions, null, 2)}\n`);
console.debug(
`potions.json: ${potionsUpdated} updated, ${potionsSkipped} no match`,
);
// --- enemies.json ---
const enemiesRaw = readFileSync("data/enemies.json", "utf8");
const enemies = JSON.parse(enemiesRaw);
let enemiesUpdated = 0;
let enemiesSkipped = 0;
for (const [enemyId, enemy] of Object.entries(enemies)) {
const match = baseById[enemyId];
if (match) {
enemy.image = match;
enemiesUpdated++;
} else {
enemiesSkipped++;
}
}
writeFileSync("data/enemies.json", `${JSON.stringify(enemies, null, 2)}\n`);
console.debug(
`enemies.json: ${enemiesUpdated} updated, ${enemiesSkipped} no match`,
);