Решили: у способности появилась СВОЯ база урона — AbilityData._baseDamage плюс AbilityParameter.BaseDamage для скейла от статов. Итоговый прямой урон = база + доля автоатаки; оба слагаемых необязательны.

Почему: до этого урон способности считался только как DamageMultiplier × AutoAttackDamage. Для удара-умения это верно (ульта воина — усиленный удар), но заклинателю приходилось задирать автоатаку, чтобы заклинание что-то значило, — и кит становился сильным дважды. Арканист бил посохом 120 DPS (норма Дальника 132) И залпом по 56 за стрелу от той же автоатаки; итог — 100% побед в отрядах. Карточка the-rift с самого начала описывала другое: «урон каждой — база и скейлится от AP».

Отвергнутая альтернатива — считать заклинания от AbilityPower жёстко в коде: тогда у каждой способности появился бы второй, невидимый в данных источник числа, а половина активок (те самые удары-умения) честно живёт от автоатаки. Два слагаемых оставляют выбор автору контента.

Сказано: «Арканист - вообще должен бить не от СИЛЫ АТАКИ, а от base значения + скейлы ап. Он щас вроде не корректно сделан» (2026-08-04, сессия c53a85ad).

Грабли:

  • Гейт «наносит ли способность урон» жил в трёх местах. Кроме самого расчёта — проверка «не кастовать поверх занесённого замаха» (AbilitySystem) и вывод типов урона для тегов кита (UnitTagResolver). Оба смотрели только на множитель: заклинание со своей базой для них не наносило урона вовсе, и кит не объявлял свой тип урона.
  • Числа кита нельзя брать из соседней строки таблицы норм. В этом же заходе я назвала норму Брузера «55», взяв её из строки Поддержки, — на самом деле 110 (Брузер = эталон 100%). Вывод о ките, построенный на этом, был неверным целиком.

Владелец правды: AbilityData._baseDamage, AbilitySystem.AbilityDamage, ClassBalanceConfig (нормы классов).