Решили: стат стартового здоровья заведён как доля — StatType.StartHpPct, старт 1.0, — а не
как абсолютное значение по образцу соседнего StartResource.
Почему: MaxHP у нас двигают пять слоёв каскада (класс, вид, персона, Судьба, предметы) плюс
пассивки, которые применяются уже после сборки. Абсолютный «старт 84 HP» верен ровно для одного
набора модификаторов и расходится с потолком на первом же баффе: рана «−30% стартового HP» била бы
то сильнее, то слабее обещанного карточкой. Доля от потолка означает ровно то, что написано, при
любом MaxHP.
Отвергнут абсолют по образцу StartResource: там потолок задаётся китом и стоит на месте, поэтому
абсолют честен — сходство имён обманчиво, механика разная.
Грабли: имя выбрано не косметически. Инвариант StatKindsTests требует, чтобы каждый стат с
суффиксом Pct показывался процентом, а с суффиксом Eff — множителем; назвав стат StartHp,
получили бы показ «1.0» вместо «100%» и красный тест на ровном месте. Суффикс здесь — часть
контракта, а не стиль.
Владелец правды: StatType.cs, StatsConfig.NaturalDefault, тест StatKindsTests.