/**
* Сценарий 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 }
);
}