53 lines
1.6 KiB
C#
53 lines
1.6 KiB
C#
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);
|
|
}
|
|
}
|