Files

42 lines
2.4 KiB
JavaScript
Raw Permalink Normal View History

2026-10-30 23:54:07 +07:00
import * as s from './stages.mjs';
const e=s.primitive;
export const TABLES={
GridFightItemConfigRow:['GameCore', 'GridFightItems'],
GridFightEquipConfigRow:['GameCore', 'GridFightEquipment'],
GridFightCraftConfigRow:['GameCore', 'GridFightCraftConfig'],
GridFightEquipUpgradeConfigRow:['GameCore', 'GridFightEquipUpgrade'],
GridFightConsumablesConfigRow:['GameCore', 'GridFightConsumables'],
GridFightAugmentConfigRow:['GameCore', 'GridFightAugment'],
GridFightPortalBuffConfigRow:['', 'GridFightPortalBuff'],
GridFightSeasonAugmentConfigRow:['', 'GridFightSeasonAugment'],
GridFightSeasonPortalConfigRow:['', 'GridFightSeasonPortal'],
GridFightSeasonItemConfigRow:['', 'GridFightSeasonItem'],
GridFightSeasonCraftConfigRow:['', 'GridFightSeasonCraft']
};
export function validate(t){
for(const [row, link, target, key]of [['GridFightSeasonAugmentConfigRow', 'AugmentID', 'GridFightAugmentConfigRow', 'ID'], ['GridFightSeasonPortalConfigRow', 'PortalID', 'GridFightPortalBuffConfigRow', 'ID'], ['GridFightSeasonCraftConfigRow', 'CraftID', 'GridFightCraftConfigRow', 'CraftID']]){
const known=new Set(t[target].map(i=>i[key]));
if(t[row].some(i=>!known.has(i[link])))e.fail(`Unresolved season reference: ${row}.${link}`);
}
if(!e.subset(new Set(t.GridFightEquipConfigRow.map(i=>i.ID)), new Set(t.GridFightItemConfigRow.map(i=>i.ID))))e.fail('Equipment missing from native item catalog');
}
export function main(){
const a=e.cli(['client', 'dump', 'identity', 'output']),
ctx=s.extractionContext(a),
[t, proofs]=s.collect(a, TABLES, ctx);
validate(t);
e.atomic_json(e.path.join(a.output, 'items.raw.json'), t);
e.atomic_json(e.path.join(a.output, 'items-schemas.json'), ctx.codec.schemas);
e.atomic_json(e.path.join(a.output, 'items-provenance.json'), {
source:'installed-client-files',
dump_sha256:ctx.identity.dump_sha256,
game_assembly_sha256:ctx.identity.game_assembly_sha256,
catalogues:ctx.assets.catalogues,
tables:proofs,
outputs:Object.fromEntries(['items.raw.json', 'items-schemas.json'].map(n=>[n, e.sha256_file(e.path.join(a.output, n))])),
purpose:'Raw inventory, recipe and selection contracts; no effect implementation',
unresolved:['Forge asset binding', 'Native choice generation and effect execution', 'Equipment transfer on merge/sell', 'Season item ConfigID semantics'],
gameplay_verified:false
});
}
e.runMain(import.meta.url, main);