import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import { generateMap } from './mapGenerator.js'; import { createWorldMap } from './worldMap.js'; import { generatePatch } from './mapPatch.js'; import { MAP_W, MAP_H } from './mapUtils.js'; function worldPoint(world, p) { return { x: Math.round((p?.x || 0) + (world.originX || 0)), y: Math.round((p?.y || 0) + (world.originY || 0)) }; } function idx(world,x,y){ return x>=0&&y>=0&&x=0) active.add(Math.floor(pref[i])); const counts=new Map([...active].map(id=>[id,0])); for(const city of world.sourceMap.modernCities||[]) { const cap=city.isPrefecturalCapital||city.isRegionalCapital||/Capital/i.test(String(city.rank||''))||/Capital/i.test(String(city.kind||'')); if(!cap) continue; const p=worldPoint(world,city), i=idx(world,p.x,p.y); if(i<0||sea[i]||pref[i]<0) continue; const id=Math.floor(pref[i]); counts.set(id,(counts.get(id)||0)+1); } return { active:[...active], zero:[...counts].filter(([,n])=>n===0), duplicate:[...counts].filter(([,n])=>n>1) }; } function riverSeaPointsOutsideRect(world, rect) { const sea=world.fields.sea; const out=[]; for(const key of ['rivers','riverPaths','majorRivers','minorRivers']) for(const path of world.sourceMap?.[key]||[]) for(const t of path||[]) { if(!Array.isArray(t)||t.length<2) continue; const x=Math.round((t[0]||0)+world.originX), y=Math.round((t[1]||0)+world.originY), i=idx(world,x,y); if(i>=0 && sea[i] && !(x>=rect.x0&&x=rect.y0&&y