| 2026-09-09 |

v2 трек 5: .vox импорт/экспорт (MagicaVoxel) + перекладка палитры
...
- models/vox.ts: parseVox/exportVox — чанки MAIN/SIZE/XYZI/RGBA, PACK>1 —
ошибка, неизвестные чанки пропускаются с детьми; обрыв файла (в теле и
в заголовке чанка) — понятная ошибка, не RangeError. Оси: у .vox z —
вверх, у движка y — вверх: (x,y,z)_engine = (x,z,y)_vox. RGBA ровно
256 записей; при экспорте слоты модели сжимаются в подряд 1..N.
- models/paletteMap.ts: remapSlots — перекладка слотов модели на палитру
сцены (точный hex или ближайший RGB, при равенстве — меньший слот);
решает «слоты модели ≠ слоты сцены» после импорта .vox.
- Демка: мост stampVoxB64(b64,x,z) — парсинг → перекладка → штамп +
ремешинг dirty-чанков.
- Гейты: render 13 проверок (+ .vox-штамп меняет кадр, фиксстура — base64
от exportVox), turntable 5 проверок зелёные.
- Уроки в план/CLAUDE: Node не импортирует @rpg/engine — фиксстуры гейтов
вкладываются готовыми; точка правки для «кадр изменился» обязана быть
в кадре камеры; заголовок .vox-чанка — 12 байт.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
v2 трек 4: turntable-листы — визуальный гейт генераторов моделей
...
- apps/demo/turntable.html + src/turntable.ts: 6 моделей (деревья/валуны
x варианты) x 4 ракурса (0/45/90/135) на подставках 8x8x2; мост
sheetInfo() + setModels(on) для референсного кадра гейта
- tools/checks/turntable.mjs: центры ячеек той же проекцией, что камера;
эллипс 48x42 в ромбе подставки; 5 проверок (ячейки непустые,
варианты попарно различаются); скриншоты /tmp/v2_turntable*.png
- agent-lib: launchBrowser({viewport}) — страница листа 960x720 выше
дефолтного вьюпорта
- грабли: дробные координаты VoxelGrid.set — молчу no-op; скриншот =
вьюпорт браузера (канвас без центрирования); выборка эллипсом вместо
малых боксов у края ромба ячейки
- гейты: render 12/12, turntable 5/5; 50 юнит-тестов зелёные
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
v2 трек 3: генераторы воксельных моделей (rng, формат JSON, деревья/валуны, штамповка)
...
- math/rng.ts — mulberry32: next/int/range/chance/pick, детерминизм по сиду
- models/format.ts — VoxelModel (size + плотный base64 + слоты-палитра),
encode/decode + числовая валидация (validateModel) для агентного пути
- models/generators.ts — treeModel (круглая/колонна/ель), boulderModel
(union сфер, свет на верхних гранях); (вид, сид) -> модель, чисто
- models/stamp.ts — stampModel в мир с клиппингом (half-open границы)
- демка: 12 деревьев + 3 валуна из генераторов; ручные tree/boulder удалены
- гейт рендера: 12 проверок (+ модельная статистика, детерминизм и
различие вариантов через мост stampTree)
- 50 юнит-тестов зелёные; доки plan.md/CLAUDE.md обновлены
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
v2: демка на мире 6×6 чанков (96×96), замер производительности мешинга в мосте
...
- CHUNKS=6: мир 36 чанков, 80к вершин / 40к треугольников, постройка+мешинг
~0.4-0.5 с (гейт-лимит 2 с); контент разнесён по площадке, дом у центра
- мост __agent: chunkStats/perf; правка setVoxel атомарна с ремешингом
- гейт 9/9: мир из 36 чанков, перф-лимит, столбик на шве x=48 меняет кадр
- грабля теста: правка занятого вокселя не меняет геометрию — столбик
«исчезал» дважды (вне кадра, затем внутри дома)
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
v2: чанковый мир — Chunk/VoxelWorld с dirty-трекингом, meshRegion, демка 3×3 чанков
...
- world/chunk.ts (16×H×16) + world/world.ts: мир-словарь, get/set через
границы (в т.ч. отрицательные), правка боковой кромки помечает соседний
чанк dirty
- мешер обобщён: meshRegion(at, bounds, palette) — область по функции
доступа; world/worldMesher.ts мешает чанк через world.get — culled и AO
на швах бесшовны; тест: меш 4 чанков ≡ меш одной сеткой (позиции+AO)
- демка на мире 3×3 чанков с ремешингом dirty-чанков; мост __agent:
setVoxel (атомарен с ремешингом), chunkStats; гейт 8/8 — столбик на шве
чанков меняет кадр, dirty схлынулись
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
Спайк v2: воксельный рендер — сетка/мешер/AO, three.js-бэкенд, демка и скриншот-гейт
...
- движок: voxel/grid.ts (Uint8-сетка, палитра по индексам), voxel/mesher.ts
(culled-грани + классический AO 0..3 с флипом диагонали, 12 тестов),
render/voxelRenderer.ts (ортокамера диметрии 2:1, dirLight + shadow map,
низкое разрешение 480×270)
- тулзы: tools/agent-lib.mjs — браузерный каркас проверок v2 (swiftshader),
tools/png.mjs — PNG-кодек (в т.ч. RGB-скриншоты headless Chromium)
- демка: apps/demo — воксельный пепельный луг в палитре арт-библии,
мост window.__agent (setSun/stats), чек checks/render.mjs: pageerror,
меш, тени ползут утро/вечер, апскейл кратен 2×2, многокрасочность
- грабли в v2/CLAUDE.md: камера под землёй при минус-Y (ловится только
скриншот-гейтом — урок №2 подтверждён в первый же день)
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
Скелет v2: workspace, @rpg/engine 2.0.0-alpha (three.js), маниалы CLAUDE.md
...
v2/packages/engine — ядро-заглушка: зависимость three ^0.186, src/index.ts
с принципами v2 (рендер за интерфейсом, единое мировое пространство, сим/вью
разделение, мост — часть ядра), смоук-тест, tsconfig. v2/package.json —
workspaces + check:fast. v2/CLAUDE.md — краткий маниал: решения беседы,
уроки v1 к соблюдению, команды. Корневой CLAUDE.md — карта версий v1/v2
(корень остался без маниала после переезда). plan.md — задача 21 о
перепаковке. v2: npm install + тест + typecheck зелёные.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
Перепаковка: 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
|
plan.md: направление v2 зафиксировано — воксельный движок
...
Решения беседы 2026-09-09: воксель как продолжение пиксель-арта (низкое
разрешение + палитра арт-библии, shadow map + воксельный AO); three.js как
низкоуровневый бэкенд (роль Pixi), ядро своё; формат моделей — свой JSON +
.vox-импорт/экспорт; три дополняющих маршрута генерации моделей (процедурные
генераторы — основной, image-to-3D + вокселизация с апрув-гейтом, ручной
MagicaVoxel для героев); анимация = данные (ригa + кривые в JSON, процедурная
локомоция) с числовой валидацией и снапшотами поз в мост; аудио-трак и
pixelart (UI/иконки) переносятся; агентный мост — ядро v2. Демка — изометрия.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
plan.md: «Уроки черновика → видение движка v2» (живой раздел)
...
Решение: v1 — черновик, чиним без больших рефакторингов; уроки копятся
в раздел v2. Что сохранить: фикс-шаг/детерминизм, разделение сим/вьюхи,
агентный мост с первого дня, граница с гвардом, инъекция хранилища, доки.
Что переделать: единое мировое пространство с проекцией на границе
(урок «летающих» объектов), скриншот-гейты для визуальных подсистем
(урок невидимого RT), декларативная композиция сцен, рендер-бэкенд за
интерфейсом, авторазмещение вьюх вместо ручных пулов.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
Тьма с прорезями выводится на экран: RT привязан к display-спрайту
...
RT-карта силы тьмы создавалась и запекалась (bakeNow по dirty-подписи), но
darkSprite навсегда оставался с Texture.WHITE — результат нигде не показывался,
ночная тьма была равномерным затемнением, а прорези ламп/окон существовали
только в нечитаемую RT. Теперь darkSprite показывает саму RT (multiply + tint
= ambient, как и описано в шапке класса): ночью прорези источников реально
вырезают свет из тьмы (проверено скриншотом ночи на лугах — круг света вокруг
лампы героя), fallback без рендерера (Vitest) не изменился. Чеки lighting/
shadows/perf и тесты зелёные.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
Тени сидят на базе: изо-проекция направления и плотность блоба
...
Фидбек «объекты и персонажи летают»: центр массы эллипса стоял на середине
вылета — видимая тёмная масса висела в стороне от объекта, а ступени текстуры
× спрайт-альфа 0.34 давали лишь ~24% плотности центра (невидимая контактная
тень). Теперь: sunShadow считает направление азимутом в плоскости мира и
проецирует изометрией (DEFAULT_ISO) — тень всегда лежит на земле, не «стекает
по стене»; blobPlacement сажает массу у базы (ближний край заходит за базу);
пик альфы 0.5 и ступени 0.4/0.44/0.5 — центр блоба в разгар дня ~40%
затемнения (проверено пикселями и скриншотами утра/полдня).
Доки: render.md — геометрия «сидит на базе» + расчёт плотности.
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
|
A2 решён: спек-темы остаются, музыкальные кандидаты hold
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
A2: музыкальные кандидаты на AudioLDM2 в манифесте (meadows/combat/tension)
...
Генерация 6 лупов (2 сида на настроение), швы чистые, спектро-листы
показывают гармоническую структуру без артефактов. Промотировать пока
некуда: темы — спек-музыка в рантайме; файловый путь на шине music решается
после слушания (движковых изменений не нужно — playLoopBuffer уже принимает
любой буфер).
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
|
A1: манифест-пайплайн aiaudio; свои лупы рощи/разъезда, ветер с завыванием
...
- npm run aiaudio: gen/post/promote/list (раннер index.mjs, python из venv);
генератор читает манифест вместо встроенного LIST
- манифест: промпты/сиды/duration/peak/gate — единственный источник истины;
promote проверяет ключ на объявление в data/audio.ts и ставит gate=approved
- post.py: пер-позиционный peak (--peak) для тихих слоёв
- analyze.py: численный отбор кандидатов (огибающая/спектр) при делегированном
апруве
- промотировано: роща (seed 2, вместо подстановки прудов), разъезд (seed 3),
ветер (фидбек: завывание, периодическое затухание, тихий — peak 0.6, seed 3)
- ночью Звенца / дома / вода — оставлены процедурные (кандидаты hold)
- SFX остаются спек-синтезом (SFX_KEYS пуст, файлового пути нет)
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
B4 (задача 5): арт интерактивов, снаряда и иконок сумки — AI + рукодельный
...
- Ретро Diffusion (LostMedia/RetroDiffusion, PD) на RTX 3090: ~1.3 с/вид;
gen_b4.py (GPU-партия по реестру LIST) + post_b4.mjs (кроп фигуры,
meanRect-даунскейл с BFS-маской фона, квантизация, обзорный лист).
- В игру: view.tex у 9 интерактивов + Старая Машина, спрайт плевка в бою,
иконки предметов 8x8 в сумке (ui/icon_*, синхронны окну скролла),
ASSET_KEYS дополнен новыми ключами.
- tone_tree/resonator у AI не вышли (тёплый градиентный фон + шум на
даунскейле) — нарисованы кодом: toneTreeTile/resonatorTile в gen.mjs.
- Визуальный чек checks/art_b4.mjs: все области и сумка через агентный мост.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
Герой за деревом действительно прячется: tall-объекты в depth-слое (задача 19)
...
Движок: IsometricTileMap.setTallDepthLayer(layer|null) — tall-вьюхи клеток
переносятся в общий IsoDepthLayer с глубиной tx+ty (как у героев). Куллинг
и setTile не ломаются: видимость переключается по ссылке из cells, не по
родителю; null возвращает вьюхи в objectsLayer (порядок по строкам, как раньше).
Игра: LocationScene зовёт setTallDepthLayer(this.actors) и кладёт пропы
в actors через addRect (как и было).
Проверки: 2 теста движка (глубина/возврат в карту), сценарий
hero_depth.mjs — численные zIndex-assert'ы (юг: герой поверх дерева,
север: дерево поверх героя) + скриншоты, инварианты чисты.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
AI-амбиенты A0 в игру: пруды, пруды ночью, Звенец, гул башни
...
Апрув пользователя 2026-09-09 (manifest a0-poc, gate=accept): 4 бесшовных
лупа AudioLDM2 (9 с, 22050 моно 16-bit) заменили процедурные WAV. Луга —
по-прежнему тишина (дизайн-решение), SFX остаются спек-синтезом E4.
zvenets_night и слои (houses, ponds_water, wind) — процедурные до A1.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
gitignore: __pycache__ (залетел в прошлый коммит)
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
AI-аудио: батч-генератор (список клипов) + фикс пост-обработки
...
- gen_audioldm2.py: реестр LIST (амбиенты 10 с + SFX 1.5-5 с), несколько
клипов за запуск в одном процессе (id[:seed], без аргументов — весь LIST)
- post.py: --noloop для SFX (выход *_fx.wav); нормализация перенесена ПОСЛЕ
loopify — пик модели часто в фейдах головы/хвоста, которые луп вплетает,
иначе фактический пик занижался (0.61 вместо 0.85)
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
plan: задача 19 — герой за tall-объектами; статус задачи 3 (A0 PoC готов)
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
AI-аудио A0: пайплайн AudioLDM2 PoC (gen+post) и обновление плана под GPU
...
- tools/aiaudio/gen_audioldm2.py: text-to-audio, RTX 3090 fp16 / CPU fp32,
seed-детерминизм по-устройству, промпты амбиента прудов/Звенца
- tools/aiaudio/post.py: ресэмпл 22050 моно 16-bit, нормализация 0.85,
loopify (хвост кроссфейдом в голову, 1 с), --check: стык без щелчка
- tools/aiaudio/manifest.json: апрув-гейт a0-poc, gate pending (слушание)
- plan.md: машина обновлена (RTX 3090, CUDA), разведка A0 — Stable Audio
Open Small gated (нужен HF-токен), PoC на фолбэке AudioLDM2 (CC-BY-NC-SA,
в основной пайплайн не идёт); GPU ~15 с на 10 с клипа (CPU — 3.5 мин)
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
Большой дом 2×2 в Звенце: первый проп с footprint в игре; пропы на минимапе
...
Додержана задача 6 (работа C): движковые props C0–C2 были готовы, но не
показаны в игре. Теперь: renderMinimap красит footprint пропа цветом
colors[prop.id] (тесты minimap ×3, round-trip карт сверяет props);
HOUSE_BIG зарегистрирован (тайл 34, текстура в ASSET_KEYS/assetSets, цвет
минимапы); большой дом стоит на юго-востоке Звенца (46,24, земля — пепел),
zvenets.map перегенерирован. Чек checks/big_house.mjs: проп в collision-слое,
footprint непроходим, walk/approach, глубина — герой с юга перед домом,
с севера скрыт за ним. Доки: demo (матрица), plan (задача 6 → ✅).
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
Восстановить gen_pxgpt.py (PixelGPT-24×24) после переезда на новую машину
...
Скрипт проб B1 никогда не попадал в git — восстановлен по манифестам и
сверке с review-b1: маппинг токенов (0 — прозрачный, t → цвет t-1 палитры
промпта), обусловливание 5 ключами palette.mjs, рендер 24×24 RGBA.
Пайплайн AI-изображений развёрнут на новой машине заново (venv python3.11,
веса PXG-Tiny/PixelGPT/SD_PixelArt в ~/.cache/rpg-ai) и верифицирован:
PXG-Tiny бит-в-бит совпал с review B0; sd_sheet.py — лист за 116 с.
В план — факт пересоздания окружения; в грабли — непроброс порта через
два слоя npm run (npx vite --port 5199 напрямую).
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
| 2026-09-08 |
Тема области играет без амбиента: audio.prepare() в движке
...
Убрав амбиент лугов, сломали старт темы: playTheme компилирует буфер
синхронным createBuffer, а контекст создавался только в unlock (первый
жест) или ensureContext (любой play) — на тихой локации до первого ввода
музыка не начиналась. В движке unlock разделён на синхронный createCtx +
prepare() (контекст без resume) и async unlock; Game.playTheme зовёт
prepare перед компиляцией. Чеки audio/music/synth переведены с
ambience/meadows (его больше нет) на тишину лугов и тему.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
3 days ago
|
Убрать амбиент лугов и «дыхание пепла»; 3 вида валунов и кустов
...
По фидбеку:
- Амбиент стартовой локации удалён полностью: на лугах тишина — только
музыка и шаги. Слой ashflow («дыхание пепла», режущий слух) и
rustle-шорохи убраны везде; meadows/meadows_night/ashflow.wav удалены.
- Разнообразие препятствий: у валунов и кустов по три вида (round/spike/
flat и cloud/spread/tall) через TALL_VARIANTS — scatter ставит базовый
id, движок рисует вид по хэшу координат. Тень-подошва в спрайте, у
кустов — «нога» ветвей (починка «летающих» объектов).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
3 days ago
|
Фидбек: валун/куст стоят на земле, ветер лугов v3, стартовая поляна живее
...
- Арт: у валуна и куста тень-подошва в спрайте (накрывает ground-ромб —
объект больше не «парит» над пепельной ямой), рисунок до пола слота;
куст — объёмный: тёмная «нога» ветвей + приподнятая крона вместо плоского
овала.
- Амбиент лугов v3: «дыхательные» синусоиды (слышимый пульс лупа) заменены
непериодической огибающей (циклический value-noise); воздух шире
(150–1200 Гц), «толща» 60–300 Гц и запаздывающий свист — только в порывах;
луп 12 с; шуршание тише и реже. Ночь — та же фактура тише.
- Стартовая поляна: валун/кусты/деревья в первом кадре от спавна (с проверкой
не затирать тропу/воду), одинокие деревья на полянах (20% вместо 0).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
3 days ago
|