Решили: нехватка данных для визуала — дефект, а не «эффекта не бывает»: клип без разметки взмаха,
тело без ударной части, пустой слот VFX теперь кричат в консоль (VisualDefects, один крик на факт за
бой). Заодно фолбэк точки A у ближнего удара поднят из ног в корпус бьющего.
Почему: ближний бой на экране остался без языка удара — ни дуги за клинком, ни формы от оружия, —
и это выглядело как задумка. Замер: из 28 мили-юнитов взмах размечен у ДВУХ (оба дев-скелета),
остальные 26 — весь покадровый бестиарий — играют клип только с маркером контакта. Дуга у них не
заводится вовсе (OnUnitSwingStarted зовётся из окна взмаха), а форма удара строилась от позиции
сима, то есть от ног. Дальний бой при этом работал и работает: его точка A — ShotPoint, разметки
взмаха он не спрашивает. Отвергли молчание с комментарием «осознанное состояние покадрового
бестиария»: комментарий виден в коде, а на экране видно только отсутствие эффекта, и отличить его от
дизайна нельзя.
Сказано: «Отсутствие нужный ивентов в анимациях - должно КРИЧАТЬ. Если чего-то не хватает для визуала - КРИЧАТЬ» (2026-08-03, сессия e218ae88).
Грабли: CallerArgumentExpression в этом рантайме недоступен (error CS0122) — имя пустого
слота VFX передаётся вызывающим через nameof, а не подставляется компилятором. Половинчатая
разметка (один маркер из двух) неотличима от полного отсутствия: StrikeWindowNormalized честно
отвечает «окна нет», поэтому автор увидел бы ровно то же, что и не размечавший ничего, — инвариант
уехал в тест.
Владелец правды: VisualDefects.cs, UnitView.ResolveAttackMarker/TrackStrikeWindow,
CombatVfx.Ready, CombatPresenter.SpawnHitForm; тесты AnimationValidationTests.Visuals_StrikeWindow_IsWholeOrAbsent
и Visuals_HitMarker_LiesInsideStrikeWindow.