feat(tools): батч 3 — тулзы кадров + animations в атласах
- engine/tools/frames.mjs: производные кадры из опорных — shiftFrame,
  bobFrame (парение), squashFrame (приседание), swingFrame (nearest-
  поворот вокруг опоры), mirrorFrame, deriveCycle (дескрипторы)
- buildAtlas(..., animations) — Record<имя, number[]> → JSON.animations
  (формат Pixi); assets.animation() оживает
- gen.mjs: вода двумя кадрами (tiles/water_1/2, блики сдвинуты на 1px),
  атласы героя/фауны/сгустков собираются через buildAtlas с animations,
  новый chars/npcs_sheet (idle-кадры NPC через bobFrame); сгустки в
  ячейке 20×20 теперь по центру (было прижато влево — спрайты врагов
  центрируются точнее)
- aiart/atlas.mjs: инлайн-бобинг → squashFrame (вывод идентичен),
  animations из frameSets
- игра: ключи воды water_1/water_2 (старый tiles/water удалён)
- ассеты перегенерированы вместе с генераторами (npm run art, art:lint ok)
- доки: art-pipeline.md (frames.mjs, animations), assets-audio-save.md
- тесты: frames (8), buildAtlas animations (2) — итого 369

Co-Authored-By: Claude Code <noreply@anthropic.com>
1 parent 2cd6bc6 commit 02ddeb350430d6992074c3dc7a2250320d176ea0
@root root authored 15 hours ago
Showing 19 changed files
View
apps/game/assets/chars/clumps_sheet.json
View
apps/game/assets/chars/clumps_sheet.png
View
apps/game/assets/chars/fauna_sheet.json
View
apps/game/assets/chars/hero_sheet.json
View
apps/game/assets/chars/npcs_sheet.json 0 → 100644
View
apps/game/assets/chars/npcs_sheet.png 0 → 100644
View
apps/game/assets/tiles/water.png 100644 → 0
View
apps/game/assets/tiles/water_1.png 0 → 100644
View
apps/game/assets/tiles/water_2.png 0 → 100644
View
apps/game/src/Game.ts
View
apps/game/src/scenes/LocationScene.ts
View
apps/game/tools/aiart/atlas.mjs
View
apps/game/tools/pixelart/gen.mjs
View
docs/engine/art-pipeline.md
View
docs/engine/assets-audio-save.md
View
packages/engine/tools/__tests__/atlas.test.mjs
View
packages/engine/tools/__tests__/frames.test.mjs 0 → 100644
View
packages/engine/tools/atlas.mjs
View
packages/engine/tools/frames.mjs 0 → 100644