Files
healer-man/scripts/runewaker-pipeline/review-water-screen-effects.cjs
T
2026-10-06 22:25:34 -04:00

64 lines
4.0 KiB
JavaScript

const { chromium } = require('C:/Users/phenom/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules/playwright');
const fs = require('node:fs');
const path = require('node:path');
const output = path.resolve('artifacts/playtest/rom-deep-review/water-screen-effects');
(async () => {
const { createServer } = await import('vite');
const server = await createServer({ configFile: false, publicDir: 'public',
cacheDir: path.join(output, '.vite'),
optimizeDeps: { entries: ['scripts/runewaker-pipeline/environment-preview.html'] },
server: { host: '127.0.0.1', port: 0, strictPort: true, watch: null } });
await server.listen();
const browser = await chromium.launch({ channel: 'msedge', headless: true });
const results = [];
try {
for (const staged of [false, true]) {
const page = await browser.newPage({ viewport: { width: 1600, height: 1000 } });
const errors = [];
page.on('pageerror', error => errors.push(error.message));
page.on('console', message => { if (message.type() === 'error') errors.push(message.text()); });
await page.route('**/favicon.ico', route => route.fulfill({ status: 204 }));
const baseline = path.join(output, 'pre-promotion-backup/src/assets/game/dungeons/the-origin/the-origin-visual.glb');
const asset = staged ? path.join(output, 'shipping-the-origin-visual.glb') : baseline;
if (staged || fs.existsSync(baseline)) await page.route('**/src/assets/game/dungeons/the-origin/the-origin-visual.glb',
route => route.fulfill({ path: asset, contentType: 'model/gltf-binary' }));
await page.goto(`http://127.0.0.1:${server.httpServer.address().port}/scripts/runewaker-pipeline/environment-preview.html?dungeon=the-origin`, { waitUntil: 'commit' });
await page.waitForFunction(() => window.romEnvironmentReview?.ready, null, { timeout: 180000 });
const waterPoint = [-219.8775686, -21.5003624, 182.7898102];
await page.evaluate(target => window.romEnvironmentReview.inspectAt(
[target[0] + 5, target[1] + 3, target[2] + 5], target), waterPoint);
await page.waitForTimeout(1600);
await page.evaluate(() => window.romEnvironmentReview.resetFrameSample());
await page.waitForTimeout(4000);
const diagnostics = await page.evaluate(() => ({
performance: window.romEnvironmentReview.frameSample(),
water: window.romEnvironmentReview.waterDiagnostics(),
center: window.romEnvironmentReview.raycastAt(innerWidth / 2, innerHeight / 2, 4),
drawCalls: window.romEnvironmentReview.drawCalls(),
}));
const file = `exposed-water-${staged ? 'reflection' : 'baseline'}.png`;
await page.screenshot({ path: path.join(output, file) });
await page.evaluate(target => window.romEnvironmentReview.inspectAt(
[target[0] + 5, target[1] + 0.7, target[2] + 12], [target[0] - 5, target[1], target[2] - 7]), waterPoint);
await page.waitForTimeout(1200);
const glancing = `glancing-water-${staged ? 'reflection' : 'baseline'}.png`;
await page.screenshot({ path: path.join(output, glancing) });
const glancingDiagnostics = await page.evaluate(() => ({
water: window.romEnvironmentReview.waterDiagnostics(),
center: window.romEnvironmentReview.raycastAt(innerWidth / 2, innerHeight / 2, 4),
}));
results.push({ staged, screenshot: file, glancing, glancingDiagnostics, errors, ...diagnostics });
console.log(JSON.stringify({ staged, errors, fps: diagnostics.performance.fps,
ready: diagnostics.water.filter(layer => layer.screenEffectsReady).length,
planes: new Set(diagnostics.water.map(layer => layer.reflection).filter(Boolean)).size }));
await page.close();
}
} finally {
await browser.close();
await server.close();
fs.writeFileSync(path.join(output, 'browser-proof.json'), JSON.stringify(results, null, 2) + '\n');
}
if (results.some(result => result.errors.length)) process.exitCode = 1;
})().catch(error => { console.error(error); process.exitCode = 1; });