Решили: вспышка защиты играет, когда щит поглотил хоть сколько-нибудь урона (shieldAbsorbed = ShieldDamage > 0), а не только когда удар не прошёл вовсе. Цвет вспышки — своя роль --gm-color-combat-block-flash (золото), интерфейс защиты остаётся на --gm-color-combat-shield (лёд). Яркость обычная: HDR-вариант снят.

Почему: прежнее условие HpDamage <= 0 && ShieldDamage > 0 описывало полный блок, а щит «Оплота» даёт 50 единиц плюс 7.5% недостающего HP против авто-атаки на 109 — целиком удар он съедает редко. Событие «щит сработал» из-за этого почти не показывалось, и в бою читалось как «эффект пропадает». Разделение теперь такое: shieldAbsorbed отвечает за вспышку, blocked (полное поглощение) — за то, что гаснут искры и отброс, потому что удар в тело не вошёл.

Грабли (три моих подряд, все про объём и про способ):

  • Взяла шире просьбы. Просили золото «на юните» — я перекрасила роль защиты целиком, и золотыми стали полоса щита и цифра поглощённого. Правильно было завести вторую роль сразу: цвет интерфейса и цвет события на теле — разные факты.
  • Сделала ярче, чем просили. HDR-флар (яркость 2.2) выглядел как пересвет; нужна была прежняя яркость синего, только другой оттенок. Мёртвые ShieldFlare и _blockFlashBrightness удалены, а не оставлены «на будущее».
  • Правка снимка палитры мимо USS — поймана тестом Снимок_совпадает_с_токенами_в_USS, подробности в записи «Defence Turns Gold».

Не проверено тестами на момент записи: сборка Guildmaster.Tests.EditMode не компилируется из-за чужой незавершённой правки в дереве (WindupAutoAttackTests зовёт DamageRequest.Raw, поле называется RawDamage). Пока она красная, редактор крутит старые сборки, и в игре изменения не видны — это не дефект правок, а состояние дерева.

Владелец правды: CombatPresenter (условие shieldAbsorbed против blocked), CombatColorPalette.BlockFlash, UI/Theme/tokens.semantic.uss (обе роли).