| 2026-09-07 |

refactor(engine): глубокий рефакторинг К2 — расшивка аудио, FadeState, контракт fx, Engine.destroy
...
Расшивка переростков:
- AudioManager (479→279) → AudioManager (фасад) + Voices (полифония sfx,
pan в полёте в шине голоса) + Loops (слоты музыки/амбиента, кроссфейд)
+ decode.ts (BufferCache с in-flight дедупом) + types.ts;
load() → register()
- IsometricTileMap: проходимость делегирует новому StaticGrid
(map/collision.ts) — единый источник blocked/пропы/тени; headless-потребители
берут через gridOf(data), setTile виден сразу
- core/fade.ts (FadeState): вместо ручных fadeLeft/fadeTotal в Lighting
(ambient+виньетка) и SceneManager; повторный to() в середине фейда
стартует от текущего значения — без прыжка
Контракт fx-эффектов: cancel() = остановить + вернуть базовое + погасить
свою вьюху (FxFade без keep теперь гасит, FxTrail получил cancel,
SpriteFlash.cancel через TintFlash.finish); конец жизни — destroyed
везде. FxLayer: один реестр тикающихся (items), flashes — только индекс
перезапуска.
Прочее:
- Engine.destroy() — полная зачистка (exit сцены, fx/tweens/events,
ввод, FPS-метр, app.destroy) для HMR; stop() — только цикл
- FpsMeter считает всегда, отдаёт геттером fps; DebugOverlay принимает
FpsMeter и перерисовывает Text не чаще 0,5 с
- Lighting: кэши текстур на инстансе (модульный переживал destroy
рендерера), чинен двойной destroy darkFree/darkLayer
- InputManager: DOM-обработчики и инъекции идут через общие примитивы
press/release (клавиши, указатель)
- SpriteAnimator: xorshift → math/rng.createRng (единый ГПСЧ)
- Мёртвый код: FrameAnimation (файл+экспорт+тест), vec2(), pxToUnits,
screenToIsoExact, pushOutOfWalls
Тесты: +fade, +SceneManager (стек/фазы/глотание), +EventBus, +Engine
(stepTicks, мок pixi.js), +SpriteAnimator, +computeScale. Доки движка
обновлены в том же коммите (core.md: FadeState/Engine.destroy;
render.md: контракт fx, кэш Lighting; anim.md/maps.md/README.md — без
FrameAnimation; practices.md: тест ядра без WebGL, поле-метод).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
6 hours ago
|
Фикс десинка вью героя (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>
root
committed
22 hours ago
|
| 2026-09-06 |

feat(engine): батч 2 — оживители статики + партиклы v2 + тайл-анимации
...
- anim/motion.ts: чистая sampleMotion — bob/sway/pulse/blink, композиция,
округление bob до целого px; anim/SpriteMotion.ts — Pixi-адаптер
(база снимается в конструкторе, живые params, detach, seed→фаза)
- render/particleSim.ts (breaking): stepParticle → ParticleVisual
(alpha/scale/rotation/tint); drag, wobble, fadeIn/fadeOut-хвост,
scaleOverLife, colorOverLife; mergeEmitterOptions — чистое слияние
(burst больше не мутирует опции); fix: rng.int инклюзивен — выход
за границы colors
- render/Particles.ts: текстурные частицы, colors/colorOverLife, spin,
size-диапазон, max-лимит + пул спрайтов, blend 'add', setOptions,
onFinish у oneShot
- IsoDepthLayer.addFx(view, tx, ty, bias=0.5) — эффекты поверх актёра
- IsometricTileMap.setTileAnimation(id, frames, fps) + update(dt) —
один общий таймлайн на все клетки id (вода)
- engine.fx (батч 1) — рецепт авто-тика в доке вместо ручного update
- доки: render.md (частицы, addFx), anim.md (SpriteMotion, тайлы),
recipes.md (ходьба/атмосфера/статика/вода/удар), maps.md
- тесты: motion (9), particleSim переписан под v2 (итого 360)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
engine: ядро анимации — SpriteAnimator, клипы, реестр тика engine.fx
...
- anim/clip.ts: чистый степпер клипов (loop/once/pingpong, время в
шагах, speedScale, dt>периода проматывает).
- anim/SpriteAnimator.ts: именованные клипы, play/pause/showStep,
onFrame/onFinish, randomPhase (seed), текстура только при смене шага.
- anim/FrameAnimation.ts → @deprecated-обёртка, API байт-в-байт.
- core/Updatables.ts + Engine.fx: движок тикает эффекты сам (между
tween-ами и сценами), самозачистка по destroyed; clear() в stop().
- Тесты: clip (7), Updatables (5), FrameAnimation (4) — пробел покрытия
закрыт (было 0). Доки: новый docs/engine/anim.md, core.md, README.
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
| 2026-09-05 |
engine: примитивы боя — Shake+Camera, shapes, Cooldown, TintFlash, particleSim, burst/oneShot, justReleased, transitionAny
...
- render/shake.ts + Camera.addShake/clearShake/update (Engine.tick тикает камеру)
- math/shapes.ts: inCircle, inCone, angleBetween, nearest
- core/Cooldown.ts: кулдаун на фиксированном шаге
- anim/flash.ts (TintFlash, lerpColor) + render/spriteFx.ts (SpriteFlash)
- render/particleSim.ts: чистая интеграция частиц; Particles.burst/oneShot + radialSpeed
- InputManager: isActionJustReleased, wasKeyReleased, pointer.downTicks
- StateMachine.transitionAny — переход из любого состояния
- Тесты: shapes, Cooldown, shake, flash, particleSim, InputManager (фейковый canvas), transitionAny (130 всего)
- docs/engine: core.md, render.md, input.md обновлены
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
2 days ago
|