Решения Фазы 2 (эффекты), точные даты не зафиксированы; запись извлечена из замороженного
20-explanation/effects-abilities.
Решили два независимых правила внутри модели эффектов.
1. Порядок в списке активных эффектов — по id определения, а не по порядку наложения. По этому порядку идут pre-damage реакции, тик периодики и чек-сумма детерминизма. Вставка сортированная.
2. Атрибуция ведётся списком вкладчиков и их весов — двумя параллельными списками, не словарём.
Вклад растёт при каждом наложении, даже когда правило Refresh и число стаков не изменилось.
Почему: и то и другое — про зеркальный бой. Порядок наложения хранил историю вместо состояния и у зеркальных сторон расходился: одинаковая по составу пара юнитов получала разный порядок обхода, и место в списке становилось игровым преимуществом. Сортировка по id делает состояние функцией от состава, а не от прошлого. Сортированная вставка дешева, потому что наложение случается несравнимо реже, чем тик.
Два списка вместо словаря — потому что вкладчиков единицы, порядок равен порядку наложения (значит обход детерминирован), и на этом обходе стоит чек-сумма. Рост вклада при каждом наложении нужен, иначе горение, которое двое держат по очереди, целиком висело бы на первом — а он его, может, уже и не поддерживает.
Грабли: делить тик периодики по вкладчикам можно только у компонентов, чья величина скейлится потенцией (урон, лечение). Компонент состояния — например тот, что снимает стак по таймеру — обязан отработать ровно один раз: раздели его между вкладчиками, и несколько источников начнут ускорять сход стаков. Сумма долей равна единице.
Отдельно: у коммита эффектов есть второй вход, для юнита вне боевого тика. Только что собранный фабрикой юнит обязан родиться с уже действующими пассивками, иначе выходит на арену с недобранным HP и погашенными метками. Связано с Journal - RuntimeUnit Is A Mutable Bag On Purpose.
Владелец правды: Assets/_Project/Scripts/Combat/Effects/EffectSystem.cs и RuntimeEffect рядом;
закон видимости и двухфазность тика — 40-planning/tick-resolution плюс тесты тик-ордера.