| 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
|
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
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
|
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 |
docs: итоги третьего раунда фидбека (задача 18) в plan/demo
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
3 days ago
|
docs: итоги второго раунда фидбека (задача 17) в plan/demo
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
3 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
|
feat(game): контент освещения + сценарий проверки lighting
...
- locations.ts: ambient областей (луга/пруды/Звенец/интерьеры), окна трёх
домов Звенца, очаг дома Ирвина (hearth_low -> hearth_high по флагу квеста),
лампа прилавка лавки, холодный отсвет башни после звонка
- LocationScene: вызов lightView.update(dt) — время/лерп ambient/кадры
к спрайтам (сценарий поймал замороженное мерцание)
- tools/checks/lighting.mjs: 6 шагов (ambient областей, окна, тёмный интерьер,
мерцание с допуском, лампа следует за героем, очаг ярче после сдачи),
регистрация в agent.mjs
- доки: demo.md (матрица), plan.md (задача 10 + точки расширения day/night),
art-style.md (свет — оверлей, цвет из гаммы жизни, интенсивность ≤ 1.1)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|
Аудио: стерео-музыка, динамические темы (бой/настороженность), room tone интерьеров
...
- Движок: renderMusicStereo (interleaved L,R, equal-power pan треков,
нормализация по общему пику каналов), createBuffer(channels 1|2);
моно renderMusic бит-в-бит прежним сэмплам
- Игра: темы боя и tension-стем в data/music.ts; threat-тик
LocationScene.updateMusic — chase → тема боя, wary → тихий стем
(setVolume с флагом stemPending против шторма перезапусков)
- Room tone интерьеров: ROOM_TONES (hum-спеки, шина ambience),
запуск в enter, стоп в exit, validate-тест ключей
- checks/music.mjs: инвариант «тема лугов не перезапускается»
(динамические темы/стем — легитимная реакция на врага)
- Доки: assets-audio-save.md (стерео), practices.md (динамическая
музыка, pending-флаг), plan.md (Работа G — сделано)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
5 days ago
|
| 2026-09-06 |
audio: палитра спеков (tone/wobble/sweep/layers) — все sfx на спек-синтезе (E4)
...
- SoundSpec: kind 'tone' (чистый тон + свип freqTo), параметры w/attack/
fadeTo/wobbleHz|Depth|Base|Phase, доп. голоса layers (SpecVoice с delay);
без модификаторов бит-в-бит прежним формулам
- data/sfxSpecs.ts: 16 спеков — все бывшие файловые sfx, включая шаги
(StepVariants: варианты renderSpec с сидами base+i·10, fallback — базовый
спек); ui_click во всех сценах через playSfx
- gen.mjs остался только амбиенту; assets/audio/sfx/ удалён; формулы
бывших sfx экспортированы для парити-теста (bit-в-бит / eps 1e-5)
- мост: scene:synthesize принимает kind tone; доки: agent.md,
assets-audio-save.md, practices.md, plan.md (E4 ✅)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
5 days ago
|
audio: миграция bell_hit/whoosh на спек-синтез (E3), мёртвый door.wav удалён
...
- SoundSpec: флаг swell (огибающая «0 → 1 → 0» у hit/scrape), у chime 4-й
партиал и константная амплитуда клика — формулы совпали с gen.mjs дословно
- data/sfxSpecs.ts: реестр SPEC_SFX + playSfx — единая точка проигрывания
sfx (AudioSystem, useTransition, collectFlower); ключи в AUDIO_KEYS
- gen.mjs: CLI-гвард (WAV при импорте не пишутся), формулы bellHit/whoosh
экспортированы для парити-теста sfxSpecs.test.ts (бит-в-бит равенство)
- доки: plan.md (E1–E3 ✅, F/G ✅), practices.md, assets-audio-save.md
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
5 days ago
|
Движок: секвенсор renderMusic + playLoopBuffer; игра — тема лугов (работа G)
...
Партитура MusicSpec (bpm, beats, партии-стемы: pluck/bell/pad) чисто
компилируется в луп; playLoopBuffer играет буфер памяти на любой шине.
Тема лугов — правило-базовый генератор в data/music.ts (сид, ля-минорная
пентатоника), компиляция в рантайме — WAV для музыки не нужен; у области
поле theme, у Game — playTheme с guard-ом и кроссфейдом. Проба
checks/music.mjs в agent:check. Секвенция тем (бой) — до боевой темы.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
5 days ago
|
Движок: auto-mute по visibilitychange, bus в PlayOptions, exponential-фейд
...
Свернул таб — ctx.suspend, вернулся — resume (опция pauseOnHide, без
DOM listener не ставится). Разовый sfx можно направить в любую шину
(bus, по умолчанию sfx). Затухания лупов — экспоненциальные (линейный
спад слышен ступенькой); нарастание осталось линейным — экспонента не
определена от нуля. Доки и план (работа F ✅) в том же коммите.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
5 days ago
|