Решили: эффекты, живущие собственным таймером схода («Угли», «Изморозь»), сами сжимают своё окно на EffectSystem.DurationScale — новый публичный множитель длительности от статов сторон.

Почему: оба эффекта объявлены бессрочными (baseDuration = -1) намеренно — с обычной длительностью они истекали бы РАЗОМ со всеми стаками вместо постепенного осыпания, которое требует карточка burn. Но ResolveDurationTicks на отрицательной длительности выходит первой же строкой, поэтому ReceiveDebuffEff проходил мимо: стойкость к дебаффам не действовала на самый частый дебафф в игре и на всю холодную линию. Альтернатива — дать им конечную длительность и продлевать её на каждый стак — отвергнута: это ровно та реализация, от которой уходили, когда писали свой таймер схода.

Сказано: «Т.е. уголь бессерочный? Втф. Изучи по документации как он должен работать!!!» и следом, про распространение правила: «Да, и всех таких дебаффов в т.ч.!» (2026-08-03, сессия 87bf8fd2).

Грабли:

  • «Бессрочный» здесь не значит «вечный». Слово в поле сбивает: угли держатся 5 секунд и осыпаются с ускорением, ровно как в карточке. Бессрочность — способ сказать движку «не истекай целиком».
  • Тега Wet в проекте не существовало вовсе. Правило «мокрый ускоряет сход углей ×2» описано в карточке с 2026-07-26, зеркальная половина (огонь гасит «Изморозь») была реализована, а эта нет — и не могла быть: состояния «мокрый» не было ни тегом, ни эффектом. Заведены и тег, и маркер effect.wet на 4 секунды, накладывают автоатаки водного монаха.
  • GetStringTableCollections() возвращает ВСЕ коллекции, включая UI. Проход по ним с AddKey завёл контентные ключи ещё и в UI-таблицу; заметно только по git status. Правя лок-таблицы, фильтруй по TableCollectionName.

Владелец правды: EmberComponent.cs, FrostComponent.cs, EffectSystem.DurationScale, EffectTag.Wet.