Files
healer-man/scripts/playtest-runewaker-maps.cjs
2026-09-26 17:51:56 -04:00

90 lines
4.9 KiB
JavaScript

const { chromium } = require('C:/Users/phenom/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules/playwright');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const os = require('node:os');
const path = require('node:path');
const directory = path.resolve('artifacts/playtest/runewaker-maps');
const port = 4197;
const base = `http://127.0.0.1:${port}`;
fs.mkdirSync(directory, { recursive: true });
const runtimeData = fs.mkdtempSync(path.join(os.tmpdir(), 'healer-man-runewaker-maps-'));
(async () => {
const { createGameServer } = await import('../server/server.mjs');
const runtime = createGameServer({ dataDir: runtimeData, enableShelvedModes: false });
await new Promise((resolve) => runtime.server.listen(port, '127.0.0.1', resolve));
const browser = await chromium.launch({ channel: 'msedge', headless: true });
const context = await browser.newContext({ viewport: { width: 1440, height: 900 } });
const page = await context.newPage();
page.setDefaultTimeout(180_000);
const pageErrors = [];
page.on('pageerror', (error) => pageErrors.push(error.message));
try {
await page.goto(base, { waitUntil: 'domcontentloaded' });
await page.getByLabel('Username').fill('RunewakerMapQA');
await page.getByLabel('Password').fill('runewaker-map-playtest');
await page.getByRole('button', { name: /Create account/ }).click();
await page.locator('.character-select-screen').waitFor();
await page.getByRole('button', { name: /Create character/ }).click();
await page.locator('.creator-category-tabs button').filter({ hasText: 'RoM' }).click();
await page.locator('.class-option').filter({ hasText: 'Rogue' }).click();
await page.getByRole('button', { name: /Customize & name/ }).click();
await page.getByLabel('Character name').fill('RunewakerMapQA');
await page.getByRole('button', { name: /Create character/ }).click();
await page.locator('.character-select-screen').waitFor();
await page.locator('.roster-enter').evaluate((button) => button.click());
await page.locator('.main-menu-screen').waitFor();
await page.getByRole('button', { name: /Dungeons/ }).click();
await page.locator('.dungeon-category-tab').filter({ hasText: 'RoM' }).click();
await page.locator('.dungeon-select-row').filter({ hasText: 'Forsaken Abbey' }).click();
console.log('Selected Forsaken Abbey; installing its content pack');
await page.getByRole('button', { name: 'Download and continue' }).click();
await page.locator('.dungeon-role-picker').waitFor();
console.log('Content installed; entering as damage');
await page.locator('.dungeon-role-option--damage').click();
await page.locator('.hud-minimap svg').waitFor();
await page.locator('.loading-screen').waitFor({ state: 'detached' });
await page.locator('.dungeon-boss-intro').waitFor({ state: 'detached' });
await page.locator('.hud-minimap svg image').waitFor();
await page.screenshot({ path: path.join(directory, 'forsaken-minimap.png') });
const minimapArt = await page.locator('.hud-minimap svg image').getAttribute('href');
assert.match(minimapArt, /forsaken-abbey\/maps\/runewaker-map\.png/);
const playerPosition = async () => {
const marker = page.locator('.hud-minimap .map-player');
return [Number(await marker.getAttribute('cx')), Number(await marker.getAttribute('cy'))];
};
const beforeMovement = await playerPosition();
await page.keyboard.down('s');
await page.waitForTimeout(1000);
await page.keyboard.up('s');
await page.waitForTimeout(250);
const afterMovement = await playerPosition();
assert.ok(Math.hypot(afterMovement[0] - beforeMovement[0], afterMovement[1] - beforeMovement[1]) > 0.1,
`Minimap marker did not move: ${beforeMovement} -> ${afterMovement}`);
await page.keyboard.press('m');
await page.locator('.map-panel svg image').waitFor();
await page.locator('.map-panel svg[data-artwork="ready"]').waitFor();
await page.screenshot({ path: path.join(directory, 'forsaken-full-map.png') });
assert.match(await page.locator('.map-panel svg image').getAttribute('href'), /forsaken-abbey\/maps\/runewaker-map\.png/);
const marker = page.locator('.map-panel .map-player');
assert.ok(Number.isFinite(Number(await marker.getAttribute('cx'))));
assert.ok(Number.isFinite(Number(await marker.getAttribute('cy'))));
await page.keyboard.press('m');
await page.locator('.map-panel').waitFor({ state: 'detached' });
assert.deepEqual(pageErrors, []);
console.log(`RuneWaker minimap and M-key screenshots: ${directory}`);
} finally {
await browser.close();
await new Promise((resolve) => runtime.server.close(resolve));
const resolved = path.resolve(runtimeData);
assert.ok(resolved.startsWith(path.resolve(os.tmpdir()) + path.sep));
fs.rmSync(resolved, { recursive: true, force: true });
}
})().catch((error) => {
console.error(error);
process.exitCode = 1;
});