Newer
Older
rpg / apps / game / tools / checks / transitions.mjs
/**
 * Сценарий transitions — единый механизм переходов.
 * 1) step-переход: пешком в Звенец -> area==='zvenets'.
 * 2) клик-переход: клик по колодцу у дома Ирвина -> телепорт на луга (entry (22,21)).
 * 3) обратный колодец: клик по луговому колодцу -> возврат в Звенец.
 * 4) снапшот перечисляет переходы области с триггерами.
 * Запуск: node tools/agent.mjs run tools/checks/transitions.mjs
 */
import { withChecks } from '../lib.mjs';

export default async function ({ pretty }) {
    return withChecks(
        'transitions',
        async (t) => {
            const { c } = t;
            await c.run('step-переход: луга -> Звенец пешком', async () => {
                await t.boot();
                // Спим врагов, чтобы путь был безопасным; идём к тропе (26,14).
                await t.sleepEnemies();
                await t.goToArea('zvenets', { x: 26, y: 14 });
                return null;
            });
            await c.run('клик-переход: колодец Звенца -> луга', async () => {
                // Колодец (9,6) у дома Ирвина; entry на лугах — (22,21).
                await t.ctx.agent.tapTile(9, 6);
                const w = await t.ctx.agent.waitFor('s.area === "meadows"', { timeoutTicks: 1200 });
                c.expect(w.ok, 'колодец не телепортировал на луга', { area: w.snapshot.area });
                await t.ctx.agent.waitFor('!s.transitioning', { timeoutTicks: 600 });
                const s = await t.ctx.agent.snapshot();
                c.expect(s.hero.tile.x === 22 && s.hero.tile.y === 21, 'герой не на entry (22,21)', s.hero.tile);
                return null;
            });
            await c.run('обратный колодец: луга -> Звенец', async () => {
                // Луговой колодец (22,20) стоит рядом с entry — кликаем по нему.
                await t.ctx.agent.tapTile(22, 20);
                const w = await t.ctx.agent.waitFor('s.area === "zvenets"', { timeoutTicks: 1200 });
                c.expect(w.ok, 'луговой колодец не вернул в Звенец', { area: w.snapshot.area });
                await t.ctx.agent.waitFor('!s.transitioning', { timeoutTicks: 600 });
                const s = await t.ctx.agent.snapshot();
                c.expect(s.hero.tile.x === 9 && s.hero.tile.y === 7, 'герой не на entry (9,7) Звенца', s.hero.tile);
                return null;
            });
            await c.run('снапшот: переходы области с триггерами', async () => {
                const s = await t.ctx.agent.snapshot();
                const wells = (s.transitions ?? []).filter((tr) => tr.trigger === 'click');
                c.expect(wells.length >= 1, 'нет click-переходов в снапшоте', s.transitions);
                c.expect(
                    (s.transitions ?? []).every((tr) => typeof tr.to === 'string' && tr.to.length > 0),
                    'переход без цели',
                    s.transitions
                );
                return null;
            });
        },
        { pretty }
    );
}