using UnityEngine; public class BasicStatMitigationCalculator : BrokerInterceptor { float percentStatMitigation; float reducedDamage; float finalValue; protected override void Awake() { base.Awake(); broker.OnIncomingDamage.Subscribe(HandleStatMitigation, GameConstants.BrokerEventPriority.BasicStatMitigation); } private void HandleStatMitigation(DamageArgs args) { if (args.currentValue >= 0) return; finalValue = args.currentValue; switch (args.damageType) { case DamageType.Attack: default: { percentStatMitigation = Mathf.Clamp((stats.GetStat("armor").Value * GameConstants.CharacterStatsBalancing.PercentArmorIntoDamageReduction), 0, GameConstants.CharacterStatsBalancing.MaximumPercentDamageReductionFromArmor); } break; case DamageType.Spell: { percentStatMitigation = Mathf.Clamp((stats.GetStat("magicresistance").Value * GameConstants.CharacterStatsBalancing.PercentMagicResistanceIntoDamageReduction), 0, GameConstants.CharacterStatsBalancing.MaximumPercentDamageReductionFromMagicResistance); } break; } reducedDamage = args.currentValue * percentStatMitigation; finalValue += Mathf.Abs(reducedDamage); //Debug.Log(gameObject.name + " receiving dmg = " + incomingValue + $" after mitigations from {(dmgType == DamageType.Attack ? nameof(character.Armor) : nameof(character.MagicResistance))}"); if (finalValue > 0) //avoid damage ultra mitigated turning into healing finalValue = 0; } }