| 2026-09-09 |
Перепаковка: v1 в каталог v1/, корень — диспетчер версий
...
v1 (черновик движка + демо) переехал целиком в v1/ (git mv — история
сохранена): packages/, apps/, eslint/tsbase/vitest конфиги, package.json
с workspaces и лок-файл. Корневой package.json — тонкий диспетчер: те же
команды делегируются --prefix v1, все команды из док работают от корня.
Корневой CLAUDE.md — краткая карта версий; полный маниал v1 — v1/CLAUDE.md.
Пути кода в доках (docs/, README, .gitignore AI-листы) префиксованы v1/.
docs/ остаются в корне (там уже живёт план v2). Хуки (.githooks) и prepare
остаются в корне. Верифицировано: check:fast (774 теста) и agent:check —
зелёные из корня.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
Тени без 3D: блобы актёров и направленные тени tall-объектов по солнцу
...
Движок: render/shadowSim.ts — чистая математика солнца (sunShadow по часам:
направление от западного утра к восточному вечеру, длина к низкому солнцу,
рассветные/закатные рампы альфы, ночь = null; blobPlacement — эллипс из базы
объекта) + render/shadows.ts (ступенчатая трёхслойная текстура блоба, раскладка
спрайта) + 8 тестов. Игра: GameShadows (ground-слой между картой и актёрами,
блоб первым ребёнком вьюхи актёра, чистка уничтоженных спрайтов); герой/NPC/
сгустки/деревья/валуны/кусты/дома/башня. Проверка checks/shadows.mjs:
утро/полдень/вечер/ночь через scene:setTime + скриншоты.
Доки: render.md «Тени», practices.md (канвас морозит исключение в тике; ручные
шаги моста не рендерят; зомби-vite на порту), demo/plan/llms.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
Пост-эффекты движка: переменный блюр, аберрация, марево (PostFx)
...
- движок render/postfx: postSim.ts (чистая математика: спад силы по
радиусу, ядро золотого сечения, сдвиг аберрации, синус марева; 7
headless-тестов) + PostFx.ts — один кастомный Pixi-фильтр на worldRoot
(API set*/pulse* по образцу Lighting, blurObject на отдельной вьюхе,
resolution inherit, clipToViewport выравнивает текстуру по вьюпорту)
- игра: блюр-волна вокруг героя при резонансе, аберрация при уроне,
авто-марево у Старой Машины (до усыпления) и очага; ручная зона моста
- мост scene:postfx (blur/aberration/shimmer/clear) + checks/postfx.mjs
- доки: render.md «Пост-эффекты», practices.md приём + грабли v8
(resolution inherit, uniforms напрямую, без const-массивов в GLSL 1.00)
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
Спектро-лист: «взгляд» ИИ-агента на аудио (тулза движка + view в aiaudio)
...
- packages/engine/tools/spectro.mjs: FFT (radix-2, чистый JS) → спектрограмма
log-частоты в dB-палитре + огибающая RMS + секундные тики + маркер шва лупа;
CLI листует несколько клипов в один PNG
- wav.mjs: decodeWav (PCM 16-бит, моно/стерео → Float32, чанки по ID)
- тесты: roundtrip encode/decode, частота тона попадает в бин, лист пишется
- aiaudio: команда view <id> [seeds] — лист кандидатов в /tmp одной командой
- docs: assets-audio-save (decodeWav/spectro), practices (приём отбора),
llms.txt, plan.md (Работа A)
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
| 2026-09-07 |

