Решили: у способности появилась СВОЯ база урона — 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 (нормы классов).