| 2026-09-07 |
feat(game): ветер лугов — воздушная полоса вместо «моря»
...
Причина «моря» в ambienceMeadows: полоса 100–600 Гц (рокот), строгая
4-секундная LFO-волна громкости (формула наката) и синус-гул 82 Гц.
- полоса поднята до 250–1800 Гц (как у эталонного слоя ambience/wind)
- «дыхание» — сумма нескольких медленных волн с целым числом циклов
на луп (без ровного прилива), порывы — тем же шумом, короче и случайнее
- тихий высокий свист (2–4 кГц) только на пике дыхания, гул 82 Гц убран
- npm run audio перегенерировал WAV; ключи те же, чеки audio/music не задеты
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
10 hours ago
|
feat(game): солнечный день, золотой час и тюнинг под прорези
...
- движок lightSim: dayNightAmbient — трёхопорный микс суток день → закат →
ночь (DUSK_PEAK 0.45, DEFAULT_DUSK_COLOR 0xe8c090), экспорт из index.ts
- locations.ts: дневные ambient к почти-белому (meadows 0xf7f4ea, ponds
0xf2f0e8, zvenets 0xf5f2ea, rust_grove 0xe9e6da, old_siding 0xe4e2d8),
ночи темнее под прорези (0x3e4658…); duskColor в LightingDef
- HERO_LAMP компактнее и ярче (радиус 1.6, интенсивность 0.85); радиусы
колокольчиков 1.4→1.0, окон 1.8→1.2, интенсивности выше
- палитра: ключевые цвета травы/пепла/воды подняты тоном (G*, P4–P5H, W1–W2),
арт перегенерирован; art-style.md синхронизирован
- чеки lighting/time под новые значения и трёхопорный микс; тесты золотого
часа (lightSim, GameLighting); docs/engine/render.md
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
10 hours 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
11 hours ago
|
feat(game): финал акта 2 — правильный звон Старой Машины (A4)
...
- интерактив old_machine в зале Машины: без настроенного резонатора —
отказ, с ним — custom lull_machine (setFlags machine_lulled);
- InteractResponse.custom: сюжетные эффекты интерактивов через sink.onCustom;
- кат-сцена финала в LocationScene: спуск камеры к устью + наезд, звон с
тряской, резонанс CombatWorld (тот же пульс, что у героя), угольки гаснут;
- validate: custom реакций сверяется с DIALOGUE_CUSTOM;
- чек checks/final.mjs: спуск через люк -> отказ -> звон -> Машина спит (5/5);
- docs/world.md: арка акта 2 (6а); docs/demo.md: сюжетная рамка + матрица.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
12 hours ago
|
feat(game): квест «Голос для резонатора» (акт 2, A3)
...
- квест resonator в quests.ts: стадии Клинт (clint_first -> сбор тонов ->
clint_tune -> эпилог clint_repeat), QUEST_TONE_TILES — достижимые WIRE-
деревья рощи (16,3)/(6,5)/(10,15);
- интерактивы rust_grove: три дерева-механизма (тон — варом через реакции,
свой флаг на дерево против повтора) и резонатор Клинта;
- ResonatorQuest (systems/quest): кат-сцена настройки — cameraMove +
cameraZoom (наезд на резонатор), звон с тряской, ответ деревьев вспышками;
- диалог clint_tune (custom tune_resonator), clint_first ставит флаг взятия;
- валидатор: NPC квеста ищется и среди размещений по флагам;
- чек checks/resonator.mjs: крючок -> Клинт -> три тона -> сдача (5/5).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
12 hours ago
|
feat(game): акт 2 — Клинт, размещения NPC по флагу
...
- механика NPC_PLACEMENTS/npcsForArea в npcs.ts: NPC появляется в области
при поднятом флаге (act2_hook от Милы), мёрж в LocationScene при загрузке;
- SceneObjects.addNpc: размещения попадают в клик-роутинг и кэш занятых
тайлов (иначе клик по Клинту резолвился как движение);
- диалоги clint_first/clint_repeat (крючок «пол-тона»), спрайт в атласе
npcs_sheet (6 кадров, clint_idle);
- validate: placements проверяются на bounds/walkable, def-ы — на ссылки
флагов и диалогов;
- interact.mjs: шаг «флаг -> Клинт в роще -> диалог -> met_clint».
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
12 hours ago
|
feat(game): акт 2 — карты Ржавой рощи, Старого разъезда и зала Машины (A1)
...
- Новые тайлы: WIRE (бухта кабеля, tall 0.6), RAIL (рельсы), STAIRS
(люк-ступени), MACHINE (печь-автоматон, tall 2.5) — текстуры в gen.mjs,
реестр sizes.mjs (wire), арт-библия дополнена.
- Карты: buildRustGroveMap (плотный мёртвый лес, тропа Звенец->разъезд,
поляна мастерской Клинта), buildOldSidingMap (рельсы, вагоны-времянки,
люк в подземелье), buildMachineHallMap (интерьер с Машиной в два тайла);
в Звенце расчистлен восточный выход.
- Области: rust_grove / old_siding / machine_hall (ambient темнее лугов,
гул Машины tower_hum у люка и в зале, накат у рельсов, враги с
патрулями) + переход Звенца на восток.
- Чек transitions: цепочка Звенец -> роща -> разъезд -> зал и обратно.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
13 hours ago
|
feat(game): зум в ClickRouting/cullMap/свет/GameAgent + чек zoom.mjs
...
Интеграция зума камеры в игру (Z3):
- ClickRouting: pointerToWorld/resolvePixelTile делят экранные px на zoom
(тела не трогаются — их getBounds уже экранные); deps.worldZoom.
- LocationScene: cullMap окно /z; debug-клавиша Z — уровни 1<->2;
walker'ы актёров тикаются всегда (исполнители until).
- Lighting/CombatFlow: радиусы источников и импульсов * zoomLevel
(lightRoot вне worldRoot, масштабируется вручную).
- GameAgent: tapTile переводит тайл в экранные px с учётом z;
публичный worldRootView() для чеков.
- Чек zoom.mjs: debugZoom -> scale=2, tapTile по NPC в Звенце открывает
диалог, walkTo доходит, возврат на 1.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
13 hours ago
|

