VanguardReMaster/docs/Development/ANIMATION-INVENTORY.md

15 KiB
Raw Blame History

Инвентаризация боевых анимаций

Дата: 2026-10-27
Статус: [C] — фактическое устройство кода; [R] — удалено 2026-10-27.
Назначение: отметить блоки, которые временно убираем для пересборки.

Обозначения

  • [C] — используется сейчас.
  • [R] — удалено по решению пользователя (2026-10-27).
  • [O] — отдельной анимации нет; эффект получается побочным путём.
  • [U] — параметр объявлен в конфиге, но код его не читает.

Где сейчас лежит общая логика

  • Card3D — arc-перемещение, Reveal, плавный snap, rest/damage-повороты.
  • CardMoveAnimator — очередь, stagger, последовательный добор, InputLock.
  • CameraDirector — плавное движение камеры (position/rotation/FOV).
  • TriggerCheckSequence — автомат trigger/damage-check: zoom → reveal → hold → resolve → return.
  • ArrowDirector / AttackArrowView — attack/boost-стрелки.
  • GameBoard3D — рендер-перемещения, стартовая раздача, reflow руки, trigger-зона.
  • BattleView — интро, trigger-оркестрация, feedback-очередь и паузы.

A. Старт боя и раздача

  • A1 [C] Стартовая камера. GameBoard3D.SetCameraIntro мгновенно ставит камеру в introCameraPosition / introCameraTarget / introCameraFov. Держится introOverheadHold = 1.5 с.
  • A2 [C] Переезд камеры на основную позицию. CameraDirector.MoveTo, smoothstep, introCameraMoveDuration = 1.0 с.
  • A3 [C] Пауза на основной позиции. introMainHold = 1.5 с.
  • A4 [C] Стартовая раздача. GameBoard3D.AnimateHandDraw: руки скрыты, карты лежат над колодами рубашкой вверх; своя и чужая руки идут парами, внутри пары одновременно (EnqueueNow), между парами ждём завершения и 0.05 с; introDrawDuration = 0.6 с; InputLock("battle-intro").
  • A5 [C] Переворот стартового Авангарда. Card3D.Reveal после муллигана; vanguardRevealDuration = 0.8 с; направление +1 у себя, -1 у противника; InputLock("vanguard-reveal").
  • A6 [O] Отдельного «открытия стола» нет. Поле и карты появляются через Render/SetVisible.

B. Добор карт

  • B1 [C] Обычный добор. Новая карта стартует над колодой полного размера (cardScale), рубашкой вверх в ориентации будущей карты руки, летит в руку по дуге и переворачивается лицом вверх через StartArcMove (Slerp). Длительность introDrawDuration = 0.6 с, дуга arcHeight = 0.45; общий старт с муллиганом через GetDrawSource. Очередные карты скрыты, пока не начнётся их собственная дуга — над колодой видна одна.
  • B2 [C] Последовательный добор. CardMoveAnimator с sequential: true: следующая карта стартует только после завершения предыдущей; дополнительный stagger moveDelayBetweenCards = 0.22 с; InputLock("card-move").
  • B3 [C] Reflow руки. GameBoard3D.UpdateHandView каждый кадр пересчитывает позы; при возврате/доборе используется единый _visualHandCards: в нём сразу есть оставшиеся карты, возвращаемые и уже добранные; новые добавляются после завершения дуги. Рука подстраивается после каждого изменения, а не один раз под финальный HandCount. Отдельной длительности нет.
  • B4 [O] Отдельного flip-блока добора нет. cardFlipDuration в конфиге не читается; переворот получается из Slerp между рубашкой и лицом.
  • B5 [C] Возврат из руки в колоду. GameBoard3D.QueueHandReturnToDeck по MulliganView/CardReturnedToDeckView: старая карта руки уходит по дуге под низ колоды, переворачивается рубашкой вверх; длительность — общая DrawDuration (introDrawDuration = 0.6), arcHeight = 0.45; старт справа налево, следующая после завершения предыдущей (sequential: true); единый _visualHandCards пересчитывается после каждого ухода, включая ожидающие возврата; у противника зеркально. После завершения карта возвращается в пул.

