using System; namespace PKHeX.Core; /// /// Personal Table storing used in . /// public sealed class PersonalTable9SV : IPersonalTable, IPersonalTable { private readonly PersonalInfo9SV[] Table; private const int SIZE = PersonalInfo9SV.SIZE; private const int MaxSpecies = Legal.MaxSpeciesID_9; public int MaxSpeciesID => MaxSpecies; public PersonalTable9SV(ReadOnlySpan data) { Table = new PersonalInfo9SV[data.Length / SIZE]; var count = data.Length / SIZE; for (int i = 0, ofs = 0; i < count; i++, ofs += SIZE) { var slice = data.Slice(ofs, SIZE).ToArray(); Table[i] = new PersonalInfo9SV(slice); } } public PersonalInfo9SV this[int index] => Table[(uint)index < Table.Length ? index : 0]; public PersonalInfo9SV this[ushort species, byte form] => Table[GetFormIndex(species, form)]; public PersonalInfo9SV GetFormEntry(ushort species, byte form) => Table[GetFormIndex(species, form)]; public int GetFormIndex(ushort species, byte form) { if ((uint)species <= MaxSpeciesID) return Table[species].FormIndex(species, form); return 0; } public bool IsSpeciesInGame(ushort species) { if ((uint)species > MaxSpeciesID) return false; var form0 = Table[species]; if (form0.IsPresentInGame) return true; var fc = form0.FormCount; for (byte i = 1; i < fc; i++) { var entry = GetFormEntry(species, i); if (entry.IsPresentInGame) return true; } return false; } public bool IsPresentInGame(ushort species, byte form) { if ((uint)species > MaxSpeciesID) return false; var form0 = Table[species]; if (form == 0) return form0.IsPresentInGame; if (!form0.HasForm(form)) return false; var entry = GetFormEntry(species, form); return entry.IsPresentInGame; } PersonalInfo IPersonalTable.this[int index] => this[index]; PersonalInfo IPersonalTable.this[ushort species, byte form] => this[species, form]; PersonalInfo IPersonalTable.GetFormEntry(ushort species, byte form) => GetFormEntry(species, form); }