perf(render): culling тайлов карты, пустые оверлеи света, setDepth без пересортировки
...
О-2 рендера. На лугах ~900+ спрайтов карты рисовались целиком при ~250
видимых; пустые fullscreen-оверлеи света (ambient/vignette/пульс) рисовались
каждый кадр даже днём; ходьба взводила sortDirty каждый тик.
- IsometricTileMap.cullToRect: тайловое окно из экранных углов (screenToIso),
margin ±1 по X и вверх на высоту самого высокого tall; пересчёт только при
сдвиге окна; isTileVisible — для тестов/отладки; вызов из сцены
(updateCameraFollow). null — вернуть всё.
- Lighting: ambient.visible=false при белом тинте, vignette/pulseAmb — при
нулевой альфе (днём минус 2-3 fullscreen-квада).
- IsoDepthLayer.setDepth/setDepthRect: ранний выход при неизменном zIndex
(пиксельная сортировка детей не перезапускается каждый тик ходьбы).
- agent.mjs perf: возврат 0 (объект отчёта ломал process.exit).
Perf (swiftshader headless, до → после): fps бой 3-6 → 7-8, покой 5-6 → 5-7
(rasterizer swiftshader глушит выигрыш — он раскроется на целевом iGPU);
heap в пределах шума (28-31 МБ). Скриншот смоука не изменился, тайлы у краёв
камеры на месте.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
15 hours ago
|
perf: реальный fps в агентном мосту + чек perf (baseline О-0)
...
- Engine.get fps() через FpsMeter (было 1/fixedStep = 60 всегда); AgentHost.fps.
- checks/perf.mjs: старт (страница+ассеты, newGame→location), A* (scene:route),
walkTo через луга, fps/heap в покое и в бою; agent.mjs perf (не в check —
бенчмарк, не гейт); lib.mjs open() с сырыми опциями openGame.
- eslint: performance: readonly для node-тулз.
Baseline (swiftshader headless, 960x540):
- старт: ассеты→меню ~3.0 с (raw 4.5 с с фиксированными 1.5 с сна моста),
newGame→location ~150-175 мс;
- A* путь через луга: 2-4 мс (10 узлов), walkTo: ~0.5 с;
- fps: 5-6 в покое, 3-6 в бою; heap: 28-31 МБ.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
15 hours ago
|
chore: ESLint (typescript-eslint, flat config) + npm run lint в check:fast
...
- eslint.config.js: recommended TS для src обоих пакетов + тулз; node/браузерные
глобали для .mjs-сценариев и редактора диалогов; no-undef выключен в TS
(глобали DOM/Vite проверяет tsc).
- Попутные находки (8): no-useless-assignment в waitFor-агентах (catch опирается
на init false), тернарник-выражение в StateMachine, причина ошибки в
AssetLoader ({ cause }), неиспользуемые consoleLogs/JSON_SPACE, let->const,
as const в тесте квестов.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
16 hours ago
|
Финальный интеграционный смоук: поездки x3, бой, guard аудио
...
final-smoke.mjs: три перехода луга<->Звенец туда-обратно (наслоение вьюх/звука
не накапливается), клик-бой по врагу (worldToTile = floor, не round — клик мимо
тела уходит в «движение»), перезапуск амбиента по хвосту аудио-лога (кольцевой
буфер на 24 записи вытесняет старт с бута).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
16 hours ago
|

