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; });