Решили: потолок длительности свинга авто-атаки стал полем юнита — UnitData.AttackSwingTicks (0 = глобальный SimConstants.MaxAttackAnimTicks, который остаётся 30 тиками). Все четыре входа AttackTiming (AttackDurationTicks, WindupTicks, WindupTicksFromShare, FollowThroughTicks) принимают потолок необязательным параметром; WindupTicksFor читает его один раз и передаёт в оба пути расчёта — покадровый и по доле.

Почему: Макс просил тяжёлым китам занос на 1.5–2 сек, чтобы окно прерывания и парирования было шире. Поднимать глобальную константу для этого нельзя: пауза между атаками = интервал − свинг, и при неизменных темпах подъём до 45 обнулил бы паузу у трёх классов из четырёх, а у Танка срезал бы её с 0.83 до 0.33 сек — то есть дал бы результат, противоположный второй половине задачи. Глобальный дефолт при этом сохранён сознательно: одинаковая длина заноса у всех — это читаемость поля боя, когда игрок парсит восемь юнитов сразу (аргумент из 40-planning/attack-timing).

Поле легло в UnitData рядом с WindupShare, а не в UnitVisual: там уже принята идиома «0 = не задано», и, главное, скелетные риги не имеют UnitVisual — а именно тяжёлым китам на ригах нужен длинный свинг. Значение в тиках, не секундах: секунды добавили бы второе округление в целочисленную формулу, чего модель тайминга избегает намеренно (одно округление на конверсии AttackSpeed).

Грабли: формулировка «сделаем занос длиннее» читается как «дадим юниту больше воздуха», а арифметически означает обратное — свинг съедает паузу. Ловушка настолько приглашающая, что на неё едва не купились в самом обсуждении: заявка была «и паузу подольше, и атаку подольше», а это одновременно невозможно без снижения скорости атаки того же юнита. Поэтому правило продублировано там, где его увидит следующий: в <remarks> поля и отдельным тестом Swing_UnitOverride_EatsTheWaitingWindow, который утверждает не «работает как надо», а именно «пауза сократилась» — чтобы правку не приняли за рост окна.

Владелец правды: UnitData.AttackSwingTicks (<remarks> — почему глобальный дефолт остался и чем опасно крутить поле в одиночку), тесты AttackTimingTests §«Свой потолок свинга у юнита» (6 штук: override заменяет глобальный, 0 падает на дефолт, кламп к интервалу сильнее любого потолка, замах расширяется, пауза сокращается, замах + доигрыш = длительность свинга). Дизайн-решение — журнал ГДД 2026-07-30 (ночь, 3).