| 2026-09-07 |
feat(game): агентный мост — pickChoiceByText, path/mood/tags в снапшоте, сценарий quest-bells
...
- DialogueSystem.pickChoiceByText(text) — выбор варианта по тексту реплики
(реплики героя в графе — выборы по библии мира; elder_first теперь ветвится)
- DialogueSnapshot += mood/tags/path — снапшот показывает настроение и путь
прохождения графа
- мост: команда сцены scene:pickChoiceByText, GameAgent.pickChoiceByText
(ждёт waitingForChoice, берёт по тексту), прокси AgentClient (+timeout
у runDialogue)
- новый checks/quest-bells.mjs — полный цикл квеста «Три цветка»: взятие
у Ирвина выбором по тексту -> сдача (кат-сцена посадки, цветы списаны)
-> Мила (полотно из do[] в сумке) -> эпилог trader_after; входит в agent:check
- доки: agent.md (снапшот диалога, команды, API), practices.md (typewriter
и выбор в сценариях; метод моста = 3 места), в том же коммите
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
6 hours ago
|
feat(game): do[]-эффекты в контенте через EffectSink; QuestEffect-свитч удалён
...
- data/effects.ts: реестр DIALOGUE_CUSTOM (plant_flowers) — имена сюжетных
эффектов, как FLAGS/VARS.
- systems/DialogueEffects.ts: DialogueEffectSink + applyDialogueEffect
(give/take в сумку, sound, toast, custom; unknown kind — тихий игнор,
валидатор = error).
- DialogueSystem: registerSink + runner.onEffect → sink.
- Контент на do[]: elder_hand_in.accept → custom plant_flowers;
trader_first.give_cloth → giveItem cloth. Удалены QuestEffect,
EXTRA_EFFECTS, questEffectFor, поле QuestStage.effect и ручной switch
в onDialogueFinished (custom откладывается до конца диалога — кат-сцена
не рвёт реплику).
- Валидатор: do[].id give/take ∈ ITEMS, custom ∈ DIALOGUE_CUSTOM (error).
- Сценарий interact-world: первый advance теперь догоняет печать —
двойное нажатие.
- Тесты: give/take в Inventory, custom до sink, unknown игнор.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
6 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>
root
committed
6 hours ago
|
| 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>
|
игра: звук и настройки — WAV-генератор, AudioManager, SettingsScene
...
- tools/audio/gen.mjs: генератор WAV из кода (моно 22050, 16-бит, без зависимостей):
bell_hit, bell_low, ash_hiss, ash_die, spit, hurt, step, ui_click, chime
+ зацикленные амбиенты meadows/ponds (кроссфейд краёв лупа)
- engine: AudioManager.preload — декодирование до первого play
- Game.audio + связка settings.onChange -> setBusVolume
- unlock аудио на первом жесте (main.ts), preload в BootScene
- SettingsScene (Panel+MenuList): громкости master/music/sfx, вход из главного меню
- музыка локаций через Game.playMusic (защита от перезапуска того же трека)
- sfx: шаги героя (PlayerController.onStep), колокольчик реплик (DialogueSystem.onLineShown)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
2 days ago
|
Миграция игры на новые API движка + документация docs/engine
...
Игра:
- диалоги переписаны на графы DialogueRunner + GameState (тексты сохранены)
- меню на MenuList, шрифт VT323 через PixelText во всех сценах
- герой из атласа hero_sheet (gen.mjs), акторы в IsoDepthLayer
- пепел через ParticleEmitter, fade-переходы сцен, сейв с GameState
- Vite: publicDir: 'assets', алиас regex, шрифт через ?url-импорт
Документация: docs/engine/ — 10 файлов (архитектура, подсистемы, рецепты).
CLAUDE.md и README.md обновлены под новые модули и грабли.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
2 days ago
|
Скелет проекта: свой движок + изометрическая RPG
...
- packages/engine: жанронезависимый движок (цикл, сцены, ECS, ввод, камера,
изометрия 2:1, A*, сейвы, диалоги, анимация) на PixiJS-бэкенде
- apps/game: первый вертикальный срез — меню, локация «Выжженные луга»,
герой с click-to-move, 2 NPC с диалогами, автосейв по Esc
- CLAUDE.md, README.md, workspaces + Vite + Vitest
Co-Authored-By: Claude Code <noreply@anthropic.com>
gbook
committed
2 days ago
|