Newer
Older
rpg / tools / smoke-quest.mjs
/**
 * Смоук квестовой рамки: новая игра → диалог с Ирвином (задание) →
 * сумка с журналом (I). Запуск: node tools/smoke-quest.mjs [url] [скриншот]
 */
import puppeteer from 'puppeteer-core';

const url = process.argv[2] ?? 'http://localhost:5199/';
const shot = process.argv[3] ?? '/tmp/rpg_quest.png';

const browser = await puppeteer.launch({
    executablePath: '/usr/bin/chromium',
    headless: true,
    args: ['--no-sandbox', '--enable-unsafe-swiftshader', '--use-angle=swiftshader',
           '--autoplay-policy=no-user-gesture-required', '--window-size=960,540']
});
const page = await browser.newPage();
await page.setViewport({ width: 960, height: 540 });

page.on('console', (msg) => console.log(`[консоль] ${msg.text()}`));
page.on('pageerror', (err) => console.log(`[ошибка страницы] ${err.message}\n${err.stack ?? ''}`));

const booted = new Promise((resolve) => {
    page.on('console', (msg) => {
        if (msg.text().includes('[boot] ассеты загружены')) resolve();
    });
});

await page.goto(url, { waitUntil: 'networkidle2', timeout: 20000 });
await booted;
await new Promise((r) => setTimeout(r, 1500));

// «Новая игра»
await page.mouse.click(480, 283);
await new Promise((r) => setTimeout(r, 2500));

// Клик по Ирвину (тайл (13,15), герой в (14,14)) — диалог.
await page.mouse.click(416, 270);
await new Promise((r) => setTimeout(r, 1000));

// Листаем реплики до конца.
for (let i = 0; i < 5; i++) {
    await page.keyboard.press('Space');
    await new Promise((r) => setTimeout(r, 500));
}

// Открываем сумку с журналом.
await page.keyboard.press('KeyI');
await new Promise((r) => setTimeout(r, 800));

await page.screenshot({ path: shot });
console.log(`Скриншот: ${shot}`);
await browser.close();