| 2026-09-07 |

feat(game): визуальный редактор графов диалогов
...
- tools/dialogue-editor/server.mjs — node http без зависимостей: статика,
GET /api/graphs, GET/PUT /api/graph/<id> (mtime-гард 409, атомарная
запись .tmp->rename, формат 4 пробела + \n), POST /api/dry-run,
GET /api/registries
- валидация и dry-run — спавн vite-node tools/dialogues/probe.ts (stdin ->
JSON), реестры — tools/dialogues/registries.ts: правила одни
(dialogueRules.ts) для валидатора, CLI и редактора, дублирования нет
- UI (index.html/editor.js/editor.css, без CDN): список графов, SVG-канва
с карточками и рёбрами (next — сплошные, choices — пунктир, сироты —
красный пунктир), инспектор узла (текст/speaker/mood/tags/условия/
setFlags/setVars/do[]/выборы), dry-run в панели
- npm run dialogues (порт 5199)
- проверено в Chromium: канва и инспектор, dry-run, правка + сохранение
(422 на битом флаге, 409 на старом mtime, 200 при записи)
- доки: ui-and-dialogue.md, practices.md, llms.txt, CLAUDE.md
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
9 hours ago
|
feat(game): диалоги в JSON + dialogueRules (чистый анализ графов) + CLI dry-run
...
- графы диалогов — 6 JSON-файлов в data/dialogues/ (4 пробела + \n),
реестр dialogues.ts собирается JSON-импортами
- новый data/dialogueRules.ts: чистые checkGraph/analyzeGraph — реестры
параметрами, одна истина для валидатора, CLI и будущего редактора
- validate.ts делегирует графы в checkGraph; новые инварианты:
textless-cycle (error), silent-end (warn), string-unknown, item-unknown,
do-item/do-custom-unknown, quest-stage-unreachable (error)
- CLI npm run dialogues:dry [<id>] — прогон графов через DialogueRunner
на пресетах состояния (fresh / quest-taken+flowers / quest-done)
- доки: ui-and-dialogue.md (раздел «Графы в JSON и dry-run»), practices.md,
CLAUDE.md
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
9 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
9 hours ago
|
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>
root
committed
10 hours ago
|
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>
root
committed
10 hours ago
|
engine(ui): каркас меню-сцен — menuInput, MenuSceneBase, disabled-пункты
...
- Чистая readMenuInput (MenuActionMap/MenuNavEvent): порядок cancel → move →
(adjust XOR confirm) → extra; left/right подавляют confirm (Enter в
настройках не даёт двойной шаг).
- MenuSceneBase: build() из enter(), хуки onMove/onAdjust/onConfirm/
onCancel/onAction — заменяет скопированную в 4 сценах игры навигацию.
- MenuList.MenuItem.disabled + ListCursor с предикатом выбираемости:
курсор пропускает недоступные пункты, активация/клик игнорируются.
- Тесты: menuInput (5), listCursor +3 (505 всего); доки ui-and-dialogue.md
(«Меню-сцены», осознанный отказ от updateBelow).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
10 hours ago
|
| 2026-09-05 |
доки: Camera.deadZone/snap и SpriteDebugView
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
2 days ago
|
рендер: резкий UI при пиксельном мире + тайлы без обводки
...
- Renderer: бэкинг-стор канваса в пикселях устройства (scale × dpr) —
UI и текст рендерятся 1:1 с экраном, без «мыльного» апскейла на HiDPI;
CSS-размер канваса не изменился (виртуальное × целое)
- PixelText: setPixelTextResolution — глифы растеризуются с resolution
канваса (синхронизирует Renderer при смене масштаба)
- AssetLoader: текстуры мира (и кадры атласов) сэмплируются nearest —
пиксель-арт остаётся чётким квадратным
- тайлы без обводки граней (fillDiamond без light/dark линий):
смежные тайлы сливаются в поля, сетка больше не «шумит»
- доки: render.md (двухслойный пайплайн), ui-and-dialogue.md (resolution
текста), CLAUDE.md (правило №2)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
2 days ago
|
доки: docs/demo.md (витрина среза), обновление docs/engine, README, CLAUDE
...
- docs/demo.md: внутренняя проектная дока — матрица «подсистема → где показана»,
сюжетная рамка, боевая модель, новое в движке, дорожная карта
- docs/engine: maps.md — setTile; input.md — мульти-биндинг; ui-and-dialogue.md — DebugOverlay
- README: команды art/maps, счётчик тестов, управление срезом
- CLAUDE.md: новые команды и грабли (autoplay, мульти-биндинг, пространства координат)
- tools/smoke-ponds.mjs: доведён до устойчивого кругового перехода луга->пруды->луга
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
|