map/archive/generated-history/VALIDATE_CAPITAL_SEQUENCE.mjs
2026-08-08 17:41:30 +09:00

37 lines
2.6 KiB
JavaScript

import assert from 'node:assert/strict';
import { generateMap } from './mapGenerator.js';
import { createWorldMap } from './worldMap.js';
import { generatePatch } from './mapPatch.js';
import { MAP_W, MAP_H } from './mapUtils.js';
const initial=generateMap(42424242,{terrainType:'auto',onProgress(){}});
const world=createWorldMap(structuredClone(initial));
const rects=[
{x0:world.originX+MAP_W-25,y0:world.originY+30,x1:world.originX+MAP_W+115,y1:world.originY+150},
{x0:world.originX+35,y0:world.originY+MAP_H-25,x1:world.originX+175,y1:world.originY+MAP_H+105},
];
function audit(){
const pref=world.fields.prefectureRegionId, sea=world.fields.sea; const active=new Set();
for(let i=0;i<pref.length;i++) if(!sea[i]&&pref[i]>=0) active.add(Math.floor(pref[i]));
const counts=new Map([...active].map(id=>[id,0]));
for(const c of world.sourceMap.modernCities||[]){
const cap=c.isPrefecturalCapital||c.isRegionalCapital||/Capital/i.test(String(c.rank||''))||/Capital/i.test(String(c.kind||'')); if(!cap)continue;
const x=Math.round((c.x||0)+world.originX),y=Math.round((c.y||0)+world.originY); if(x<0||y<0||x>=world.width||y>=world.height)continue;
const i=y*world.width+x; if(sea[i]||pref[i]<0)continue; const id=Math.floor(pref[i]); counts.set(id,(counts.get(id)||0)+1);
}
const zeros=[...counts].filter(([,n])=>n===0), dup=[...counts].filter(([,n])=>n!==1);
assert.equal(zeros.length,0,`zero capital ${JSON.stringify(zeros)}`); assert.equal(dup.length,0,`not exactly one ${JSON.stringify(dup)}`);
for(const r of world.sourceMap.prefectureRegions||[]){
const id=Math.floor(r.prefectureRegionId??r.id); assert.ok(active.has(id)); assert.equal(r.insidePrefecture,true);
const cx=Math.round(r.capitalWorldX), cy=Math.round(r.capitalWorldY); assert.ok(cx>=0&&cy>=0&&cx<world.width&&cy<world.height);
const i=cy*world.width+cx; assert.equal(Math.floor(pref[i]),id,`capital metadata outside prefecture ${id}`); assert.equal(!!sea[i],false);
assert.equal(Math.round((r.capitalX||0)+world.originX),cx); assert.equal(Math.round((r.capitalY||0)+world.originY),cy);
assert.equal(Math.round((r.x||0)+world.originX),Math.round(r.worldX)); assert.equal(Math.round((r.y||0)+world.originY),Math.round(r.worldY));
}
return {active:active.size};
}
const steps=[];
for(let k=0;k<rects.length;k++){
const r=generatePatch(world,rects[k],{patchMode:'expansion',terrainType:'auto',seed:91000+k,variant:0,maxQualityRetries:0,qualityTerrainAttempts:1,acceptBestAvailableQuality:true});
assert.equal(r.ok,true,r.reason||r.code); steps.push({...audit(),seam:r.seamDiagnostics?.status||null});
}
console.log(JSON.stringify({ok:true,steps},null,2)); process.exit(0);