using Godot; using Zennysoft.Ma.Adapter.Entity; namespace Zennysoft.Ma.Adapter { public class DamageCalculator : IDamageCalculator { public double CalculateDamage(double damage, ElementType elementType, double defense, ElementalResistanceSet elementalResistanceSet, bool isCriticalHit = false, bool ignoreDefense = false, bool ignoreElementalResistance = false) { var calculatedDamage = damage; if (!ignoreElementalResistance) calculatedDamage = CalculateElementalResistance(calculatedDamage, elementType, elementalResistanceSet); if (!ignoreDefense) calculatedDamage = CalculateDefenseResistance(calculatedDamage, defense); if (isCriticalHit) calculatedDamage *= 2; return calculatedDamage; } private static double CalculateDefenseResistance(double incomingDamage, double defense) { return Mathf.Max(incomingDamage - defense, 0.0); } private static double CalculateElementalResistance( double incomingDamage, ElementType incomingElementType, ElementalResistanceSet elementalResistanceSet) { var resistance = elementalResistanceSet.ElementalResistance[incomingElementType]; return Mathf.Max(incomingDamage - (incomingDamage * resistance), 0.0); } } public interface IDamageCalculator { public double CalculateDamage(double damage, ElementType elementType, double defense, ElementalResistanceSet elementalResistanceSet, bool isCriticalHit = false, bool ignoreDefense = false, bool ignoreElementalResistance = false); } }