/**
* Проба анимации ходьбы героя: запускаем игру, отправляем героя на запад,
* снимаем серию скриншотов во время движения.
* Запуск: node tools/walk-probe.mjs [url] [префикс]
*/
import puppeteer from 'puppeteer-core';
const url = process.argv[2] ?? 'http://localhost:5201/';
const prefix = process.argv[3] ?? '/tmp/walk';
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('pageerror', (err) => console.log(`[ошибка страницы] ${err.message}`));
const booted = new Promise((resolve) => {
page.on('console', (msg) => {
if (msg.text().includes('[location]')) resolve();
});
});
await page.goto(url, { waitUntil: 'networkidle2', timeout: 20000 });
await new Promise((r) => setTimeout(r, 2000));
await page.mouse.click(480, 283); // «Новая игра»
await booted;
await new Promise((r) => setTimeout(r, 1500));
// Клик по мировому тайлу слева от героя (запад) — через window.__game.
await page.evaluate(() => {
const g = window.__game;
const sc = g.scenes.current;
const t = sc.player.currentTile();
const p = sc.tileCenter(t.x - 6, t.y);
const canvas = document.querySelector('canvas');
const rect = canvas.getBoundingClientRect();
const wr = g.renderer.worldRoot.position;
return { x: rect.left + ((p.x + wr.x) / 480) * rect.width,
y: rect.top + ((p.y + wr.y) / 270) * rect.height };
}).then((pt) => page.mouse.click(pt.x, pt.y));
// Серия кадров во время ходьбы
for (let i = 0; i < 6; i++) {
await page.screenshot({ path: `${prefix}_${i}.png` });
await new Promise((r) => setTimeout(r, 130));
}
console.log('Готово');
await browser.close();