C. Перемещение карт на столе

  • C1 [C] Обычное arc-перемещение. Call/Ride/Move и другие несрочные переходы: moveDuration = 0.8 с, arcHeight = 0.45.
  • C2 [C] Важное arc-перемещение. Trigger/Damage/Drop: importantMoveDuration = 1.3 с.
  • C3 [C] Плавный snap. Для локальных изменений без arc: rest, damage-поворот, reflow руки, возврат после drag. Экспоненциальное сглаживание, cardMoveSpeed = 14, cardRotateSpeed = 12.
  • C4 [C] Stagger нескольких карт. moveDelayBetweenCards = 0.22 с; повторный запрос для той же карты отменяет старый.
  • C5 [C] Board-lock. После рендера с движением InputLock("board") держится cardMoveDuration * 3 + inputLockTail, минимум 1 с.
  • C6 [C] Drag. Карта из руки при зажатии ЛКМ не двигается: включается _handTargeting, карта остаётся в hand-раскладке и hover-подъёме, а курсор только выбирает зону. Цель берётся raycast-ом по карте/кругу (VC-карта сразу даёт Vanguard), затем fallback на плоскость. На release над VC/RC отправляется CardDropped; невалидный drop оставляет карту в руке. Карты поля сохраняют обычный drag: подъём dragLift = 0.14, следование за курсором и возврат к source до снапшота.
  • C7 [C] Rest / damage-поворот. Rest — +90° вокруг Y, damage — -90°; плавный поворот.
  • C8 [O] Отдельной анимации Call/Ride/Retire нет. Всё идёт общим arc/snap; callMoveDuration не читается. retireDuration используется только как длительность баннера RETIRE.

D. Перевороты и раскрытие

  • D1 [C] Обычный face-down/face-up. Card3D.FaceDownFlip, плавный поворот через SetPose.
  • D2 [C] Переворот урона. Вокруг длинной стороны (Z 180° в damage-layout), плавный поворот.
  • D3 [C] Card3D.Reveal. Подъём +0.12, масштаб 0.85 → 1, поворот на 180° вокруг длинной оси, направление ±1.
  • D4 [C] Раскрытие Авангарда. Вызывается внутри GameBoard3D.Render при переходе !FaceUp → FaceUp; 0.8 с.
  • D5 [C] Раскрытие trigger-карты. RevealTriggerCard после завершения зума; triggerRevealDuration = 0.35 с, затем пауза.
  • D6 [C] Переворот при доборе. Побочный Slerp внутри StartArcMove; отдельного блока нет.
  • D7 [O] Отдельного cardFlipDuration-блока нет. Параметр не читается.

E. Камера и триггеры

  • E1 [C] Camera tween. CameraDirector плавно меняет position/rotation/FOV, smoothstep. Используется интро, trigger-зумом и возвратом.
  • E2 [C] Trigger-зум. cameraZoomDuration = 0.5 с, FOV 34, смещение back 3.4 / up 2.6; рука и HUD-баннер скрываются.
  • E3 [C] Полная trigger-последовательность. Зум 0.5 с → раскрытие 0.35 с → пауза triggerRevealHold = 0.75 с → ResolveReady → возврат cameraReturnDuration = 0.5 с. Выбор цели открывается только после паузы.
  • E4 [C] Damage-check без триггера. Та же камера/пауза/возврат, но без Reveal; в зоне пишется «БЕЗ ТРИГГЕРА».
  • E5 [C] Цепочка триггеров. TriggerCheckSequence умеет повторный ZoomTo для следующего триггера; отдельный cameraRezoomDuration не читается.
  • E6 [C] Отмена. Cancel/Restore мгновенно возвращают камеру и снимают lock.

