namespace PkmnLib.Static; /// /// A set of statistics that cannot be changed. /// /// The size of the integer to be used public record ImmutableStatisticSet where T : struct { /// /// The health points stat value. /// public T Hp { get; protected set; } /// /// The physical attack stat value. /// public T Attack { get; protected set; } /// /// The physical defense stat value. /// public T Defense { get; protected set; } /// /// The special attack stat value. /// public T SpecialAttack { get; protected set; } /// /// The special defense stat value. /// public T SpecialDefense { get; protected set; } /// /// The speed stat value. /// public T Speed { get; protected set; } /// public ImmutableStatisticSet(T hp, T attack, T defense, T specialAttack, T specialDefense, T speed) { Hp = hp; Attack = attack; Defense = defense; SpecialAttack = specialAttack; SpecialDefense = specialDefense; Speed = speed; } /// /// Gets a statistic from the set. /// public T GetStatistic(Statistic stat) { return stat switch { Statistic.Hp => Hp, Statistic.Attack => Attack, Statistic.Defense => Defense, Statistic.SpecialAttack => SpecialAttack, Statistic.SpecialDefense => SpecialDefense, Statistic.Speed => Speed, _ => throw new ArgumentException("Invalid statistic.") }; } } /// /// A set of statistics that can be changed. /// /// public record StatisticSet : ImmutableStatisticSet where T : struct { /// public StatisticSet(T hp, T attack, T defense, T specialAttack, T specialDefense, T speed) : base(hp, attack, defense, specialAttack, specialDefense, speed) { } /// /// Modifies a statistic in the set. /// public void SetStatistic(Statistic stat, T value) { switch (stat) { case Statistic.Hp: Hp = value; break; case Statistic.Attack: Attack = value; break; case Statistic.Defense: Defense = value; break; case Statistic.SpecialAttack: SpecialAttack = value; break; case Statistic.SpecialDefense: SpecialDefense = value; break; case Statistic.Speed: Speed = value; break; default: throw new ArgumentException("Invalid statistic."); } } /// /// Increases a statistic in the set by a value. /// public void IncreaseStatistic(Statistic stat, T value) { switch (stat) { case Statistic.Hp: Hp = (T)Convert.ChangeType(Convert.ToInt32(Hp) + Convert.ToInt32(value), typeof(T)); break; case Statistic.Attack: Attack = (T)Convert.ChangeType(Convert.ToInt32(Attack) + Convert.ToInt32(value), typeof(T)); break; case Statistic.Defense: Defense = (T)Convert.ChangeType(Convert.ToInt32(Defense) + Convert.ToInt32(value), typeof(T)); break; case Statistic.SpecialAttack: SpecialAttack = (T)Convert.ChangeType(Convert.ToInt32(SpecialAttack) + Convert.ToInt32(value), typeof(T)); break; case Statistic.SpecialDefense: SpecialDefense = (T)Convert.ChangeType(Convert.ToInt32(SpecialDefense) + Convert.ToInt32(value), typeof(T)); break; case Statistic.Speed: Speed = (T)Convert.ChangeType(Convert.ToInt32(Speed) + Convert.ToInt32(value), typeof(T)); break; default: throw new ArgumentException("Invalid statistic."); } } /// /// Decreases a statistic in the set by a value. /// public void DecreaseStatistic(Statistic stat, T value) { switch (stat) { case Statistic.Hp: Hp = (T)Convert.ChangeType(Convert.ToInt32(Hp) - Convert.ToInt32(value), typeof(T)); break; case Statistic.Attack: Attack = (T)Convert.ChangeType(Convert.ToInt32(Attack) - Convert.ToInt32(value), typeof(T)); break; case Statistic.Defense: Defense = (T)Convert.ChangeType(Convert.ToInt32(Defense) - Convert.ToInt32(value), typeof(T)); break; case Statistic.SpecialAttack: SpecialAttack = (T)Convert.ChangeType(Convert.ToInt32(SpecialAttack) - Convert.ToInt32(value), typeof(T)); break; case Statistic.SpecialDefense: SpecialDefense = (T)Convert.ChangeType(Convert.ToInt32(SpecialDefense) - Convert.ToInt32(value), typeof(T)); break; case Statistic.Speed: Speed = (T)Convert.ChangeType(Convert.ToInt32(Speed) - Convert.ToInt32(value), typeof(T)); break; default: throw new ArgumentException("Invalid statistic."); } } }