| 2026-09-07 |
feat(engine): импульсы света, виньетка и тёмные пятна в Lighting
...
- lightSim: PulseSpec {attack, hold?, decay} + pulseEnvelope/pulseTotal
(чистая трапеция-огибающая, тестируется в node)
- Lighting.pulseLight: вспышка в точке, занимает пул источников,
авто-снятие по концу огибающей; в frames() видна как pulse#N
- Lighting.pulseAmbient: аддитивная вспышка на весь экран, один слот
- Lighting.setVignette: затемнение краёв (makeVignetteTexture, ступенчатые
кольца) с лерпом по образцу ambient
- Lighting.upsertDarkSpot/removeDarkSpot: локальные тени (multiply),
отдельный пул maxDarkSpots, рисуются под источниками
- makeGlowTexture: 4 ступени + дизер-кольцо по внешнему радиусу
- доки: render.md (раздел «Импульсы, виньетка, тёмные пятна»),
recipes.md (вспышки / виньетка / тёмная аура)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
10 hours ago
|

feat(engine): слой освещения — ambient multiply + аддитивные источники
...
- render/lightSim.ts — чистая математика (образец particleSim): LightDef/
LightFrame, детерминированное мерцание flickerFactor (сумма синусов,
диапазон [1-amount, 1]), lightFrame, lerpAmbient, dimColor
- render/Lighting.ts — Pixi-адаптер: fullscreen ambient (Texture.WHITE,
blendMode multiply — цвет и есть яркость, фундамент day/night) + пул
аддитивных спрайтов света со ступенчатой пиксельной текстурой свечения
(makeGlowTexture, generateTexture resolution 1 + nearest)
- runtime API: setAmbient(color, fadeSec) с плавным лерпом, upsertLight/
removeLight/hasLight/setLightPos/setLightColor/setLightEnabled, frames()
для снапшота агента
- Renderer: третий корень lightRoot между worldRoot и uiRoot — экранное
пространство: ambient затемняет сцену, источники рисуются поверх, HUD/
fog/fade остаются читаемыми сверху
- Camera.toScreen(wx, wy) — проекция мировой точки с учётом камеры и
тряски для слоёв вне worldRoot (без лага на кадр); apply делегирует
математику в общие хелперы
- тесты: lightSim (мерцание/кадры/лерп/dim), Lighting (ambient fade,
пул, upsert/remove, мерцание, destroy), camera toScreen согласована
с apply в т.ч. при тряске
- доки: render.md (lightRoot, toScreen, раздел «Освещение», порядок
отрисовки), recipes.md (источник света)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
10 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>
|

Крупные объекты: props с footprint в движке, слоты арта, проба дома кодом
...
Работа C из docs/plan.md — подготовка к зданиям акта 2.
Движок:
- TileMapData.props: крупный объект с footprint w×h от СЗ-угла — коллизия
по всему прямоугольнику, земля под ним (ground), спрайт якорем низ-центр
footprint'а; без текстуры — колонна-плейсхолдер (общий с tall хелпер).
- IsoDepthLayer.addRect: глубина по диагонали юго-восточного угла
footprint'а — герой у южной стены перекрывается домом, перед южным
углом рисуется поверх.
- mapFormat: props в файловом формате + валидация (целые w/h ≥ 1,
footprint внутри карты, высота в юнитах).
- LocationScene вставляет map.propViews в общий depth-слой.
- Доки движка: maps.md (секция props), render.md (addRect).
Арт (проба C2):
- Арт-библия: слоты крупных спрайтов (дом 2×2 — 64×80, 3×3 — 96×96,
4×4 — 128×112); плотность пикселя как у тайлов.
- gen.mjs: tiles/house_big.png (64×80) — композит: модули щитов + крыша
из шпал + козырёк + окна. Сравнение с AI-апскейлом 24→48 —
tools/aiart/probe-c2.png: код-композит заметно чище, апскейл — мыло с
чужой плотностью пикселя. Вывод: крупные объекты — код-композит;
апскейл только как болванка (см. docs/plan.md, работа C).
Тесты: 318 (+9: footprint, depth-rect, валидация пропов).
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
| 2026-09-05 |
камера: позиция и границы в мировых юнитах
...
- Camera.x/y и bounds в юнитах (1 юнит = 1 тайл); клэмп по экранному
bbox мирового прямоугольника; deadZone -> deadZonePx (окно на экране)
- IsometricTileMap.worldBounds; LocationScene использует его
- camera.test.ts переписан в юнитах (проверка проекций)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
2 days ago
|
камера: dead zone (окно следования) + дебаг-просмотр спрайта
...
- Camera.deadZone: цель двигает камеру только у границ окна,
внутри окна камера неподвижна; Camera.snap — мгновенная постановка
минуя окно (спавн/респаун)
- SpriteDebugView: текущий кадр героя с целым zoom (nearest) и сеткой
по границам пикселей (KeyP в локации)
- PlayerController: followPath для готовых путей, currentTexture
- фикс сборки hero_sheet: Buffer.set принимает offset в байтах —
кадры затирали друг друга, атлас был перемешанным мусором
(отсюда «сжатый» герой)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
2 days ago
|
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
|