import { EFFECT_TYPES } from './effects.js'; /** * Bundle the static game data (data/*.json) with lookup tables and validate it, * so a typo in a JSON file fails loudly at startup instead of mid-game. */ export function buildContext({ rules, generators, upgrades }) { const generatorsById = new Map(generators.map((g) => [g.id, g])); const upgradesById = new Map(upgrades.map((u) => [u.id, u])); if (generatorsById.size !== generators.length) throw new Error('Duplicate generator id'); if (upgradesById.size !== upgrades.length) throw new Error('Duplicate upgrade id'); for (const u of upgrades) { if (!EFFECT_TYPES.includes(u.effect?.type)) { throw new Error(`Upgrade "${u.id}": unknown effect type "${u.effect?.type}"`); } if (u.effect.target && !generatorsById.has(u.effect.target)) { throw new Error(`Upgrade "${u.id}": unknown generator "${u.effect.target}"`); } if (u.requires && !upgradesById.has(u.requires)) { throw new Error(`Upgrade "${u.id}": unknown requirement "${u.requires}"`); } } return { rules, generators, upgrades, generatorsById, upgradesById }; }