| 2026-09-12 |
Лок fps: селект 30/60 вместо чекбокса — потолок 60 при rAF 60 Гц неотличим
...
Фидбек «unlocked 60 = locked 60»: лимитер применялся верно (замер живой
страницы: лок 30 даёт ровно 30 fps), но потолок, равный герцовке rAF,
пропускает каждый кадр (порог 16.7−1 мс) и по построению совпадает с
«без лока». Осмысленный демо-лимит обязан быть ниже герцовки — секция
«ЦИКЛ» стала селектом (без лока / 30 / 60), мост devSetFpsLock принимает
лимит, fpsInfo.lock — число. Тесты цикла: поправлено неверное ожидание
«первый кадр после setMaxFps проходит» (до 33.3 мс — пропуск) + сценарий
120 Гц rAF: лок 60 рендерит вдвое реже. Гейт panels синхронен.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
22 hours ago
|
FPS-счётчик в правом верхнем углу + лок 60 fps в дев-режиме
...
- движок: GameLoop.setMaxFps(fps) на живом цикле (0 — без лимита;
lastFrame сбрасывается, чтобы без лока не ждать интервала) — тест
на живом цикле с инъекцией времени
- игра: #fps в правом верхнем углу (сводка раз в 0.5 с, z-index выше
дев-панели); в панели секция «ЦИКЛ» — чекбокс «лок 60 fps»
- мост: fpsInfo() (fps + lock), devSetFpsLock(on) — применить и
синхронизировать чекбокс
- гейт panels: счётчик показывает кадры, угол виден, лок и чекбокс
синхронны (грабля: headless троттлит rAF — мерить «fps > 0»)
Тесты 345 ✓, гейт panels ✓, гейт weather 14 ✓.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
22 hours ago
|
| 2026-09-10 |
Трек 20: катсцены как данные — CutsceneRunner в движке
...
- Движок: core/cutscene.ts — жанронезависимый рантайм (стек шагов
{dur, fn?, cam?}, глайд камеры по инъекции CutsceneCamera, действие
шага может перезапустить сцену) + validateCutscenes; 8 юнит-тестов
- Игра: data/cutscenes.ts — метки точек камеры тайлами v1, именованные
действия, реестр 3 сцен; resolveCutscenes валидирует при старте;
main.ts — runner вместо inline-катсцен, мост playCutscene(id)
- Гейт cutscenes.mjs: dry-run каждой сцены до конца, камера к герою
- Все 6 гейтов игры зелёные, 295 тестов
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|
| 2026-09-09 |

Ревью-раунд: багфиксы движка и игры
...
Системный поиск ошибок (ревью движка + сверка с v1 + стресс рантайма).
Игра: тема лугов не останавливалась и наслаивалась (GameAudio держит хендл
лупа и кроссфейдит); «E» сквозь катсцену/фейд по протухшим целям; порядок
диалогов NPC как в v1 (незнакомый — всегда first); «E» — ближайшая цель с
приоритетом при ничьей (v1 pickInteract); радиус NPC 4.5; скорость героя
5.25 вокс/с (v1 1.75 юнита/с); колокольчик в сумку при сборе; ночной свет
колокольчиков следует за полем (живой слой тайлов); пустой return-стек —
фолбэк на спавн (фейд не зацикливается); кэш декода RLE (isFlower 25/тик);
камера входа в область без округления (микро-скачок).
Движок: stepTick вне ручного режима = 0 (защита от двойных шагов);
addComponent на мёртвой сущности = undefined; dispose закрывает AudioContext
и гасит все лупы (Loops.stopAll — свободные слоты playLoopBuffer раньше не
останавливались никогда); validateDialogue — kind в do[] узла и циклы
узлов-действий; DialogueRunner — реентрантность abort/start в эффектах;
dayNightFactor без NaN на вырожденных границах; remapSlots с пустой
палитрой без TypeError. Тесты 281→287, все 5 гейтов зелёные.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
3 days ago
|
Трек 13: бой — перенос боевой системы v1 на воксельный движок
...
Движок: combat/ — shapes/los/stats/enemies/playerCombat/brain + world.ts
(CombatWorld: хуки вместо EventBus v1, мир — deps-предикаты solid/opaque,
снаряды, трупы, толкучка-сепарация с откатом в стены), StateMachine +
Cooldown, 16 юнит-тестов (217 всего). Боевой юнит = 3 вокселя демки,
конвертация только на границе.
Демка: сгустки-кучки на лугу (спящий — «блин», hurt-вспышка), атака на
Space (конус/резонанс), HUD сердец #hp (скрыт вне игровой сцены), шум
шагов, мост combatSpawn/combatClear/combatInfo/combatStats/attackInput.
Гейт combat.mjs 14 проверок; все 10 гейтов демки зелёные.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
3 days ago
|
v2 трек 12: сцены — SceneManager (стек, фейд out→in), меню поверх игры в демке
...
core/scene.ts — перенос схемы v1 без привязки к бэкенду: стек
push/pop/replace, переход фазами затухание → смена → проявление
(полный переход 2×duration), FadeOverlay {setAlpha} инъекцией;
параллельные переходы глотаются, enter новой сцены не ожидается,
render рисует весь стек. 10 юнит-тестов.
Демка: gameScene (tick+рендер) внизу стека, menuScene (DOM-панель,
мир под ней) сверху — старт в меню; Esc/мост gotoMenu — автосейв
в слот auto + меню, «Продолжить» грузит auto; мост sceneInfo/
gotoMenu/startGame. Гейт scenes.mjs — 11 проверок (фейд чёрный в
конце out, глотание параллельного перехода, продолжение с сейва).
Гейты демки входят в игру через startGame(false)+60 тиков (полный
переход). Уроки: CSS display:flex перебивает атрибут hidden
(#menu[hidden]{display:none}); полный переход = 48 тиков, не 24.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
3 days ago
|

v2 трек 8: каркас ядра + герой (управление, камера следит)
...
- core/loop.ts: GameLoop — фиксированный шаг 60 Гц, аккумулятор с
maxStepsPerFrame, ручной режим setManual+stepTick (детерминизм гейтов),
now/schedule инъектируются для Node-тестов
- core/ecs.ts: EntityWorld — перенос проверенной минимальной ECS v1
(открытый вопрос «каркас ядра» решён)
- core/controls.ts: ввод как данные; screenMoveToWorld — экранные оси
в мировую горизонталь по yaw камеры (проекция на границе, урок №1)
- physics/character.ts: Character — тело физики + walk от скорости
(фаза = путь/stride, стопы не скользят; покой замирает); spawnY для
спавна в воздухе; мост тела физики переехал на Character (один путь)
- render: setTarget/currentTarget — камера (и солнце) следит за целью
- Демка: герой на WASD/стрелках + виртуальный стик агента; мост
setInput/heroInfo/heroTeleport/stepTicks/setManual/setFollow
- Гейт hero.mjs 9 проверок: ввод агента двигает героя, фаза 1.25
цикла/с, стена по грани, покой замирает, камера следует
115 юнит-тестов; гейты: render 13, turntable 5, anim 8, physics 7,
hero 9 — зелёные.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
3 days ago
|