Решили: потолок длительности свинга авто-атаки стал полем юнита — 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).