/// <summary> /// Gets a description of the <see cref="MysteryGift"/> using provided string data. /// </summary> /// <param name="gift">Gift data to parse</param> /// <param name="strings">String data to use</param> /// <returns>List of lines</returns> public static IEnumerable <string> GetDescription(this MysteryGift gift, IBasicStrings strings) { if (gift.Empty) { return new[] { MsgMysteryGiftSlotEmpty } } ; var result = new List <string> { gift.CardHeader }; if (gift.IsItem) { AddLinesItem(gift, strings, result); } else if (gift.IsPokémon) { try { AddLinesPKM(gift, strings, result); } #pragma warning disable CA1031 // Do not catch general exception types catch { result.Add(MsgMysteryGiftParseFail); } #pragma warning restore CA1031 // Do not catch general exception types } else { switch (gift) { case WC7 { IsBP: true } w7bp: result.Add($"BP: {w7bp.BP}"); break; case WC7 { IsBean: true } w7bean: result.Add($"Bean ID: {w7bean.Bean}"); result.Add($"Quantity: {w7bean.Quantity}"); break; default: result.Add(MsgMysteryGiftParseTypeUnknown); break; } } switch (gift) { case WC7 w7: result.Add($"Repeatable: {w7.GiftRepeatable}"); result.Add($"Collected: {w7.GiftUsed}"); result.Add($"Once Per Day: {w7.GiftOncePerDay}"); break; } return(result); }
private static void AddLinesItem(MysteryGift gift, IBasicStrings strings, ICollection <string> result) { result.Add($"Item: {strings.Item[gift.ItemID]} (Quantity: {gift.Quantity})"); if (gift is not WC7 wc7) { return; } for (var ind = 1; wc7.GetItem(ind) != 0; ind++) { result.Add($"Item: {strings.Item[wc7.GetItem(ind)]} (Quantity: {wc7.GetQuantity(ind)})"); } }
/// <summary> /// Gets a description of the <see cref="MysteryGift"/> using provided string data. /// </summary> /// <param name="gift">Gift data to parse</param> /// <param name="strings">String data to use</param> /// <returns>List of lines</returns> public static IEnumerable <string> GetDescription(this MysteryGift gift, IBasicStrings strings) { if (gift.Empty) { return new[] { MsgMysteryGiftSlotEmpty } } ; var result = new List <string> { gift.CardHeader }; if (gift.IsItem) { AddLinesItem(gift, strings, result); } else if (gift.IsPokémon) { try { AddLinesPKM(gift, strings, result); } catch { result.Add(MsgMysteryGiftParseFail); } } else if (gift.IsBP) { result.Add($"BP: {gift.BP}"); } else if (gift.IsBean) { result.Add($"Bean ID: {gift.Bean}"); result.Add($"Quantity: {gift.Quantity}"); } else { result.Add(MsgMysteryGiftParseTypeUnknown); } if (gift is WC7 w7) { result.Add($"Repeatable: {w7.GiftRepeatable}"); result.Add($"Collected: {w7.GiftUsed}"); result.Add($"Once Per Day: {w7.GiftOncePerDay}"); } return(result); }
private static void AddLinesPKM(MysteryGift gift, IBasicStrings strings, ICollection <string> result) { var id = gift.Generation < 7 ? $"{gift.TID:D5}/{gift.SID:D5}" : $"[{gift.TrainerSID7:D4}]{gift.TrainerID7:D6}"; var first = $"{strings.Species[gift.Species]} @ {strings.Item[gift.HeldItem >= 0 ? gift.HeldItem : 0]} --- " + (gift.IsEgg ? strings.EggName : $"{gift.OT_Name} - {id}"); result.Add(first); result.Add(string.Join(" / ", gift.Moves.Select(z => strings.Move[z]))); if (gift is WC7 wc7) { var addItem = wc7.AdditionalItem; if (addItem != 0) { result.Add($"+ {strings.Item[addItem]}"); } } }
private static void AddLinesPKM(MysteryGift gift, IBasicStrings strings, ICollection <string> result) { int TID7() => (int)((uint)(gift.TID | (gift.SID << 16)) % 1000000); int SID7() => (int)((uint)(gift.TID | (gift.SID << 16)) / 1000000); var id = gift.Format < 7 ? $"{gift.TID:D5}/{gift.SID:D5}" : $"[{SID7():D4}]{TID7():D6}"; var first = $"{strings.Species[gift.Species]} @ {strings.Item[gift.HeldItem]} --- " + (gift.IsEgg ? strings.EggName : $"{gift.OT_Name} - {id}"); result.Add(first); result.Add(string.Join(" / ", gift.Moves.Select(z => strings.Move[z]))); if (gift is WC7 wc7) { var addItem = wc7.AdditionalItem; if (addItem != 0) { result.Add($"+ {strings.Item[addItem]}"); } } }
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); }
/// <summary> /// Checks a <see cref="PKM"/> file for compatibility to the <see cref="SaveFile"/>. /// </summary> /// <param name="SAV"><see cref="SaveFile"/> that is being checked.</param> /// <param name="pkm"><see cref="PKM"/> that is being tested for compatibility.</param> /// <returns></returns> public static IReadOnlyList <string> IsPKMCompatible(this SaveFile SAV, PKM pkm) { IBasicStrings strings = GameInfo.Strings; return(SAV.GetSaveFileErrata(pkm, strings)); }
private static IReadOnlyList <string> GetSaveFileErrata(this SaveFile sav, PKM pk, IBasicStrings strings) { var errata = new List <string>(); ushort held = (ushort)pk.HeldItem; if (sav.Generation > 1 && held != 0) { string?msg = null; if (held > sav.MaxItemID) { msg = MsgIndexItemGame; } else if (!pk.CanHoldItem(sav.HeldItems)) { msg = MsgIndexItemHeld; } if (msg != null) { var itemstr = GameInfo.Strings.GetItemStrings(pk.Format, (GameVersion)pk.Version); errata.Add($"{msg} {(held >= itemstr.Length ? held.ToString() : itemstr[held])}"); } } if (pk.Species > strings.Species.Count) { errata.Add($"{MsgIndexSpeciesRange} {pk.Species}"); } else if (sav.MaxSpeciesID < pk.Species) { errata.Add($"{MsgIndexSpeciesGame} {strings.Species[pk.Species]}"); } if (!sav.Personal[pk.Species].IsFormWithinRange(pk.Form) && !FormInfo.IsValidOutOfBoundsForm(pk.Species, pk.Form, pk.Generation)) { errata.Add(string.Format(LegalityCheckStrings.LFormInvalidRange, Math.Max(0, sav.Personal[pk.Species].FormCount - 1), pk.Form)); } if (pk.Moves.Any(m => m > strings.Move.Count)) { errata.Add($"{MsgIndexMoveRange} {string.Join(", ", pk.Moves.Where(m => m > strings.Move.Count).Select(m => m.ToString()))}"); } else if (pk.Moves.Any(m => m > sav.MaxMoveID)) { errata.Add($"{MsgIndexMoveGame} {string.Join(", ", pk.Moves.Where(m => m > sav.MaxMoveID).Select(m => strings.Move[m]))}"); } if (pk.Ability > strings.Ability.Count) { errata.Add($"{MsgIndexAbilityRange} {pk.Ability}"); } else if (pk.Ability > sav.MaxAbilityID) { errata.Add($"{MsgIndexAbilityGame} {strings.Ability[pk.Ability]}"); } return(errata); }