using System; namespace PkmnLib.Static; public record StaticStatisticSet 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 StaticStatisticSet(T hp, T attack, T defense, T specialAttack, T specialDefense, T speed) { Hp = hp; Attack = attack; Defense = defense; SpecialAttack = specialAttack; SpecialDefense = specialDefense; Speed = speed; } 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.") }; } } public record StatisticSet : StaticStatisticSet where T : struct { public StatisticSet(T hp, T attack, T defense, T specialAttack, T specialDefense, T speed) : base(hp, attack, defense, specialAttack, specialDefense, speed) { } 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."); } } 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."); } } 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."); } } }