/**
* Полный прогон акта 1 через агентный мост: луга -> Звенец -> квест у Ирвина ->
* (сбор цветов эмулируется var'ом) -> сдача -> кат-сцена с колоколом.
* Запуск: node tools/smoke-act1.mjs [url] [скриншот]
*/
import { openGame } from './agent-lib.mjs';
const url = process.argv[2] ?? 'http://localhost:5199/';
const shot = process.argv[3] ?? '/tmp/rpg_act1.png';
const { browser, page, agent, consoleLogs } = await openGame({ url, newGame: true });
page.on('pageerror', (err) => console.log(`[ошибка страницы] ${err.message}\n${err.stack ?? ''}`));
// Усыпить сгустков: путь героя не должен прерываться уроном.
async function sleepAll() {
await page.evaluate(() => {
const g = window.__game;
for (const [, en] of g.scenes.current.combat?.enemies ?? []) en.brain.putToSleep(9999);
});
}
await sleepAll();
// 1) Луга -> тропа в Звенец (26,14) — триггер срабатывает на самом тайле.
console.log('шаг 1: луга -> Звенец');
if (!(await agent.walkTo(26, 14))) console.log(' ! герой не дошёл до (26,14)');
await agent.waitFor('s.area === "zvenets"', { timeoutTicks: 300 });
// Фаза «in» fade-перехода: сцена ещё игнорирует клики.
await agent.waitFor('!s.transitioning', { timeoutTicks: 300 });
await sleepAll(); // переход мог вернуть героя в бой
// 2-3) Клик по Ирвину (12,9): сцена сама подведёт героя и откроет диалог.
console.log('шаг 2: квест у Ирвина');
await agent.tapTile(12, 9);
if (!(await agent.runDialogue())) console.log(' ! диалог с Ирвином не открылся');
// 4) Сбор цветов — эмуляция var'ом (вылазка проверяется smoke-ponds).
console.log('шаг 4: цветы собраны (эмуляция)');
await agent.command('scene:setVar', { id: 'flowers', value: 3 });
// 5) Сдача Ирвину -> кат-сцена.
console.log('шаг 5: сдача -> кат-сцена');
await agent.tapTile(12, 9);
if (!(await agent.runDialogue())) console.log(' ! диалог сдачи не открылся');
// 6) Кат-сцена: крутим шаги, пока активна (мост перематывает без реального ожидания).
await agent.waitFor('s.cutscene == null || !s.cutscene.active', { timeoutTicks: 1200 });
const snap = await agent.snapshot();
console.log('итог:', JSON.stringify({ flags: snap.flags, vars: snap.vars }));
await page.screenshot({ path: shot });
console.log(`Скриншот: ${shot}`);
if (!snap.flags.includes('quest_bells_done')) console.log(' ! квест не закрыт (quest_bells_done)');
await browser.close();