Решили: активка-рекаст перестала быть источником урона. Она заявляет уникальный удар: обрезает доигрыш текущей атаки, пускает следующую вне очереди и делает её особой — свой множитель, свои эффекты, всё при попадании. Первым переведён «Решительный удар»: множитель и эффекты уехали из активки в заряд effect.resolute_strike_charge.

Заодно рекаст стал объявляемым, а не выводимым. По вердикту Макса он положен троим: «Решительный удар», удар Монаха воды и выход из тени у Убийцы; Драугр со своей «каждой третьей» остаётся в ритме.

Почему: активка была вторым путём урона — мгновенным, неотменяемым, мимо замаха и мимо чужих реакций. Из этого следовало всё разом: бурст нельзя ни сбить контролем, ни уклониться от него, у него нет телеграфа, и он не проходит через те же on-hit, шипы и блок, что обычный удар. С заявкой путь остаётся один — удар, — и контригра появляется бесплатно, потому что работает уже написанная.

Дефект, который вскрылся по дороге: рекаст выводился из условия «есть множитель урона и нет канала», то есть доставался любой активке с уроном просто по факту её существования. Замер показал троих незваных: залп Арканиста (урон размазан по снарядам), «Ледяная жатва» Морозного и «Стальной вихрь» Копейщика (круг вокруг себя). Ускорять там нечего — свинга у них нет, — но хвост атаки они обрезали и очередь пропускали. Вывод общий: механика, включающаяся по косвенному признаку, рано или поздно включается не там; признак должен объявляться.

Грабли:

  • CanAct присвоить в тесте нельзя — система эффектов пересчитывает его каждый тик и затирает значение на следующем же проходе. Прерывание в sim-тесте ставится настоящим эффектом контроля. Стоило одного ложного падения: удар проходил, стан на цели успевал истечь, а ослабление оставалось — выглядело как «стан не наложился, ослабление наложилось».
  • Бонус-эффект удара пришлось делать списком. Уникальный удар несёт связку состояний (оглушение плюс ослабление), и слепить их в один эффект значило бы соврать про длительности, теги и цену очистки: у стана она одна, у ослабления другая.

Что осталось незакрытым: это балансный сдвиг, и он не измерен. Бурст стал медленнее на длину замаха и теперь может уйти в никуда; у трёх китов пропал незаявленный рекаст, то есть их темп упал. Записано в docs/balance-issues.md.

Владелец правды: EmpowerNextAttackComponent (объявление рекаста и список бонус-эффектов), RuntimeUnit.RecastAttack, AbilitySystem (комментарий на месте удалённого автo-рекаста — чтобы его не вернули), тесты DefenderSliceTests — три штуки про каст, попадание и сорванный замах.