Решили: Комбо (серия Атак) стало состоянием симуляции: RuntimeUnit.ComboAttacks считает Атаки,
ComboIdleTicks меряет время вне атакующего лупа, порог разрыва — SimTuning.ComboBreakSeconds
(1.5 с). Атака засчитывается, когда прошла путь замах → (канал) → конец рекавери; промах засчитывает,
прерванная контролем — нет. Цикл фаз голема и «каждая N-я» Драугра переехали на этот счётчик и на
новые события CombatEvent.AttackCompleted / ComboBroken; своих счётчиков (RuntimeUnit.AttacksMade
у цикла, RuntimeEffect.Counter у «каждой N-й») у них больше нет. Разрыв гасит заряд, который взвела
сама серия, — точечно, ICombatContext.RemoveEffect(unit, def). Три вражеских заряда (GolemSlam,
GolemSweep, ShamanOrbStrike) получили тег Empowered и его же в _consumeTag.
Почему: ГДД описывает Комбо с 2026-07-30, в движке его не было вовсе — ни счётчика серии, ни
разрыва. Отсюда росли сразу три вещи: голем после стана продолжал цикл с прерванной фазы (счётчики
жили весь бой и не сбрасывались никогда), «каждая третья» считала Удары вместо Атак (у многоударного
кита стала бы «каждой полутора»), а взведённый заряд без тега снятия оставался висеть на носителе до
конца боя — снимать его было некому. Красный EmpowerChargeContractTests показывал верхушку: тест
требовал тег, а AutoAttackSystem 2026-07-31 узаконил None веткой «нечего снимать» — два владельца
правды разошлись, и починка «одного ассета GolemSlam» ничего бы не дала.
Разрыв снимает заряд по определению эффекта, а не диспелом по тегу Empowered: тот же тег носят
заряды активок и триггеров, а у них правило другое — сняли носителя, сгорел; отошёл, цел. Диспел по
тегу отнял бы у Убийцы удар из тени на каждом добеге длиннее полутора секунд, что прямо противоречит
карточке Скрытности («может не атаковать и отбегать, чтобы сохранить»).
Счётчик один на всех потребителей серии — вместо своего у каждого компонента. Свой пришлось бы сбрасывать на разрыве в каждом компоненте руками, а забытый сброс ниоткуда не виден: кит просто продолжал бы счёт с места, где его выбили из боя.
Сказано: «У нас же есть механика комбо обговоренная. и она должна работать так как записано в гдд. Это не только у него, но и у драурга, например» · «Надо чтобы считали “Атаки” (а в атаках может быть несколько УДАРОВ). И да, промах - это тоже атака. Надо не чтобы попала, а чтобы атака прошла полный пусть от замаха до рекавери.» · «Разрыв гасит только заряды серии» (2026-08-01, сессия 7b3b2deb).
Грабли: AttacksMade считал Удары, а звался Атаками — переименован в HitsMade. Слепота на нём и
осталась: она гасит отдельный контакт, и перевод на счётчик Атак отправил бы мимо весь поток
канального кита разом. Это открытый долг, а не решение (open-forks, ритм атаки, п. 2).
EmpowerNextAttackComponent.OnExpire не сбрасывал EmpowerSplashRadius: заряд, снятый до удара,
оставлял носителю радиус задевания, и следующий обычный удар одиночки бил по площади.
SimTuningConfig пришлось пересохранить в редакторе — иначе ConfigValidationTests красный: новое
поле приезжало из кода, а не из ассета.
Владелец правды: AutoAttackSystem.UpdateCombo/CompleteAttack, RuntimeUnit.ComboAttacks,
AttackCycleComponent, EveryNthAttackComponent, тесты ComboSeriesTests (разрыв, боевое ожидание,
промах, чужой заряд), AttackCycleTests, EmpowerChargeContractTests.