42 lines
2.2 KiB
JavaScript
42 lines
2.2 KiB
JavaScript
import fs from 'node:fs';
|
|||
|
|
import path from 'node:path';
|
||
|
|
import {fileURLToPath} from 'node:url';
|
||
|
|
|
||
|
|
// Derived table: what each Investment Environment grants, taken from the
|
||
|
|
// client's GridFightPortalBuffConfigRow.ShowBonusIDList (granted when the
|
||
|
|
// environment is picked; the client shows exactly these bonus bundles on the
|
||
|
|
// portal page, GridFightPortalData.BuildBonusData) and DelayedShowBonus (granted
|
||
|
|
// later, at the moment the portal text names). Both resolve through
|
||
|
|
// GridFightCombinationBonusConfigRow / GridFightBasicBonusConfigRow. Nothing is
|
||
|
|
// read from the client here; the inputs are the installed raw tables.
|
||
|
|
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..');
|
||
|
|
const DIR = path.join(ROOT, 'resources/grid_fight');
|
||
|
|
const load = n => JSON.parse(fs.readFileSync(path.join(DIR, n), 'utf8'));
|
||
|
|
|
||
|
|
export function build(catalog, bonus, portals) {
|
||
|
|
const buffs = new Map(catalog.GridFightPortalBuffConfigRow.map(r => [r.ID, r]));
|
||
|
|
const defined = new Set([
|
||
|
|
...bonus.GridFightBasicBonusConfigRow.map(r => r.BonusID),
|
||
|
|
...bonus.GridFightCombinationBonusConfigRow.map(r => r.BonusID)
|
||
|
|
]);
|
||
|
|
const out = {};
|
||
|
|
for (const p of portals.portals) {
|
||
|
|
const row = buffs.get(p.id);
|
||
|
|
if (!row) throw new Error('portal ' + p.id + ' has no PortalBuff row');
|
||
|
|
const show = row.ShowBonusIDList ?? [], delayed = row.DelayedShowBonus ?? [];
|
||
|
|
for (const id of [...show, ...delayed]) if (!defined.has(id)) throw new Error('portal ' + p.id + ': bonus ' + id + ' undefined');
|
||
|
|
out[p.id] = {show, delayed, traits: row.PortalGameRefTrait ?? []};
|
||
|
|
}
|
||
|
|
return {
|
||
|
|
provenance: 'Derived from catalog.raw.json GridFightPortalBuffConfigRow (ShowBonusIDList, DelayedShowBonus, PortalGameRefTrait) for the season portals of portals.json; bonus IDs resolve in bonus.raw.json. Gameplay not verified in game.',
|
||
|
|
portals: out
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
export function main() {
|
||
|
|
const out = build(load('catalog.raw.json'), load('bonus.raw.json'), load('portals.json'));
|
||
|
|
const target = process.argv[2] ?? path.join(DIR, 'portal-bonus.json');
|
||
|
|
fs.writeFileSync(target, JSON.stringify(out, null, 1) + '\n');
|
||
|
|
console.log('portal-bonus: ' + Object.keys(out.portals).length + ' portals -> ' + target);
|
||
|
|
}
|
||
|
|
if (process.argv[1] === fileURLToPath(import.meta.url)) main();
|