Решили: у умения появилась дальность каста — те же шесть ступеней, что у авто-атаки, плюс
седьмое значение по умолчанию, LikeAutoAttack. Гейт проверяется только там, где у умения есть
ВНЕШНЯЯ цель; каст на себя, аура по своим, круг вокруг себя и масс-по-тегу проходят мимо него.
Почему: дальности у умений не было вовсе — любое доставало через всю арену, и «Длань жизни» Пастыря лечила раненого с другого конца поля. Дефолт наследует, потому что обычно умение бьёт оттуда же, откуда кит бьёт рукой; требовать ступень у каждого умения значило бы плодить возможность разойтись на ровном месте.
Отвергнутая альтернатива — мерить дальность у всех умений подряд: у половины из них точки просто нет. Вихрь копейщика кастуется с центром на себе, и вопрос «с какой дистанции» к нему не задаётся — вместо него задаётся «зацепит ли хоть кого-то», а на это отвечает условие каста.
Сказано: «И у умений должна быть дальность. Обычно равна дальности автоатаки. Я именно про дальность точки для каста. … У копейщика кастуется, если активка ПОПАДЕТ хоть по кому-то, например. Хотя дальность каста нет в принципе - он кастует это с центром “на себя”» (2026-08-04, сессия 86077da2).
Грабли:
- Наследование нельзя разворачивать в число при сборке юнита. Дальность удара меняется по ходу боя:
стойка Кровоманта переставляет её с 8 на 1. Свернув наследование в константу на старте, мы бы
оставили его умения на дистанции, которой у него уже нет. Поэтому
AbilityRuntime.CastRangeхранит −1 как «спроси у стата сейчас». - Радиус меньше тела не срабатывает никогда. У «Взрыва спор» Друида радиус был 1.5 и считался от
центра отравленного ВРАГА, а расстояние между центрами двух соприкасающихся тел — около двух: зазор
ближнего боя плюс два радиуса тел. Лечение не могло достать ни до кого ни при какой расстановке, и
выглядело это как «механика не реализована» (карточка так и стояла:
impl: partial, «споры не лечат»). Проверять такие радиусы надо противCombatPositioning.ReachCenter, а не на глаз. - Тест на выбор цели падает на гейте дистанции и молчит про выбор.
ManaDrainTestsставил жертву на шести от кастера, у которого дальность не задана вовсе. Правкой стала дальность кастеру, а не ослабление гейта: тест отвечает за то, кого выбрали, а не за то, дотянулись ли.
Владелец правды: CastRangeBand, AbilityRuntime.CastRange, AbilitySystem.CastReach,
CombatPositioning.WithinReach.