Files

40 lines
1.8 KiB
TypeScript

// Генерация мира из файла Overpass JSON без браузера.
// npx tsx scripts/cli.ts input.json south west north east [out.json]
import { readFileSync, writeFileSync } from 'node:fs';
import { generateWorldSync } from '../src/gen/generate';
const [inp, s, w, n, e, out] = process.argv.slice(2);
if (!inp || !e) {
console.error('usage: tsx scripts/cli.ts input.json south west north east [out.json]');
process.exit(1);
}
const els = JSON.parse(readFileSync(inp, 'utf8')).elements;
const t0 = Date.now();
const world = generateWorldSync(els, [+s, +w, +n, +e], inp, 1);
const dt = Date.now() - t0;
const kinds: Record<string, number> = {};
const roomKinds: Record<string, number> = {};
let floors = 0, rooms = 0, props = 0, doors = 0, windows = 0, noEntrance = 0, units = 0, beds = 0;
for (const b of world.buildings) {
kinds[b.kind] = (kinds[b.kind] ?? 0) + 1;
floors += b.floors.length;
units += b.units.length;
beds += b.beds;
for (const f of b.floors) {
rooms += f.rooms.length;
props += f.props.length;
doors += f.doors.length;
windows += f.windows.length;
for (const r of f.rooms) roomKinds[r.kind] = (roomKinds[r.kind] ?? 0) + 1;
}
if (b.floors[0] && !b.floors[0].doors.some((d) => d.rooms[1] === 'outside')) noEntrance++;
}
console.log(`${dt} ms; buildings ${world.buildings.length}, areas ${world.areas.length}, roads ${world.roads.length}, street props ${world.props.length}`);
console.log('kinds', kinds);
console.log(`floors ${floors}, rooms ${rooms}, doors ${doors}, windows ${windows}, furniture ${props}, units ${units}, beds ${beds}, no entrance ${noEntrance}`);
console.log('rooms', roomKinds);
const json = JSON.stringify(world);
console.log(`world json ${(json.length / 1e6).toFixed(1)} MB`);
if (out) writeFileSync(out, json);