using System; namespace PKHeX.Core; /// /// Exposes details about base stat values. /// public interface IBaseStat { /// /// Base HP /// int HP { get; set; } /// /// Base Attack /// int ATK { get; set; } /// /// Base Defense /// int DEF { get; set; } /// /// Base Special Attack /// int SPA { get; set; } /// /// Base Special Defense /// int SPD { get; set; } /// /// Base Speed /// int SPE { get; set; } } public static class BaseStatExtensions { /// /// Base Stat Total sum of all stats. /// public static int GetBaseStatTotal(this IBaseStat stats) => stats.HP + stats.ATK + stats.DEF + stats.SPA + stats.SPD + stats.SPE; /// /// Gets the requested Base Stat value with the requested . /// public static int GetBaseStatValue(this IBaseStat stats, int index) => index switch { 0 => stats.HP, 1 => stats.ATK, 2 => stats.DEF, 3 => stats.SPE, 4 => stats.SPA, 5 => stats.SPD, _ => throw new ArgumentOutOfRangeException(nameof(index)), }; /// /// Gathers the base stat values into the then sorts (by value) lowest to highest. /// /// Stat implementation to load from /// Result storage public static void GetSortedStatIndexes(this IBaseStat pi, Span<(int Index, int Stat)> span) { for (int i = 0; i < span.Length; i++) span[i] = (i, pi.GetBaseStatValue(i)); // Bubble sort based off Stat value // Higher stat values go to lower indexes in the span. for (int i = 0; i < span.Length - 1; i++) { for (int j = 0; j < span.Length - 1 - i; j++) { if (span[j].Stat < span[j + 1].Stat) (span[j], span[j + 1]) = (span[j + 1], span[j]); } } } }