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

12 lines
2.4 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';
function fpContains(fp,x,y){if(!fp||x<fp.x0||y<fp.y0||x>=fp.x1||y>=fp.y1)return false;const row=fp.rowRuns?.[y-fp.y0];if(!Array.isArray(row))return false;for(let i=0;i+1<row.length;i+=2)if(x>=row[i]&&x<row[i+1])return true;return false;}
function recContains(r,x,y){if(r?.generatedFootprint)return fpContains(r.generatedFootprint,x,y);const q=r?.coreRect||r;return !!q&&x>=q.x0&&y>=q.y0&&x<q.x1&&y<q.y1;}
function coverage(world,rect){let selected=0,generated=0;for(let y=rect.y0;y<rect.y1;y++)for(let x=rect.x0;x<rect.x1;x++){selected++;if((world.generatedRects||[]).some(r=>recContains(r,x,y)))generated++;}return{selected,generated,missing:selected-generated,ratio:generated/selected};}
function makeRect(world,w,h){const edge=world.originX+MAP_W-1,cy=world.originY+Math.floor(MAP_H/2);return{x0:edge-40,y0:cy-Math.floor(h/2),x1:edge-40+w,y1:cy-Math.floor(h/2)+h};}
const initial=generateMap(24681357,{terrainType:'auto',onProgress(){}});
const directWorld=createWorldMap(structuredClone(initial)); const directRect=makeRect(directWorld,250,180); const direct=generatePatch(directWorld,directRect,{patchMode:'expansion',terrainType:'auto',seed:0x12345678,variant:1,maxQualityRetries:0,qualityTerrainAttempts:1,acceptBestAvailableQuality:true}); assert.equal(direct.ok,true,direct.reason||direct.code); assert.notEqual(direct.tiledExpansion,true); assert.equal(direct.candidateQuality?.requestedTerrainAttempts,1); assert.equal(direct.candidateQuality?.fullAttempts?.length,1);
const world=createWorldMap(structuredClone(initial)); const rect=makeRect(world,280,200); const r=generatePatch(world,rect,{patchMode:'expansion',terrainType:'auto',seed:0x4a35b921,variant:1,maxQualityRetries:0,qualityTerrainAttempts:1,acceptBestAvailableQuality:true}); assert.equal(r.ok,true,r.reason||r.code); assert.equal(r.tiledExpansion,true); assert.equal(r.tileCount,4); assert.equal(r.seamDiagnostics?.hardPass,true); const c=coverage(world,rect); assert.equal(c.missing,0); console.log(JSON.stringify({ok:true,direct:{size:'250x180',fullAttempts:direct.candidateQuality.fullAttempts.length,tiled:false},large:{size:'280x200',tileCount:r.tileCount,seam:r.seamDiagnostics.status,coverage:c,totalMs:r.patchTimings.find(x=>x.key==='tiled-total')?.ms}},null,2)); process.exit(0);