К4: каркас withChecks для чек-сценариев, конфиги, доки
...
- apps/game/tools/lib.mjs: withChecks(name, fn) — сервер/браузер и помощники
(boot/goToArea/sleepEnemies/readAudioLog/waitAudioLog/expectInvariantsClean)
в одном месте; все 12 сценариев checks/*.mjs переписаны на шаги.
- Контекст сценария — только t.ctx (геттер): деструктуризация до boot давала
null — задокументировано в agent.md и practices.md.
- vitest.config.ts: явный include (src-тесты + тулзы с чистой математикой);
GameLoop.manual.test.ts -> GameLoop.timing.test.ts.
- Редактор диалогов: порт 5299 (5199 остаётся за dev-сервером смоуков) + фикс
разбора --port (indexOf(-1) -> NaN, npm run dialogues падал без аргумента).
- tsconfig: apps/game включает только src (движок типчекается своим проектом);
vite/client убран из движка (import.meta.env там нет).
- Докси: getting-started — regex-алиас вместо строкового; llms.txt + anim.md;
CLAUDE.md — полный список док; wav.mjs writeWav удалён (0 вызовов).
Проверено: agent:check 16/16, check:fast (692 теста), smoke-act1, редактор на 5299.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|

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
4 days ago
|
engine(inventory): лимиты, богатые события, генерик id
...
- InventoryOptions { maxSlots, maxPerStack }: add обрезает и возвращает,
сколько влезло; spaceFor/size/slotLimit/stackLimit; load клампит.
- InventoryChange { kind, id, count, after } вместо () => void
(подписчиков в игре нет — миграции не нужны).
- Inventory<TId extends string> — задел типобезопасности; мёртвый
InventoryState удалён; формат serialize/load не меняется (сейвы v3).
- Тесты 6 → 11; новый док docs/engine/inventory.md, карта модулей
README.md, llms.txt.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|
| 2026-09-06 |

Движковые коллизии: круг поверх сетки + LOS по пропам
...
Новый чистый модуль map/collision.ts в движке: gridOf (Grid из
TileMapData с footprint пропов), точная проверка круга circleFits
(ближайшая точка квадрата Blocked-тайла — ловит угловой прокол по
диагонали), moveCircle со скольжением по осям, pushOutOfWalls для
телепортов, separateCircles для будущего расталкивания тел.
Дедупликация четырёх копий worldToTile+isWalkable: движение героя
(moveFree), шаги врагов, фауна и валидатор контента теперь на одних
функциях. IsometricTileMap.isPropBlocked публичен.
Бой против стен: конус удара требует прямой видимости (hasLineOfSight
по tall + пропам), снаряды гасятся о стены и дома (вода прозрачна —
плевок летит над прудом). Отброс героя — только если тело помещается
(circleFits): прищёлкивание к центру тайла после отброса меняло
динамику погонь у прудов и валило пробу interact-world.
14 юнит-тестов на коллизии (скольжение, угловой прокол, совместимость
с A*-маршрутом, push-out, separateCircles). Доки: maps.md (раздел
«Коллизии»), README.md, llms.txt.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
5 days ago
|
SceneRegistry: реестр объектов сцены с индексом по тайлам
...
Жанронезависимый примитив «что-то стоит на карте»: позиция в юнитах,
радиус тела, footprint в тайлах, непрозрачная ссылка на контент игры.
Запросы at/atWorld/near/byKind без перебора сцены; дубликат id — throw.
Фундамент для унификации NPC/интерактивов/врагов и телесных коллизий.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
5 days ago
|
Чистка тулз: пробы-сироты и дублирующие смоуки удалены, доки по новой раскладке
...
- Удалены одноразовые пробы, никем не запускаемые: cam-probe, far-test,
skin-info, skin-probe, walk-probe, font-probe.
- Удалены смоуки, дублирующие checks/: smoke-zvenets и smoke-ponds
(покрываются checks/transitions.mjs), smoke-quest (checks/interact.mjs).
Полный прогон акта 1 — smoke-act1.mjs, базовый — smoke.mjs.
- Доки: CLAUDE.md (правило «общее — в движок, сценарий — в игра»,
packages/engine/tools), docs/engine/{practices,art-pipeline,agent}.md,
docs/demo.md, docs/llms.txt, README.md.
- npm run audio — скрипт для и без того существующего генератора WAV.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
5 days ago
|
Дока: план развития — AI-генерация спрайтов и аудио
...
docs/plan.md — живой документ планирования (актуальные задачи + крупные
направления). Проработаны две отложенные работы:
- B (изображения): тайлы/объекты — локальные GPT-пиксель-модели (PXG-Tiny,
Pixel Forge, PixelGPT-24×24 — CPU, нативная палитра), персонажи-атласы —
открыто (дообучение vs Retro Diffusion API vs ручной арт). Пайплайн:
манифест + seed + пост-обработка в палитру + апрув-гейт.
- A (аудио): три класса потребностей (окружение, SFX, музыка/катсцены);
основной рантайм — Stable Audio 3 Small-SFX/Small-Music (433M, CPU),
ACE-Step 1.5 — офлайн-пакет для музыки катсцен. Формат игры не меняется.
Ограничение зафиксировано: машина разработки без дискретного GPU (iGPU,
4 ядра) — только CPU-инференс; модели с NC-весами в основной пайплайн
не брать. AI-вывод — только сырьё (палитра 32 цвета, WAV 22050 моно).
Зарегистрирован в docs/llms.txt и CLAUDE.md.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
5 days ago
|
Архитектура: гвард границы движок/игра + перенос тулз в apps/game/tools
...
- Гвард границы (apps/game/tools/guards/boundary.mjs, npm run guard):
движок не импортирует игру и не выходит из пакета, игра импортирует
движок только через @rpg/engine и @rpg/engine/assets/*. Чистое ядро
покрыто тестами (8 кейсов); проба guard:boundary в agent check.
- tools/ -> apps/game/tools/ (git mv, история сохранена): правка
корне-относительных путей в генераторах и CLI, ROOT-константы
'../../..', npm-скрипты обновлены.
- Доки: CLAUDE.md, llms.txt, docs/engine/*, README — новые пути,
практика «меняю границу движок/игра» и грабля про ROOT тулз.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
6 days 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>
root
committed
6 days ago
|