// act-pack-state.js — 资源包路径的状态断言(acts.html 默认路径)
//
// 判定全来自 window.__d2webAct:是不是走了资源包、首屏只装了几页(证明懒加载)、
// 出画面用了多久、以及按键后角色是否沿屏幕方向位移且朝向正确。返回 JSON。
//
// CHROME=/root/.cache/ms-playwright/chromium-1223/chrome-linux64/chrome
// node scripts/browser/inspect-page.mjs "$CHROME" \
// "http://127.0.0.1:5173/acts.html?act=1" scripts/browser/checks/act-pack-state.js
(async () => {
const sleep = (ms) => new Promise((r) => setTimeout(r, ms))
const deadline = Date.now() + 120000
while (Date.now() < deadline) {
const s = window.__d2webAct
if (s && (s.ready || s.error)) break
await sleep(200)
}
const atReady = { ...(window.__d2webAct ?? {}) }
await sleep(6000)
const after = { ...(window.__d2webAct ?? {}) }
const before = { x: after.x, y: after.y }
const press = (code, down) => window.dispatchEvent(new KeyboardEvent(down ? 'keydown' : 'keyup', { code, bubbles: true }))
press('ArrowRight', true); await sleep(900); press('ArrowRight', false)
await sleep(200)
const moved = { x: window.__d2webAct?.x ?? 0, y: window.__d2webAct?.y ?? 0, facing: window.__d2webAct?.facing ?? -1 }
return {
source: atReady.source, ready: atReady.ready, error: atReady.error ?? null,
base: atReady.base, act: atReady.act, level: atReady.level, quadrant: atReady.quadrant,
cells: `${atReady.cellsX}x${atReady.cellsY}`,
floors: atReady.floors, walls: atReady.walls, frames: atReady.frames, objects: atReady.objects,
character: atReady.character,
characterMembers: atReady.characterMembers,
characterAfter: after.character,
characterMembersAfter: after.characterMembers,
levelOptions: document.querySelector('#level')?.querySelectorAll('option').length ?? -1,
pickerSelected: document.querySelector('#level')?.selectedOptions?.[0]?.textContent ?? null,
pagesAtReady: `${atReady.pagesLoaded}/${atReady.pagesTotal}`,
pagesAtFirstFrame: `${atReady.pagesAtFirstFrame}/${atReady.pagesTotal}`,
firstFrameMs: atReady.firstFrameMs,
priorityPages: atReady.priorityPages,
lazyFirstFrame: atReady.pagesAtFirstFrame < atReady.pagesTotal,
pagesAfterWait: `${after.pagesLoaded}/${after.pagesTotal}`,
lazyFirstPaint: (atReady.pagesLoaded ?? 0) < (atReady.pagesTotal ?? 0),
loadMs: atReady.loadMs,
skippedAtReady: atReady.skippedDraws,
move: [Math.round(moved.x - before.x), Math.round(moved.y - before.y)],
facing: moved.facing,
tick: after.tick,
walkable: Number((atReady.walkable ?? 0).toFixed(3)),
// 画布是否铺满窗口 + 缩放是否至少覆盖视口
canvas: [after.canvasWidth, after.canvasHeight],
viewport: [window.innerWidth, window.innerHeight],
zoom: after.zoom,
coverZoom: Math.max(window.innerWidth / Math.max(1, after.widthPx), window.innerHeight / Math.max(1, after.heightPx)),
canvasFillsWindow: after.canvasWidth >= window.innerWidth - 2 && after.canvasHeight >= window.innerHeight - 2,
mapCoversViewport: (after.zoom ?? 0) + 1e-6 >= Math.max(window.innerWidth / Math.max(1, after.widthPx), window.innerHeight / Math.max(1, after.heightPx)),
}
})()