28 lines
1.1 KiB
JavaScript
28 lines
1.1 KiB
JavaScript
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 };
|
|
}
|