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

27 lines
2.6 KiB
JavaScript

import assert from 'node:assert/strict';
import { generateMap } from './mapGenerator.js';
import { createWorldMap, ensureWorldPaddingForCamera } from './worldMap.js';
import { generatePatch } from './mapPatch.js';
import { MAP_W, MAP_H } from './mapUtils.js';
const seed=24681357;
const init=generateMap(seed,{terrainType:'auto',onProgress(){}});
function opts(){return {patchMode:'expansion',terrainType:'auto',seed:0x4a35b921,variant:1,maxQualityRetries:0,qualityTerrainAttempts:1,acceptBestAvailableQuality:true};}
function worldRect(w){return {x0:w.originX+MAP_W-34,y0:w.originY+34,x1:w.originX+MAP_W+106,y1:w.originY+154};}
const a=createWorldMap(structuredClone(init));
const ra=worldRect(a); const wa0={x0:ra.x0-a.originX,y0:ra.y0-a.originY,x1:ra.x1-a.originX,y1:ra.y1-a.originY};
const ar=generatePatch(a,ra,opts()); assert.equal(ar.ok,true,ar.reason||ar.code);
const b=createWorldMap(structuredClone(init)); ensureWorldPaddingForCamera(b,{x:0,y:0},MAP_W,MAP_H,82);
const rb={x0:b.originX+wa0.x0,y0:b.originY+wa0.y0,x1:b.originX+wa0.x1,y1:b.originY+wa0.y1};
const br=generatePatch(b,rb,opts()); assert.equal(br.ok,true,br.reason||br.code);
const fields=['elevation','sea','plain','agriculture','populationDensity','prefectureRegionId','adminId'];
const padding={};
for(const name of fields){let diff=0,max=0,n=0; const A=a.fields[name],B=b.fields[name]; for(let wy=wa0.y0;wy<wa0.y1;wy++)for(let wx=wa0.x0;wx<wa0.x1;wx++){const ai=(wy+a.originY)*a.width+(wx+a.originX),bi=(wy+b.originY)*b.width+(wx+b.originX); const d=Math.abs(Number(A[ai])-Number(B[bi])); if(d>1e-9)diff++; if(d>max)max=d;n++;} padding[name]={n,diff,max}; assert.equal(diff,0,`${name} changed after world padding`);}
// Both patch modes must report the same unified generator mode. Use modest rectangles to keep the validation fast.
const c=createWorldMap(structuredClone(init)); const cr={x0:c.originX+50,y0:c.originY+45,x1:c.originX+150,y1:c.originY+145};
const regen=generatePatch(c,cr,{...opts(),patchMode:'regeneration'}); assert.equal(regen.ok,true,regen.reason||regen.code);
const d=createWorldMap(structuredClone(init)); const dr={x0:d.originX+MAP_W-30,y0:d.originY+40,x1:d.originX+MAP_W+90,y1:d.originY+150};
const exp=generatePatch(d,dr,opts()); assert.equal(exp.ok,true,exp.reason||exp.code);
assert.match(String(regen.patchGenerationMode||regen.humanGeography?.patchGenerationMode||''),/unified-world-native/);
assert.match(String(exp.patchGenerationMode||exp.humanGeography?.patchGenerationMode||''),/unified-world-native/);
console.log(JSON.stringify({ok:true,padding,regenerationMode:regen.patchGenerationMode,expansionMode:exp.patchGenerationMode},null,2));
process.exit(0);