// node audit.cjs w1,w2,... → JSON lines: per live kill, the dry maps it SKIPS (mapCheck mode 'skip') const C = require('/Volumes/Workspace/Scratch/A/tools/common.cjs'); const fs = require('fs'); (async () => { const ws = process.argv[2].split(','), out = process.argv[3]; for (const w of ws) { let P; try { P = await C.open('58k_' + w + '.html'); } catch (e) { fs.appendFileSync(out, JSON.stringify({ w, err: String(e).slice(0, 200) }) + '\n'); continue; } try { const r = await P.page.evaluate(async (w) => { const ids = K58.mapIds().filter((m) => m !== 'deep'); for (const m of ids) { if (K58.mapsReady) await K58.mapsReady(m); } const seen = new Set(), defs = []; const add = (d, kind) => { if (d && !seen.has(d.key)) { seen.add(d.key); defs.push([d, kind]); } }; (K58.list(w) || []).forEach((d) => add(d, d.skin ? 'skin' : 'film')); try { (K58.skList(w) || []).filter(K58.live).forEach((d) => add(d, 'skin')); } catch (e) {} try { (K58.mids(w) || []).forEach((d) => add(d, 'mid')); } catch (e) {} return defs.map(([d, kind]) => { const skips = []; for (const m of ids) { let mc; try { mc = K58.mapCheck(d, m); } catch (e) { mc = { mode: 'err' }; } if (!mc || mc.mode === 'skip' || mc.mode === 'err') skips.push(m + (mc && mc.missing ? ':' + [].concat(mc.missing).join('+') : '')); } return { key: d.key, name: d.name, kind, home: d.arena, needs: d.needs, skips, n: ids.length }; }); }, w); for (const x of r) fs.appendFileSync(out, JSON.stringify({ w, ...x }) + '\n'); } catch (e) { fs.appendFileSync(out, JSON.stringify({ w, err: String(e).slice(0, 300) }) + '\n'); } await P.close(); } })();