| 2026-09-07 |

refactor: DialogueRunner -> модель + рантайм; LocationScene 890 -> 737
...
Движок:
- dialogue/graph.ts (новый): типы графа, VarCondition/DialogueEffects/... и
чистые предикаты hasConditions/evalConditions — их берут валидатор, dry-run
и квест-стадии; DialogueRunner.ts (459 -> 298) — только рантайм обхода.
Публичный API @rpg/engine не изменился; ui-and-dialogue.md дополнен.
Игра (сцена — оркестратор, механики — в systems/):
- systems/combat/CombatFlow.ts (новый): боевая обвязка героя — ввод атаки/
резонанс, реакции на урон (вспышка/шейк/отброс/смерть-респаун), hp-бар,
кольцо заряда, уровень угрозы для музыки, подписка combat:hurt.
- systems/LocationHud.ts (новый): название локации, подсказка, счётчик мотов
(одна вьюха в uiRoot вместо трёх полей сцены).
- makeExitGlow — маркер выхода интерьера уехал в InteractableViews.
Проверки: check:fast, agent:check 16/16, smoke-act1 (квест+кат-сцена),
final-smoke (3 поездки + реальный бой) — зелёные.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 hours ago
|
feat(engine): презентация диалогов — mood/tags/textKey, typewriter, клавиатурный выбор
...
- DialogueNode/Choice: mood, tags, textKey (+speakerKey у узла); view
получает mood/tags, текст резолвится hooks.resolve (fallback — ключ,
inline-текст первичен). Узел с одним textKey — реплика.
- ui/reveal.ts: чистый revealText(full, elapsedMs, cps) — тесты в node.
- DialogueBox v2: typewriter (update/skipReveal/revealing), moodColors,
клавиатурный курсор выбора (ListCursor: moveCursor/activate/cursorIndex),
высота панели растёт от контента.
- Игра: DialogueSystem.advance — сначала догнать печать, при выборе
активировать курсор; up/down листают варианты; typewriter 40 cps +
moodColors в LocationScene.
- Тесты: revealText, mood/tags в view, textKey/speakerKey; доки
ui-and-dialogue.md.
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
feat(engine): диалоговые эффекты do[] + onEffect и результат onFinish
...
- DialogueEffectOp (giveItem/takeItem/sound/toast/custom) — эффекты как
данные в графе; движок только эмитит через onEffect(op, at), исполнение
— EffectSink игры. Никаких Inventory в движке.
- DialogueHooks { world, resolve } третьим аргументом конструктора +
setHooks (заменяет параметр world из D1).
- DialogueResult { lastNodeId, path, picks }: путь показанных узлов и
выборы игрока; onFinish(graph, result), result читается и после конца.
- Порядок эффектов: setFlags → clearFlags → setVars → do[].
- Тесты: порядок onEffect у узла/выбора, unknown kind не падает,
path/result/перезапуск; доки ui-and-dialogue.md + practices.md.
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
feat(engine): условия диалогов v2 — whenVars/hasItem + чистый evalConditions
...
- DialogueWorld { hasItem } — предикаты мира (сумка) инъекцией; без world
hasItem-условия ложны.
- DialogueConditions: whenVars (несколько переменных, AND) и hasItem;
легаси-whenVar не тронут.
- evalConditions/hasConditions — чистые функции для квест-стадий, dry-run
и валидатора; рантайм делегирует проверку им.
- Тесты: AND по переменным, hasItem с/без world, evalConditions на чистом
GameState; доки ui-and-dialogue.md + practices.md.
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
| 2026-09-05 |

Батч 0: агентный набор инструментов (мост, валидация, CLI, доки)
...
Движок (packages/engine/src/agent/):
- types.ts: SceneAgent/AgentHost/Invariant/SnapshotLayer — каркас жанронезависим
- EngineAgent: снапшот+инварианты, step/waitFor, атомарные tapVirtual/press/key
- invariants.ts: checkFinite/checkRange/checkBounds/checkWalkable
- Engine.stepTick/stepTicks/tickCount; GameLoop.setManual/resetTiming
- InputManager.inject*: инъекция через те же структуры ввода
- DialogueRunner: nodeId/choices/waitingForChoice раскрыты для снапшота
Игра (apps/game):
- agent/GameAgent.ts: window.__agent (DEV): snapshot/step/waitFor/walkTo/runDialogue
- agent/snapshot.ts: чистые слои hero/enemies/npcs/dialogue/game
- data/validate.ts: runtime-валидация контента → Invariant[] (нашла 4 врага на воде)
- сцены реализуют SceneAgent: whitelist-команды, lastToast в снапшоте
Инструменты и доки:
- tools/agent-lib.mjs (openGame/AgentClient/Checks), tools/agent.mjs (CLI check/run/snapshot/screenshot/dev)
- tools/checks/agent-invariants.mjs; смоуки переписаны на мост; maps:fresh в gen.test.ts
- docs/llms.txt, docs/engine/agent.md, docs/engine/practices.md (живой документ)
- CLAUDE.md, docs/engine/README.md, docs/demo.md обновлены
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
2 days ago
|
engine: Tween+easing, fade-переходы, ресайз, IsoDepthLayer, GameState, RNG, StateMachine, DialogueRunner, Settings, атласы, PixelText+VT323, UI-кит, частицы, геймпад, тач-джойстик, аудио-шины, формат карт+Tiled
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
2 days ago
|