PkmnLib.NET/PkmnLib.Static/Nature.cs

86 lines
2.5 KiB
C#

using PkmnLib.Static.Utils;
namespace PkmnLib.Static;
/// <summary>
/// A nature is an attribute on a Pokémon that modifies the effective base stats on a Pokémon. They
/// can have an increased statistic and a decreased statistic, or be neutral.
/// </summary>
public interface INature : INamedValue
{
/// <summary>
/// The stat that should receive the increased modifier.
/// </summary>
Statistic IncreasedStat { get; }
/// <summary>
/// The stat that should receive the decreased modifier.
/// </summary>
Statistic DecreasedStat { get; }
/// <summary>
/// The amount that the increased stat gets modified by.
/// </summary>
float IncreasedModifier { get; }
/// <summary>
/// The amount that the decreased stat gets modified by.
/// </summary>
float DecreasedModifier { get; }
/// <summary>
/// Calculates the modifier for a given stat. If it's the increased stat, returns the increased
/// modifier, if it's the decreased stat, returns the decreased modifier. Otherwise returns 1.0.
/// </summary>
/// <param name="stat">The stat to calculate the modifier for.</param>
/// <returns>The calculated modifier.</returns>
float GetStatModifier(Statistic stat);
/// <summary>
/// Checks if two natures are equal.
/// </summary>
/// <param name="other">The other nature to compare to.</param>
/// <returns>True if the natures are equal, false otherwise.</returns>
bool Equals(INature other);
}
/// <inheritdoc />
public class Nature(
StringKey name,
Statistic increaseStat,
Statistic decreaseStat,
float increaseModifier,
float decreaseModifier)
: INature
{
/// <inheritdoc />
public StringKey Name { get; } = name;
/// <inheritdoc />
public Statistic IncreasedStat { get; } = increaseStat;
/// <inheritdoc />
public Statistic DecreasedStat { get; } = decreaseStat;
/// <inheritdoc />
public float IncreasedModifier { get; } = increaseModifier;
/// <inheritdoc />
public float DecreasedModifier { get; } = decreaseModifier;
/// <inheritdoc />
public float GetStatModifier(Statistic stat)
{
if (stat == IncreasedStat && stat != DecreasedStat)
return IncreasedModifier;
if (stat == DecreasedStat && stat != IncreasedStat)
return DecreasedModifier;
return 1.0f;
}
/// <inheritdoc />
public bool Equals(INature? other)
{
return other is not null && StringComparer.InvariantCultureIgnoreCase.Equals(Name, other.Name);
}
}