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.");
}
}
}