private static IReadOnlyList <string> GetSaveFileErrata(this SaveFile sav, PKM pkm, IBasicStrings strings) { var errata = new List <string>(); ushort held = (ushort)pkm.HeldItem; if (sav.Generation > 1 && held != 0) { string?msg = null; if (held > sav.MaxItemID) { msg = MsgIndexItemGame; } else if (!pkm.CanHoldItem(sav.HeldItems)) { msg = MsgIndexItemHeld; } if (msg != null) { var itemstr = GameInfo.Strings.GetItemStrings(pkm.Format, (GameVersion)pkm.Version); errata.Add($"{msg} {(held >= itemstr.Count ? held.ToString() : itemstr[held])}"); } } if (pkm.Species > strings.Species.Count) { errata.Add($"{MsgIndexSpeciesRange} {pkm.Species}"); } else if (sav.MaxSpeciesID < pkm.Species) { errata.Add($"{MsgIndexSpeciesGame} {strings.Species[pkm.Species]}"); } if (!sav.Personal[pkm.Species].IsFormeWithinRange(pkm.AltForm) && !FormConverter.IsValidOutOfBoundsForme(pkm.Species, pkm.AltForm, pkm.GenNumber)) { errata.Add(string.Format(LegalityCheckStrings.LFormInvalidRange, Math.Max(0, sav.Personal[pkm.Species].FormeCount - 1), pkm.AltForm)); } if (pkm.Moves.Any(m => m > strings.Move.Count)) { errata.Add($"{MsgIndexMoveRange} {string.Join(", ", pkm.Moves.Where(m => m > strings.Move.Count).Select(m => m.ToString()))}"); } else if (pkm.Moves.Any(m => m > sav.MaxMoveID)) { errata.Add($"{MsgIndexMoveGame} {string.Join(", ", pkm.Moves.Where(m => m > sav.MaxMoveID).Select(m => strings.Move[m]))}"); } if (pkm.Ability > strings.Ability.Count) { errata.Add($"{MsgIndexAbilityRange} {pkm.Ability}"); } else if (pkm.Ability > sav.MaxAbilityID) { errata.Add($"{MsgIndexAbilityGame} {strings.Ability[pkm.Ability]}"); } return(errata); }
private static IReadOnlyList <string> GetSaveFileErrata(this SaveFile SAV, PKM pkm, IBasicStrings strings) { var errata = new List <string>(); if (SAV.Generation > 1) { ushort held = (ushort)pkm.HeldItem; if (held > strings.Item.Count) { errata.Add($"{MsgIndexItemRange} {held}"); } else if (held > SAV.MaxItemID) { errata.Add($"{MsgIndexItemGame} {strings.Item[held]}"); } else if (!pkm.CanHoldItem(SAV.HeldItems)) { errata.Add($"{MsgIndexItemHeld} {strings.Item[held]}"); } } if (pkm.Species > strings.Species.Count) { errata.Add($"{MsgIndexSpeciesRange} {pkm.Species}"); } else if (SAV.MaxSpeciesID < pkm.Species) { errata.Add($"{MsgIndexSpeciesGame} {strings.Species[pkm.Species]}"); } if (!SAV.Personal[pkm.Species].IsFormeWithinRange(pkm.AltForm) && !FormConverter.IsValidOutOfBoundsForme(pkm.Species, pkm.AltForm, pkm.GenNumber)) { errata.Add(string.Format(LegalityCheckStrings.V304, Math.Max(0, SAV.Personal[pkm.Species].FormeCount - 1), pkm.AltForm)); } if (pkm.Moves.Any(m => m > strings.Move.Count)) { errata.Add($"{MsgIndexMoveRange} {string.Join(", ", pkm.Moves.Where(m => m > strings.Move.Count).Select(m => m.ToString()))}"); } else if (pkm.Moves.Any(m => m > SAV.MaxMoveID)) { errata.Add($"{MsgIndexMoveGame} {string.Join(", ", pkm.Moves.Where(m => m > SAV.MaxMoveID).Select(m => strings.Move[m]))}"); } if (pkm.Ability > strings.Ability.Count) { errata.Add($"{MsgIndexAbilityRange} {pkm.Ability}"); } else if (pkm.Ability > SAV.MaxAbilityID) { errata.Add($"{MsgIndexAbilityGame} {strings.Ability[pkm.Ability]}"); } return(errata); }
public static string[] verifyPKMtoSAV(PKM pk) { // Check if PKM properties are outside of the valid range List<string> errata = new List<string>(); if (SAV.Generation > 1) { ushort held = (ushort)pk.HeldItem; if (held > GameInfo.Strings.itemlist.Length) errata.Add($"Item Index beyond range: {held}"); else if (held > SAV.MaxItemID) errata.Add($"Game can't obtain item: {GameInfo.Strings.itemlist[held]}"); else if (!pk.CanHoldItem(SAV.HeldItems)) errata.Add($"Game can't hold item: {GameInfo.Strings.itemlist[held]}"); } if (pk.Species > GameInfo.Strings.specieslist.Length) errata.Add($"Species Index beyond range: {pk.HeldItem}"); else if (SAV.MaxSpeciesID < pk.Species) errata.Add($"Game can't obtain species: {GameInfo.Strings.specieslist[pk.Species]}"); if (pk.Moves.Any(m => m > GameInfo.Strings.movelist.Length)) errata.Add($"Item Index beyond range: {string.Join(", ", pk.Moves.Where(m => m > GameInfo.Strings.movelist.Length).Select(m => m.ToString()))}"); else if (pk.Moves.Any(m => m > SAV.MaxMoveID)) errata.Add($"Game can't have move: {string.Join(", ", pk.Moves.Where(m => m > SAV.MaxMoveID).Select(m => GameInfo.Strings.movelist[m]))}"); if (pk.Ability > GameInfo.Strings.abilitylist.Length) errata.Add($"Ability Index beyond range: {pk.Ability}"); else if (pk.Ability > SAV.MaxAbilityID) errata.Add($"Game can't have ability: {GameInfo.Strings.abilitylist[pk.Ability]}"); return errata.ToArray(); }