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);