F. Атака и бой

  • F1 [C] Красная attack-стрелка. Появление/рост growDuration = 0.35 с, alpha-in arrowShowDuration = 0.25 с, fade ArrowConfig.fadeDuration = 0.2 с, бегущий пунктир dashScrollSpeed = 1.5, дуга arcHeight = 0.10.
  • F2 [C] Синие boost-стрелки. Рост boostGrowDuration = 0.3 с, толщина ArrowConfig.boostThickness = 0.06; остальное как у attack.
  • F3 [C] Стрелка следует за картами. Точки пересчитываются каждый кадр; отдельной анимации нет.
  • F4 [R] Feedback-баннер. Удалён: BattleFeedback, BattleFlash, кнопка «Пропустить анимации», очередь FeedbackStep, InputLock("feedback").
  • F5 [R] Длительности feedback по событиям. Удалены вместе с баннерами; паузы eventPause/post*Pause больше не применяются. Темп держат CardMoveAnimator и trigger-последовательность.
  • F6 [C] Урон. Карта идёт в damage-зону важным arc-перемещением 1.3 с, ложится на -90°, переворачивается вокруг длинной стороны; счётчик x/6 меняется мгновенно.
  • F7 [O] Отдельной анимации лечения нет. Вспышка HealedView удалена вместе с feedback; карта урона меняется общим рендером.
  • F8 [O] Отдельной анимации Guard/Intercept/Perfect Guard нет. Осталось только общее перемещение карт.
  • F9 [O] Нет attack-lunge, shake, hit-частиц, damage-вылета и destroy-эффекта.

G. Рука и UI

  • G1 [C] Веер руки. Своя рука набирается слева направо, новая карта добавляется справа; рука противника зеркальна — новая карта слева. Обе руки пересчитываются каждый кадр, глубина даёт перекрытие. Отдельной длительности нет.
  • G2 [C] Hover карты в руке. Карта под курсором плавно поднимается камера-вверх на 10% своей высоты (handHoverLift = 0.1), после ухода курсора плавно возвращается. Только своя рука; UI/лок/драг/анимации отключают hover.
  • G3 [O] Анимации status-toast нет. Показ/скрытие мгновенные, живёт 4 с.
  • G4 [O] Анимаций оверлеев и меню нет. Открываются/закрываются мгновенно.
  • G5 [O] Переходов между сценами нет. SceneFlow переключает сцены без fade.
  • G6 [O] Анимации HUD-счётчиков нет. Рука/колода/урон/щит/триггер меняются текстом мгновенно.
  • G7 [O] Анимации подсветки нет. Highlight — мгновенная смена цвета.
  • G8 [O] Анимации изменения силы/крита нет. Меняется текст/цвет мгновенно.
  • G9 [R] Turn banner. Мёртвые поля _turnBanner/_turnBannerText удалены.

H. Служебные зависимости, не визуальные анимации

  • H1 [C] InputLock. Ключи: card-move, board, trigger-sequence, battle-intro, vanguard-reveal, overlay, card-menu, ability, card-choice. Ключ feedback удалён.
  • H2 [C] Паузы. Остались только trigger-паузы (triggerRevealHold = 0.75); eventPause/post*Pause больше не используются.
  • H3 [C] Мгновенные скрытия/показы. Рука скрывается на trigger-фокусе; trigger-зона показывается после зума и сразу Snap; trigger-карта появляется без fade.
  • H4 [C] Очистка. CardMoveAnimator.CancelAll и GameBoard3D.Clear отменяют очередь и снимают hold/lock.

I. Параметры, которые сейчас не читаются

  • cardFlipDuration
  • callMoveDuration
  • cameraRezoomDuration
  • arrowHideDuration
  • arrowFadeDuration (используется ArrowConfig.fadeDuration)
  • boostThickness в AnimationConfig (используется ArrowConfig.boostThickness)
  • cardMoveDuration — только таймаут board-lock, не длительность движения.
  • retireDuration — был только длительностью баннера RETIRE; после удаления баннеров не читается.
  • attackDeclare, guard, driveCheck, trigger, battleResolved, damage, heal, intercept, perfectGuard — были только длительностями feedback-баннеров.
  • eventPause, postDrivePause, postTriggerPause, postDamagePause — были только паузами feedback-очереди.