Решили: у умения появилась дальность каста — те же шесть ступеней, что у авто-атаки, плюс седьмое значение по умолчанию, LikeAutoAttack. Гейт проверяется только там, где у умения есть ВНЕШНЯЯ цель; каст на себя, аура по своим, круг вокруг себя и масс-по-тегу проходят мимо него.

Почему: дальности у умений не было вовсе — любое доставало через всю арену, и «Длань жизни» Пастыря лечила раненого с другого конца поля. Дефолт наследует, потому что обычно умение бьёт оттуда же, откуда кит бьёт рукой; требовать ступень у каждого умения значило бы плодить возможность разойтись на ровном месте.

Отвергнутая альтернатива — мерить дальность у всех умений подряд: у половины из них точки просто нет. Вихрь копейщика кастуется с центром на себе, и вопрос «с какой дистанции» к нему не задаётся — вместо него задаётся «зацепит ли хоть кого-то», а на это отвечает условие каста.

Сказано: «И у умений должна быть дальность. Обычно равна дальности автоатаки. Я именно про дальность точки для каста. … У копейщика кастуется, если активка ПОПАДЕТ хоть по кому-то, например. Хотя дальность каста нет в принципе - он кастует это с центром “на себя”» (2026-08-04, сессия 86077da2).

Грабли:

  • Наследование нельзя разворачивать в число при сборке юнита. Дальность удара меняется по ходу боя: стойка Кровоманта переставляет её с 8 на 1. Свернув наследование в константу на старте, мы бы оставили его умения на дистанции, которой у него уже нет. Поэтому AbilityRuntime.CastRange хранит −1 как «спроси у стата сейчас».
  • Радиус меньше тела не срабатывает никогда. У «Взрыва спор» Друида радиус был 1.5 и считался от центра отравленного ВРАГА, а расстояние между центрами двух соприкасающихся тел — около двух: зазор ближнего боя плюс два радиуса тел. Лечение не могло достать ни до кого ни при какой расстановке, и выглядело это как «механика не реализована» (карточка так и стояла: impl: partial, «споры не лечат»). Проверять такие радиусы надо против CombatPositioning.ReachCenter, а не на глаз.
  • Тест на выбор цели падает на гейте дистанции и молчит про выбор. ManaDrainTests ставил жертву на шести от кастера, у которого дальность не задана вовсе. Правкой стала дальность кастеру, а не ослабление гейта: тест отвечает за то, кого выбрали, а не за то, дотянулись ли.

Владелец правды: CastRangeBand, AbilityRuntime.CastRange, AbilitySystem.CastReach, CombatPositioning.WithinReach.