Newer
Older
rpg / tools / smoke-act1.mjs
/**
 * Полный прогон акта 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();