К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
16 hours ago
|

fix: утечки жизненного цикла (сцена, ввод, карта) + read-only тест карт
...
Игра:
- LocationScene: подписки EventBus снимаются в exit() (off из on);
DialogueSystem.destroy(); worldAudio.setLayers([]) в exit (лупы
амбиент-слоёв раньше звучали поверх следующей сцены); guard гонки
roomtone (сцена вышла до резолва промиса — луп гасится); в exit
добавлены moteLabel и chargeRing (в worldRoot — не вычищался).
- SaveSlotsScene: имена областей из areaOf() (интерьеры показывались
как «луга»).
Движок:
- InputManager: contextmenu-слушатель снимается в dispose().
- IsometricTileMap: плейсхолдер-графика ячейки хранится в CellSprites
и уничтожается при перерисовке (раньше накапливалась на setTile).
Тесты карт: fresh/round-trip read-only в npm test; запись файлов —
только при RUN_MAPS_GEN=1 (npm run maps) — обычный прогон больше не
мутирует рабочее дерево. agent:check: дублирующая проба maps удалена,
invariants — через сценарий checks/agent-invariants.mjs (был инлайн-
дубль, разошедшийся с ним).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 hours ago
|
feat(game): предмет «часы» и сумка с выбором
...
Ирвин выдаёт медные часы с квестом (giveItem в elder_first.json);
useItemLine — чистый хелпер юза́бельных предметов (часы → «Время: H:MM»,
остальные — null). InventoryScene — список с курсором MenuList и строкой
результата; время в сумке заморожено (локация не тикается). checks/time.mjs:
выдача часов и заморозка времени в сумке.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
18 hours 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
19 hours 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
19 hours 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
20 hours 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
21 hours ago
|
feat(game): агентный мост — pickChoiceByText, path/mood/tags в снапшоте, сценарий quest-bells
...
- DialogueSystem.pickChoiceByText(text) — выбор варианта по тексту реплики
(реплики героя в графе — выборы по библии мира; elder_first теперь ветвится)
- DialogueSnapshot += mood/tags/path — снапшот показывает настроение и путь
прохождения графа
- мост: команда сцены scene:pickChoiceByText, GameAgent.pickChoiceByText
(ждёт waitingForChoice, берёт по тексту), прокси AgentClient (+timeout
у runDialogue)
- новый checks/quest-bells.mjs — полный цикл квеста «Три цветка»: взятие
у Ирвина выбором по тексту -> сдача (кат-сцена посадки, цветы списаны)
-> Мила (полотно из do[] в сумке) -> эпилог trader_after; входит в agent:check
- доки: agent.md (снапшот диалога, команды, API), practices.md (typewriter
и выбор в сценариях; метод моста = 3 места), в том же коммите
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 hours ago
|
feat(game): диалоги в JSON + dialogueRules (чистый анализ графов) + CLI dry-run
...
- графы диалогов — 6 JSON-файлов в data/dialogues/ (4 пробела + \n),
реестр dialogues.ts собирается JSON-импортами
- новый data/dialogueRules.ts: чистые checkGraph/analyzeGraph — реестры
параметрами, одна истина для валидатора, CLI и будущего редактора
- validate.ts делегирует графы в checkGraph; новые инварианты:
textless-cycle (error), silent-end (warn), string-unknown, item-unknown,
do-item/do-custom-unknown, quest-stage-unreachable (error)
- CLI npm run dialogues:dry [<id>] — прогон графов через DialogueRunner
на пресетах состояния (fresh / quest-taken+flowers / quest-done)
- доки: ui-and-dialogue.md (раздел «Графы в JSON и dry-run»), practices.md,
CLAUDE.md
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
21 hours ago
|
feat(game): do[]-эффекты в контенте через EffectSink; QuestEffect-свитч удалён
...
- data/effects.ts: реестр DIALOGUE_CUSTOM (plant_flowers) — имена сюжетных
эффектов, как FLAGS/VARS.
- systems/DialogueEffects.ts: DialogueEffectSink + applyDialogueEffect
(give/take в сумку, sound, toast, custom; unknown kind — тихий игнор,
валидатор = error).
- DialogueSystem: registerSink + runner.onEffect → sink.
- Контент на do[]: elder_hand_in.accept → custom plant_flowers;
trader_first.give_cloth → giveItem cloth. Удалены QuestEffect,
EXTRA_EFFECTS, questEffectFor, поле QuestStage.effect и ручной switch
в onDialogueFinished (custom откладывается до конца диалога — кат-сцена
не рвёт реплику).
- Валидатор: do[].id give/take ∈ ITEMS, custom ∈ DIALOGUE_CUSTOM (error).
- Сценарий interact-world: первый advance теперь догоняет печать —
двойное нажатие.
- Тесты: give/take в Inventory, custom до sink, unknown игнор.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
22 hours ago
|
UX-пачка: подсказки, клик-зоны, моты, коллизия домов, сундук, тихая вода
...
- Тосты держатся по длине текста (до 6 с) + подсказка сбора колокольчиков
при первом входе в пруды (флаг hint_bells).
- Клик по «телу» объекта: RouterDeps.pixelTile как фолбэк на голом клике —
bbox тел NPC/интерактивов (без подписей) + ремап на высокий тайл (дома).
- Моты: заметная насыпь с пульсирующей искрой, HUD-счётчик, вьюха
растворяется с искрами при поднятии (InteractSink.onConsumed).
- Движок: TallSpec.shadow — тайл (tx-1,ty-1) за домом блокируется
(shadowTilesOf в collision.ts + isWalkable карты, тесты).
- Интерьеры: бронзовый контур проёма + подпись «выход».
- Спрайт сундука (tiles/chest.png) вместо ящика-плейсхолдера.
- Вода прудов: radius 2.5, volume 0.22 — только вплотную и тихо.
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
Фикс десинка вью героя (SpriteMotion не двигает blink-view) + звук: ветер, шорохи, тише вода
...
- Движок: SpriteMotion перезаписывает позицию/поворот только при bob/sway —
view с чистым blink/pulse можно двигать извне (герой прибивало к точке
спавна, ходьба выглядела камерным скроллом, по прибытии спрайт
«возвращался»); detach симметричен; тесты SpriteMotion
- PlayerController: syncView на точном прибытии в waypoint (кадр не отстаёт)
- Звук: ambience/wind — глобальный слой (AmbienceLayerDef.radius опционален,
нет at/tiles — константная громкость) на лугах и прудах; вода прудов
тише (0.6→0.35, радиус 6→5); sfx/rustle — редкие дальние шорохи пепла
из тика сцены (rng сцены, случайные pan/rate). Птиц в мире нет по лору
- Доки: anim.md (правило позиционирования), practices.md (глобальные
слои, шорохи, «птицы молчат»)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
Аудио: стерео-музыка, динамические темы (бой/настороженность), 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>
|
| 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>
|
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>
|
Движок: секвенсор 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>
|
Мост: scene:synthesize — звук по спеку из агентных проверок (работа E2)
...
Агент без слуха описывает звук параметрами (SoundSpec), движок
компилирует его в буфер (playSpec), факт запуска наблюдаем в
__gameAudioLog. Проба checks/synth.mjs в agent:check: удар/звон/
скрип/гул по спекам, громкость доезжает до голоса, повторный синтез
играет, негодные спеки возвращают null, гул не глушит амбиент.
Формы спеков — в docs/engine/agent.md.
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
Игра: DEV-лог аудио, агентная проба audio, практики «Добавляю звук»
...
- DEV-шпион window.__gameAudioLog (кольцо 24): sfx через onPlayed, амбиент через playAmbience
- checks/audio.mjs: амбиент запущен один раз, шаги без боя, bell_hit, guard амбиента, кольцо;
зарегистрирована в agent.mjs (8 проб)
- Доки: practices.md — ситуация «добавляю звук»; assets-audio-save.md — шпион и проба
Co-Authored-By: Claude Code <noreply@anthropic.com>
|