Решили: блок показывается затемнением тела, а не подсветкой щита. В момент, когда щит поглотил
урон, тело уходит в тень (CombatFeelConfig.BlockBodyDim = 0.45 на BlockDimSeconds = 0.18), а
часть-щит держит свой цвет — насыщенное золото --gm-flare-honey (#FFCC33). Удар, съеденный щитом
целиком, вспышки тела больше не получает вовсе: вспышка означает «дошло», а сюда не дошло.
Почему: вспышку ярче сделать нельзя — PlayHitFlash клампит peak к единице, и обычное попадание
уже в потолке (см. запись
«Defence Turns Gold»).
HDR-флар, которым я пыталась обойти потолок, Макс отверг как пересвет: «Надо было как синее раньше по
яркости! Не больше!!!». Его формулировка решения: «Скорее надо не щит сделать более ярким, а юнита
более тусклым» — и это работает лучше, потому что светлее уже некуда, а темнее есть куда.
Шов: у BodyVisualState появилось поле ShieldTint и метод WithShieldTint; SkeletalBodyVisual
получил _shieldPart и красит эту часть отдельно от прочих. Через SpriteRenderer напрямую нельзя —
тело живёт за IUnitBodyVisual, и у покадрового тела щита нет вовсе (там поле пустое, эффект не играет).
Обычный кадр отдаёт ShieldTint == Tint, так что для всех, кроме блока, ничего не меняется.
Грабли: реестр тумблеров джуса поймал новый вход сразу двумя тестами — OnShieldAbsorbed без
записи в FeelToggleCoverageTests.Registry и EnableBlockDim без входа. Это ровно та защита, ради
которой перепись живёт в тесте, а не в комментарии: ручка без эффекта и эффект без ручки одинаково
плохи, и оба ловятся автоматически.
Владелец правды: UnitView.OnShieldAbsorbed (твин затемнения, unscaled — блок случается в hitstop),
SkeletalBodyVisual._shieldPart, CombatFeelConfig.BlockBodyDim / BlockDimSeconds,
tokens.semantic.uss (--gm-color-combat-block-flash), тест FeelToggleCoverageTests.