public double CalculateDamage(BattleCharacter attacker, BattleCharacter defender, SkillEffect effect, bool shouldCritical) { var damage = 0d; if (effect.HasStatModifier(Const.Stats.Attack)) { var modifiedAtk = attacker.GetStatWithModifiers(Const.Stats.Attack, effect.StatsModifiers); damage += modifiedAtk.Value - defender.GetStat(Const.Stats.Defense); } if (effect.HasStatModifier(Const.Stats.Wisdom)) { var modifiedWis = attacker.GetStatWithModifiers(Const.Stats.Wisdom, effect.StatsModifiers); damage += modifiedWis.Value - defender.GetStat(Const.Stats.Mind); } if (effect.HasStatModifier(Const.Stats.Mind)) { damage += attacker.GetStatWithModifiers(Const.Stats.Mind, effect.StatsModifiers).Value; } if (shouldCritical) { damage *= Const.CriticalDamageMultiplier; } // damage value needs to be positive or zero at this point so a low atk doesn't heal a high def without going thru affinities damage = Math.Max(0d, damage); damage = ApplyAffinityBonuses(damage, defender, effect.Affinities); return Math.Floor(damage); }