| 2026-09-09 |
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
|
Тени без 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
3 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
3 days ago
|
plan: задача 19 — герой за tall-объектами; статус задачи 3 (A0 PoC готов)
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
3 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
3 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
3 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
3 days ago
|
| 2026-09-08 |
docs: итоги третьего раунда фидбека (задача 18) в plan/demo
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|
docs: итоги второго раунда фидбека (задача 17) в plan/demo
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|
| 2026-09-07 |
docs(plan,demo): задача 16 — переделка по фидбеку (свет/ветер/квесты/баги)
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|
feat(agent): мост scene:walk/approach вместо tapTile, чеки и смоуки на кнопках
...
- SceneAgentView: команды scene:walk (A* + followPath) и scene:approach
(findPathToNeighbor, возврат тайла прибытия)
- GameAgent: walkTo через одну команду + waitFor тайла (без !moving —
step-переход срабатывает в moving), новый approach; tapTile удалён
- lib.mjs: t.interactAt/t.talkTo/t.useInteractable — координаты из снапшота
по id; fightNearest — подход, доворот facing коротким шагом к врагу
(клавиши — экранный вектор) и конус, до 3 попыток
- Чеки и смоуки переписаны с кликов на кнопки: interact, interact-world,
quest-bells, transitions, final, resonator, zoom, lighting, collision,
perf; smoke-act1 и final-smoke green (бой починен)
- Доки: agent.md (контракт моста), practices.md (доворот facing, две
линейки), plan.md (задача 15)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|
docs(plan): акт 2 закрыт (A1-A4)
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|
docs(plan): таблица актуальных задач — катсцены v2, UI, зум сделаны
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|
feat(game): непрерывное время суток вместо флага evening
...
GameClock (1 с = 1 игровая минута, старт 8:00) на Game; GameLighting
смешивает day/night ambient по кривой dayNightFactor через деп timeHours,
ночные источники — whenNight, лампа по фактору ≥ 0.5. Сейв v4 (clock),
миграция state v3 удаляет evening; мост: s.time, scene:setTime,
инвариант time-bounded, сценарий checks/time.mjs.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|
feat(game): ночь на улицах, свет колокольчиков, сценарий освещения
...
Контент: nightAmbient у лугов/прудов/Звенца, источник bells на тайлах
колокольчиков (whenFlag evening), окна домов горят только вечером.
Сценарий checks/lighting.mjs переписан под день/ночь (8 шагов: вечер
лугов, окна Звенца, виньетка через scene:damagePlayer). Доки: demo.md
(матрица), plan.md (10b), art-style.md (дизер-кольцо, ночной ambient,
B2 колокольчиков). agent:check 12/12, smoke-act1 зелёный.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|