Решили: последствия забега (травмы и закалки) ложатся последним слоем каскада статов — после класса, вида, персоны, Судьбы и предметов.
Почему: рана обещает «−30% скорости» от того, чем боец стал со всем снаряжением, а не от голой базы. Положи её раньше предметов — и сапоги скорости отыгрывали бы травму сильнее, чем написано в карточке, причём тем сильнее, чем лучше собран боец. Слой последний ещё и потому, что он единственный, который снимают посреди забега.
Отвергнут слой сразу после Судьбы («последствие ближе к человеку, чем к вещам»): красивее по смыслу, но ломает обещание карточки.
Грабли: порядок различим не всегда — на PercentMult результат одинаков при любой перестановке,
и тест на множителях зелёный в обе стороны. Различает его Override: последний побеждает, и
последствие обязано перебивать предмет, иначе снаряжение «вылечивало» бы травму молча. Инвариант
проверяется именно на Override.
Второе: тела мира вне боя (двор, хаб) собираются тем же каскадом, но долю StartHpPct НЕ применяют.
Травма по максимуму HP там видна, травма по стартовому запасу — нет, и это верно: до боя запас ещё
не срезан. Формула стартового запаса поэтому живёт одна на двоих —
EffectiveStats.StartingHp, а не по месту чтения.
Владелец правды: EffectiveStats.cs, тест InjuriesInBattleTests.