| 2026-09-09 |
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
|
Тени сидят на базе: изо-проекция направления и плотность блоба
...
Фидбек «объекты и персонажи летают»: центр массы эллипса стоял на середине
вылета — видимая тёмная масса висела в стороне от объекта, а ступени текстуры
× спрайт-альфа 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
|
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
|
docs: итоги третьего раунда фидбека (задача 18) в plan/demo
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
3 days ago
|
Валун и куст — крупные непроходимые объекты на внешних картах
...
boulderTile (32x32): камень в изо-объёме — верхняя грань P4/P5, светлая
юго-западная с бликами P5H, тень P2/P3 на юго-востоке, трещины P1.
bushTile (32x40): мёртвый куст-облако из эллипсов G0/G1/G2 с прорехами
и стеблями G2H. Новые слоты tall.boulder/bush и тайлы BOULDER: 28,
BUSH: 29 (BLOCKED, TALL_OBJECTS 1.05/1.25, assetSets, ASSET_KEYS,
MapScene). scatterRocksAndBushes разбрасывает по внешним картам:
луга 5+7, пруды 4+5, роща 3+4, разъезд 3+3, Звенец 1+2.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|
Дома — объёмные в изометрии: 5 фасадов вместо плоских картонок
...
isoHouseTile: две стены сходятся ближним углом к зрителю (юго-запад C1
светлая, юго-восток C0 тёмная), шатровая (metal) или двускатная (шпалы,
фронтон + конёк) крыша, шпальный фундамент, проёмы-параллелограммы.
Виды: времянка (32x56), двускатная с трубой (32x56), низкий сарай с
широким окном (32x56), амбар с воротами (32x80, 2.5 юнита), двухэтажный
с двумя рядами окон (32x80). Новые слот houseTall и tiles HOUSE_V3/V4
(в BLOCKED/TALL_OBJECTS/TALL_VARIANTS/assetSets/ASSET_KEYS/MapScene);
Звенец показывает времянку, двухэтажный и амбар явно.
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
|
engine: renderMinimap — чистый рендер карты в пиксельную картинку
...
renderMinimap(TileMapData, opts) — вид сверху: клетка сетки = тайл,
цвет из палитры вызывающей стороны (Record<id, 0xRRGGBB>), cell 2–3 px,
опциональные маркеры точек интереса (клетка с тёмной рамкой), fallback
для незаданных тайлов. Выход {width, height, rgba} — без Pixi; в текстуру
превращает игра. Экспорт через index.ts, секция в docs/engine/maps.md.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|
feat: B5 — дома: три фасада (шпальная крыша / ржавый лист / длинное однооконное)
...
houseTile параметризован: общие стены-щиты и фундамент, различаются крыша
и проёмы. Фасады подключены вариантами HOUSE (хэш-микс в руинах разъезда);
в Звенце три дома расставлены явно (вариантные id в тайлах), чтобы деревня
показывала всё разнообразие — хэш-микс для трёх домов не гарантирует его.
Для этого HOUSE_V1/V2 добавлены в BLOCKED, амбиент-слой «houses» теперь
матчит все три id. Карты перезаписаны, арт-библия обновлена.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|
feat: B4 — деревья: три вида крон, качание, осыпающийся пепел
...
Движок: анимация тайлов сочетается с вариантами — tall-объект анимируется
по фактическому (вариантному) id клетки, у разных вариантов свой fps.
Игра: три вида деревьев (широкая крона с кабелем / редкая / молодая),
каждый с кадром качания (крона +1px по X), fps 1.5/1.7/1.3 — кроны
качаются рассинхронизировано. Варианты TREE_V1/V2 раздаются вариантами
карт по хэшу координат, карты перезаписаны. С крон изредка осыпается
пепел (ember-частицы, серые, нормальный блендинг).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|
feat: B3 — замах и след удара (conePath в движке)
...
- engine: math/shapes.ts — conePath(from, dir, radius, halfAngle, segments):
полигон сектора для отрисовки (углы в экранных осях, как inCone); тесты
(точки дуги на радиусе, симметрия, вырожденный луч), экспорт через index.ts
- игра (CombatFlow): при удержании атаки — полупрозрачный сектор конуса
(перерисовка только на смене направления/заряда, позиция следует за героем
без перестройки полигона); заряжен резонанс — круг волны r=3 юнита
- след удара: вспышка-сектор (alpha 0.4, тает за 0.18 с через fx.fade)
- demo.md: math/shapes дополнен conePath
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
4 days ago
|