public static List <PKM> GetLivingDex(this ITrainerInfo tr, IEnumerable <int> speciesToGenerate, PKM blank) { var result = new List <PKM>(); var destType = blank.GetType(); foreach (var s in speciesToGenerate) { var pk = blank.Clone(); pk.Species = s; pk.Gender = pk.GetSaneGender(); var pi = pk.PersonalInfo; for (int f = 0; f < pi.FormCount; f++) { var entry = tr.GetLivingEntry(pk, s, f, destType); if (entry == null) { continue; } result.Add(entry); } } return(result); }
/// <summary> /// Gets all balls that are legal for the input <see cref="PKM"/>. /// </summary> /// <remarks> /// Requires checking the <see cref="LegalityAnalysis"/> for every <see cref="Ball"/> that is tried. /// </remarks> /// <param name="pkm">Pokémon to retrieve a list of valid balls for.</param> /// <returns>Enumerable list of <see cref="Ball"/> values that the <see cref="PKM"/> is legal with.</returns> public static IEnumerable <Ball> GetLegalBalls(PKM pkm) { var clone = pkm.Clone(); foreach (var b in BallList) { clone.Ball = (int)b; if (new LegalityAnalysis(clone).Valid) { yield return(b); } } }
/// <summary> /// Gets a moveset for the provided <see cref="PKM"/> data. /// </summary> /// <param name="pk">PKM to generate for</param> /// <param name="random">Full movepool & shuffling</param> /// <returns>4 moves</returns> public static int[] GetMoveSet(this PKM pk, bool random = false) { var la = new LegalityAnalysis(pk); var moves = la.GetMoveSet(random); if (random) { return(moves); } var clone = pk.Clone(); clone.SetMoves(moves); var newLa = new LegalityAnalysis(pk); // ReSharper disable once TailRecursiveCall return(newLa.Valid ? moves : GetMoveSet(pk, true)); }
public static List <PKM> GetLivingDex(ITrainerInfo tr, IEnumerable <int> speciesToGenerate, PKM blank) { var result = new List <PKM>(); var destType = blank.GetType(); foreach (var s in speciesToGenerate) { var pk = blank.Clone(); pk.Species = s; pk.Gender = pk.GetSaneGender(); var pi = pk.PersonalInfo; for (int i = 0; i < pi.FormeCount; i++) { pk.AltForm = i; if (s == (int)Species.Indeedee || s == (int)Species.Meowstic) { pk.Gender = i; } var f = EncounterMovesetGenerator.GeneratePKMs(pk, tr).FirstOrDefault(); if (f == null) { continue; } var converted = PKMConverter.ConvertToType(f, destType, out _); if (converted == null) { continue; } converted.CurrentLevel = 100; converted.Species = s; converted.AltForm = i; result.Add(converted); } } return(result); }
private static PKM ConvertPKM(PKM pk, Type PKMType, int toFormat, ref string comment) { PKM pkm = pk.Clone(); if (pkm.IsEgg) { pkm.ForceHatchPKM(); } while (true) { pkm = IntermediaryConvert(pkm, PKMType, toFormat, ref comment); if (pkm == null) // fail convert { return(null); } if (pkm.GetType() == PKMType) // finish convert { return(pkm); } } }
/// <summary> /// Converts a PKM from one Generation 3 format to another. If it matches the destination format, the conversion will automatically return. /// </summary> /// <param name="pk">PKM to convert</param> /// <param name="PKMType">Format/Type to convert to</param> /// <param name="comment">Comments regarding the transfer's success/failure</param> /// <returns>Converted PKM</returns> public static PKM ConvertToType(PKM pk, Type PKMType, out string comment) { if (pk == null) { comment = $"Bad {nameof(pk)} input. Aborting."; return(null); } Type fromType = pk.GetType(); if (fromType == PKMType) { comment = "No need to convert, current format matches requested format."; return(pk); } if (IsNotTransferrable(pk, out comment)) { return(null); } Debug.WriteLine($"Trying to convert {fromType.Name} to {PKMType.Name}."); int fromFormat = int.Parse(fromType.Name.Last().ToString()); int toFormat = int.Parse(PKMType.Name.Last().ToString()); if (fromFormat > toFormat && fromFormat != 2) { comment = $"Cannot convert a {fromType.Name} to a {PKMType.Name}."; return(null); } PKM pkm = pk.Clone(); if (pkm.IsEgg) { ForceHatchPKM(pkm); } switch (fromType.Name) { case nameof(PK1): if (toFormat == 7) // VC->Bank { pkm = ((PK1)pk).ConvertToPK7(); } else if (toFormat == 2) // GB<->GB { pkm = ((PK1)pk).ConvertToPK2(); } break; case nameof(PK2): if (toFormat == 7) // VC->Bank { pkm = ((PK2)pk).ConvertToPK7(); } else if (toFormat == 1) // GB<->GB { if (pk.Species > 151) { comment = $"Cannot convert a {PKX.GetSpeciesName(pkm.Species, pkm.Japanese ? 1 : 2)} to {PKMType.Name}"; return(null); } pkm = ((PK2)pk).ConvertToPK1(); pkm.ClearInvalidMoves(); } break; case nameof(CK3): case nameof(XK3): // interconverting C/XD needs to visit main series format // ends up stripping purification/shadow etc stats pkm = pkm.ConvertToPK3(); goto case nameof(PK3); // fall through case nameof(PK3): if (toFormat == 3) // Gen3 Inter-trading { pkm = InterConvertPK3(pkm, PKMType); break; } if (fromType.Name != nameof(PK3)) { pkm = pkm.ConvertToPK3(); } pkm = ((PK3)pkm).ConvertToPK4(); if (toFormat == 4) { break; } goto case nameof(PK4); case nameof(BK4): pkm = ((BK4)pkm).ConvertToPK4(); if (toFormat == 4) { break; } goto case nameof(PK4); case nameof(PK4): if (PKMType == typeof(BK4)) { pkm = ((PK4)pkm).ConvertToBK4(); break; } pkm = ((PK4)pkm).ConvertToPK5(); if (toFormat == 5) { break; } goto case nameof(PK5); case nameof(PK5): pkm = ((PK5)pkm).ConvertToPK6(); if (toFormat == 6) { break; } goto case nameof(PK6); case nameof(PK6): if (pkm.Species == 25 && pkm.AltForm != 0) // cosplay pikachu { comment = "Cannot transfer Cosplay Pikachu forward."; return(null); } pkm = ((PK6)pkm).ConvertToPK7(); if (toFormat == 7) { break; } goto case nameof(PK7); case nameof(PK7): break; } comment = pkm == null ? $"Cannot convert a {fromType.Name} to a {PKMType.Name}." : $"Converted from {fromType.Name} to {PKMType.Name}."; return(pkm); }
/// <summary> /// Gets a list of valid ribbons for the <see cref="pkm"/> that can be removed. /// </summary> /// <param name="pkm">Entity to fetch the list for.</param> /// <param name="allRibbons">All ribbon names.</param> /// <returns>List of all removable ribbon names.</returns> public static IReadOnlyList <string> GetRemovableRibbons(PKM pkm, IList <string> allRibbons) { var pk = pkm.Clone(); return(RemoveAllValidRibbons(allRibbons, pk)); }
public static PKM convertToFormat(PKM pk, Type PKMType, out string comment) { bool timeMachine = true; if (pk == null || pk.Species == 0) { comment = "Null input. Aborting."; return(null); } Type fromType = pk.GetType(); int fromFormat = int.Parse(fromType.Name.Last().ToString()); int toFormat = int.Parse(PKMType.Name.Last().ToString()); Console.WriteLine($"Trying to convert {fromType.Name} to {PKMType.Name}."); PKM pkm = null; if (fromType == PKMType) { comment = "No need to convert, current format matches requested format."; return(pk); } if (fromFormat <= toFormat) { pkm = pk.Clone(); if (pkm.IsEgg) // force hatch { pkm.IsEgg = false; if (pkm.AO) { pkm.Met_Location = 318; // Battle Resort } else if (pkm.XY) { pkm.Met_Location = 38; // Route 7 } else if (pkm.Gen5) { pkm.Met_Location = 16; // Route 16 } else { pkm.Met_Location = 30001; // Pokétransfer } } switch (fromType.Name) { case nameof(PK1): pkm = PKMType == typeof(PK2) ? ((PK1)pk).convertToPK2() : null; if (toFormat == 2) { break; } pkm = ((PK2)pk).convertToPK3(); if (toFormat == 3) { break; } pkm = ((PK3)pkm).convertToPK4(); if (toFormat == 4) { if (PKMType == typeof(BK4)) { pkm = ((PK4)pkm).convertToBK4(); } break; } pkm = ((PK4)pkm).convertToPK5(); if (toFormat == 5) { break; } pkm = ((PK5)pkm).convertToPK6(); if (toFormat == 6) { break; } pkm = new PK7(pkm.Data, pkm.Identifier); break; //if (toFormat == 7) // pkm = null; // pkm.convertPK1toPK7(); //break; case nameof(PK2): //if (PKMType == typeof(PK1)) //{ // if (pk.Species > 151) // { // comment = $"Cannot convert a {PKX.getSpeciesName(pkm.Species, ((PK2)pkm).Japanese ? 1 : 2)} to {PKMType.Name}"; // return null; // } // pkm = ((PK2)pk).convertToPK1(); //} //else if (PKMType == typeof(PK3)) //{ // pkm = ((PK2)pk).convertToPK3(); //} //else // pkm = null; pkm = ((PK2)pk).convertToPK3(); if (toFormat == 3) { break; } pkm = ((PK3)pkm).convertToPK4(); if (toFormat == 4) { if (PKMType == typeof(BK4)) { pkm = ((PK4)pkm).convertToBK4(); } break; } pkm = ((PK4)pkm).convertToPK5(); if (toFormat == 5) { break; } pkm = ((PK5)pkm).convertToPK6(); if (toFormat == 6) { break; } pkm = new PK7(pkm.Data, pkm.Identifier); break; case nameof(CK3): case nameof(XK3): // interconverting C/XD needs to visit main series format // ends up stripping purification/shadow etc stats pkm = pkm.convertToPK3(); goto case nameof(PK3); // fall through case nameof(PK3): if (toFormat == 2) { pkm = ((PK3)pkm).convertToPK2(); break; } if (toFormat == 3) // Gen3 Inter-trading { switch (PKMType.Name) { case nameof(CK3): pkm = pkm.convertToCK3(); break; case nameof(XK3): pkm = pkm.convertToXK3(); break; case nameof(PK3): pkm = pkm.convertToPK3(); break; // already converted, instantly returns default: throw new FormatException(); } break; } if (fromType.Name != nameof(PK3)) { pkm = pkm.convertToPK3(); } pkm = ((PK3)pkm).convertToPK4(); if (toFormat == 4) { break; } goto case nameof(PK4); case nameof(BK4): pkm = ((BK4)pkm).convertToPK4(); if (toFormat == 4) { break; } goto case nameof(PK4); case nameof(PK4): if (PKMType == typeof(BK4)) { pkm = ((PK4)pkm).convertToBK4(); break; } pkm = ((PK4)pkm).convertToPK5(); if (toFormat == 5) { break; } goto case nameof(PK5); case nameof(PK5): pkm = ((PK5)pkm).convertToPK6(); if (toFormat == 6) { break; } goto case nameof(PK6); case nameof(PK6): pkm = ((PK6)pkm).convertToPK7(); if (toFormat == 7) { break; } goto case nameof(PK7); case nameof(PK7): break; } } else // fromFormat > toFormat - we're going backwards, normally unsupported - obviously not perfect, but its cool i guess { pkm = pk.Clone(); if (pkm.IsEgg) // force hatch { pkm.IsEgg = false; if (pkm.AO) { pkm.Met_Location = 318; // Battle Resort } else if (pkm.XY) { pkm.Met_Location = 38; // Route 7 } else if (pkm.Gen5) { pkm.Met_Location = 16; // Route 16 } else { pkm.Met_Location = 30001; // Pokétransfer } } switch (fromType.Name) { case "PK2": if (PKMType == typeof(PK1)) { if (pk.Species > 151) { comment = $"Cannot convert a {PKX.getSpeciesName(pkm.Species, ((PK2)pkm).Japanese ? 1 : 2)} to {PKMType.Name}"; return(null); } pkm = ((PK2)pk).convertToPK1(); } else { pkm = null; } break; case "PK7": if ( (toFormat == 6 && pk.Species > 721) || (toFormat == 5 && pk.Species > 649) || (toFormat == 4 && pk.Species > 493) || (toFormat == 3 && pk.Species > 386) || (toFormat == 2 && pk.Species > 251) || (toFormat == 1 && pk.Species > 151) ) { pkm = null; break; } // how awkward im the worst pkm = new PK6(pkm.Data, pkm.Identifier); if (toFormat == 6) { break; } pkm = ((PK6)pkm).convertToPK5(); if (toFormat == 5) { break; } pkm = ((PK5)pkm).convertToPK4(); if (toFormat == 4) { break; } pkm = ((PK4)pkm).convertToPK3(); if (toFormat == 3) { break; } pkm = ((PK3)pkm).convertToPK2(); if (toFormat == 2) { break; } pkm = ((PK2)pkm).convertToPK1(); break; case "PK6": if ( (toFormat == 5 && pk.Species > 649) || (toFormat == 4 && pk.Species > 493) || (toFormat == 3 && pk.Species > 386) || (toFormat == 2 && pk.Species > 251) || (toFormat == 1 && pk.Species > 151) ) { pkm = null; break; } // how awkward im the worst pkm = ((PK6)pkm).convertToPK5(); if (toFormat == 5) { break; } pkm = ((PK5)pkm).convertToPK4(); if (toFormat == 4) { break; } pkm = ((PK4)pkm).convertToPK3(); if (toFormat == 3) { break; } pkm = ((PK3)pkm).convertToPK2(); if (toFormat == 2) { break; } pkm = ((PK2)pkm).convertToPK1(); break; case "PK5": if ( (toFormat == 4 && pk.Species > 493) || (toFormat == 3 && pk.Species > 386) || (toFormat == 2 && pk.Species > 251) || (toFormat == 1 && pk.Species > 151) ) { pkm = null; break; } // how awkward im the worst pkm = ((PK5)pkm).convertToPK4(); if (toFormat == 4) { break; } pkm = ((PK4)pkm).convertToPK3(); if (toFormat == 3) { break; } pkm = ((PK3)pkm).convertToPK2(); if (toFormat == 2) { break; } pkm = ((PK2)pkm).convertToPK1(); break; case "PK4": if ( (toFormat == 3 && pk.Species > 386) || (toFormat == 2 && pk.Species > 251) || (toFormat == 1 && pk.Species > 151) ) { pkm = null; break; } // how awkward im the worst pkm = ((PK4)pkm).convertToPK3(); if (toFormat == 3) { break; } pkm = ((PK3)pkm).convertToPK2(); if (toFormat == 2) { break; } pkm = ((PK2)pkm).convertToPK1(); break; case "CK3": case "XK3": // interconverting C/XD needs to visit main series format // ends up stripping purification/shadow etc stats pkm = pkm.convertToPK3(); goto case "PK3"; // fall through case "PK3": if ( (toFormat == 2 && pk.Species > 251) || (toFormat == 1 && pk.Species > 151) ) { pkm = null; break; } // how awkward im the worst pkm = ((PK3)pkm).convertToPK2(); if (toFormat == 2) { break; } pkm = ((PK2)pkm).convertToPK1(); break; } } comment = pkm == null ? $"Cannot convert a {fromType.Name} to a {PKMType.Name}." : $"Converted from {fromType.Name} to {PKMType.Name}."; return(pkm); }
public static PKM convertToFormat(PKM pk, Type PKMType, out string comment) { if (pk == null || pk.Species == 0) { comment = "Null input. Aborting."; return null; } Type fromType = pk.GetType(); int fromFormat = int.Parse(fromType.Name.Last().ToString()); int toFormat = int.Parse(PKMType.Name.Last().ToString()); Console.WriteLine($"Trying to convert {fromType.Name} to {PKMType.Name}."); PKM pkm = null; if (fromType == PKMType) { comment = "No need to convert, current format matches requested format."; return pk; } if (fromFormat <= toFormat || fromFormat == 2) { pkm = pk.Clone(); if (pkm.IsEgg) // force hatch { pkm.IsEgg = false; if (pkm.AO) pkm.Met_Location = 318; // Battle Resort else if (pkm.XY) pkm.Met_Location = 38; // Route 7 else if (pkm.Gen5) pkm.Met_Location = 16; // Route 16 else pkm.Met_Location = 30001; // Pokétransfer } switch (fromType.Name) { case nameof(PK1): if (toFormat == 2) { pkm = PKMType == typeof (PK2) ? ((PK1) pk).convertToPK2() : null; break; } if (toFormat == 7) pkm = null; // pkm.convertPK1toPK7(); break; case nameof(PK2): if (PKMType == typeof (PK1)) { if (pk.Species > 151) { comment = $"Cannot convert a {PKX.getSpeciesName(pkm.Species, ((PK2)pkm).Japanese ? 1 : 2)} to {PKMType.Name}"; return null; } pkm = ((PK2) pk).convertToPK1(); } else pkm = null; break; case nameof(CK3): case nameof(XK3): // interconverting C/XD needs to visit main series format // ends up stripping purification/shadow etc stats pkm = pkm.convertToPK3(); goto case nameof(PK3); // fall through case nameof(PK3): if (toFormat == 3) // Gen3 Inter-trading { switch (PKMType.Name) { case nameof(CK3): pkm = pkm.convertToCK3(); break; case nameof(XK3): pkm = pkm.convertToXK3(); break; case nameof(PK3): pkm = pkm.convertToPK3(); break; // already converted, instantly returns default: throw new FormatException(); } break; } if (fromType.Name != nameof(PK3)) pkm = pkm.convertToPK3(); pkm = ((PK3)pkm).convertToPK4(); if (toFormat == 4) break; goto case nameof(PK4); case nameof(BK4): pkm = ((BK4)pkm).convertToPK4(); if (toFormat == 4) break; goto case nameof(PK4); case nameof(PK4): if (PKMType == typeof(BK4)) { pkm = ((PK4)pkm).convertToBK4(); break; } pkm = ((PK4)pkm).convertToPK5(); if (toFormat == 5) break; goto case nameof(PK5); case nameof(PK5): pkm = ((PK5)pkm).convertToPK6(); if (toFormat == 6) break; goto case nameof(PK6); case nameof(PK6): pkm = new PK7(pkm.Data, pkm.Identifier); if (toFormat == 7) break; goto case nameof(PK7); case nameof(PK7): break; } } comment = pkm == null ? $"Cannot convert a {fromType.Name} to a {PKMType.Name}." : $"Converted from {fromType.Name} to {PKMType.Name}."; return pkm; }
public static PKM ConvertToType(PKM pk, Type PKMType, out string comment) { if (pk == null || pk.Species == 0) { comment = "Null input. Aborting."; return(null); } Type fromType = pk.GetType(); int fromFormat = int.Parse(fromType.Name.Last().ToString()); int toFormat = int.Parse(PKMType.Name.Last().ToString()); Debug.WriteLine($"Trying to convert {fromType.Name} to {PKMType.Name}."); PKM pkm = null; if (fromType == PKMType) { comment = "No need to convert, current format matches requested format."; return(pk); } if (fromFormat <= toFormat || fromFormat == 2) { pkm = pk.Clone(); if (pkm.IsEgg) // force hatch { pkm.IsEgg = false; if (pkm.AO) { pkm.Met_Location = 318; // Battle Resort } else if (pkm.XY) { pkm.Met_Location = 38; // Route 7 } else if (pkm.Gen5) { pkm.Met_Location = 16; // Route 16 } else { pkm.Met_Location = 30001; // Pokétransfer } pkm.IsNicknamed = false; pkm.Nickname = PKX.GetSpeciesNameGeneration(pkm.Species, pkm.Language, fromFormat); } switch (fromType.Name) { case nameof(PK1): if (toFormat == 2) { pkm = PKMType == typeof(PK2) ? ((PK1)pk).ConvertToPK2() : null; break; } if (toFormat == 7) { pkm = ((PK1)pk).ConvertToPK7(); } break; case nameof(PK2): if (PKMType == typeof(PK1)) { if (pk.Species > 151) { comment = $"Cannot convert a {PKX.GetSpeciesName(pkm.Species, ((PK2)pkm).Japanese ? 1 : 2)} to {PKMType.Name}"; return(null); } pkm = ((PK2)pk).ConvertToPK1(); pkm.ClearInvalidMoves(); } else { pkm = null; } break; case nameof(CK3): case nameof(XK3): // interconverting C/XD needs to visit main series format // ends up stripping purification/shadow etc stats pkm = pkm.ConvertToPK3(); goto case nameof(PK3); // fall through case nameof(PK3): if (toFormat == 3) // Gen3 Inter-trading { switch (PKMType.Name) { case nameof(CK3): pkm = pkm.ConvertToCK3(); break; case nameof(XK3): pkm = pkm.ConvertToXK3(); break; case nameof(PK3): pkm = pkm.ConvertToPK3(); break; // already converted, instantly returns default: throw new FormatException(); } break; } if (fromType.Name != nameof(PK3)) { pkm = pkm.ConvertToPK3(); } pkm = ((PK3)pkm).ConvertToPK4(); if (toFormat == 4) { break; } goto case nameof(PK4); case nameof(BK4): pkm = ((BK4)pkm).ConvertToPK4(); if (toFormat == 4) { break; } goto case nameof(PK4); case nameof(PK4): if (PKMType == typeof(BK4)) { pkm = ((PK4)pkm).ConvertToBK4(); break; } if (pkm.Species == 172 && pkm.AltForm != 0) { comment = "Cannot transfer Spiky-Eared Pichu forward."; return(null); } pkm = ((PK4)pkm).ConvertToPK5(); if (toFormat == 5) { break; } goto case nameof(PK5); case nameof(PK5): pkm = ((PK5)pkm).ConvertToPK6(); if (toFormat == 6) { break; } goto case nameof(PK6); case nameof(PK6): if (pkm.Species == 25 && pkm.AltForm != 0) // cosplay pikachu { comment = "Cannot transfer Cosplay Pikachu forward."; return(null); } pkm = ((PK6)pkm).ConvertToPK7(); if (toFormat == 7) { break; } goto case nameof(PK7); case nameof(PK7): break; } } comment = pkm == null ? $"Cannot convert a {fromType.Name} to a {PKMType.Name}." : $"Converted from {fromType.Name} to {PKMType.Name}."; return(pkm); }
private static PKM ConvertPKM(PKM pk, Type PKMType, Type fromType, int toFormat, ref string comment) { PKM pkm = pk.Clone(); if (pkm.IsEgg) { ForceHatchPKM(pkm); } switch (fromType.Name) { case nameof(PK1): if (toFormat == 7) // VC->Bank { pkm = ((PK1)pk).ConvertToPK7(); } else if (toFormat == 2) // GB<->GB { pkm = ((PK1)pk).ConvertToPK2(); } break; case nameof(PK2): if (toFormat == 7) // VC->Bank { pkm = ((PK2)pk).ConvertToPK7(); } else if (toFormat == 1) // GB<->GB { if (pk.Species > 151) { comment = $"Cannot convert a {PKX.GetSpeciesName(pkm.Species, pkm.Japanese ? 1 : 2)} to {PKMType.Name}"; return(pkm); } pkm = ((PK2)pk).ConvertToPK1(); pkm.ClearInvalidMoves(); } break; case nameof(CK3): case nameof(XK3): // interconverting C/XD needs to visit main series format // ends up stripping purification/shadow etc stats pkm = pkm.ConvertToPK3(); goto case nameof(PK3); // fall through case nameof(PK3): if (toFormat == 3) // Gen3 Inter-trading { pkm = InterConvertPK3(pkm, PKMType); break; } if (fromType.Name != nameof(PK3)) { pkm = pkm.ConvertToPK3(); } pkm = ((PK3)pkm).ConvertToPK4(); if (toFormat == 4) { break; } goto case nameof(PK4); case nameof(BK4): pkm = ((BK4)pkm).ConvertToPK4(); if (toFormat == 4) { break; } goto case nameof(PK4); case nameof(PK4): if (PKMType == typeof(BK4)) { pkm = ((PK4)pkm).ConvertToBK4(); break; } pkm = ((PK4)pkm).ConvertToPK5(); if (toFormat == 5) { break; } goto case nameof(PK5); case nameof(PK5): pkm = ((PK5)pkm).ConvertToPK6(); if (toFormat == 6) { break; } goto case nameof(PK6); case nameof(PK6): if (pkm.Species == 25 && pkm.AltForm != 0) // cosplay pikachu { comment = "Cannot transfer Cosplay Pikachu forward."; return(pkm); } pkm = ((PK6)pkm).ConvertToPK7(); if (toFormat == 7) { break; } goto case nameof(PK7); case nameof(PK7): break; } return(pkm); }
public void populateFields(PKM pk, bool focus = true) { if (pk == null) { WinFormsUtil.Error("Attempted to load a null file."); return; } if ((pk.Format >= 3 && pk.Format > SAV.Generation) // pk3-7, can't go backwards || (pk.Format <= 2 && SAV.Generation > 2 && SAV.Generation < 7)) // pk1-2, can't go 3-6 { WinFormsUtil.Alert($"Can't load Gen{pk.Format} to Gen{SAV.Generation} games."); return; } bool oldInit = fieldsInitialized; fieldsInitialized = fieldsLoaded = false; if (focus) Tab_Main.Focus(); pkm = pk.Clone(); if (fieldsInitialized & !pkm.ChecksumValid) WinFormsUtil.Alert("PKX File has an invalid checksum."); if (pkm.Format != SAV.Generation) // past gen format { string c; pkm = PKMConverter.convertToFormat(pkm, SAV.PKMType, out c); if (pk.Format != pkm.Format && focus) // converted WinFormsUtil.Alert("Converted File."); } try { getFieldsfromPKM(); } catch { fieldsInitialized = oldInit; throw; } CB_EncounterType.Visible = Label_EncounterType.Visible = pkm.Gen4 && SAV.Generation < 7; fieldsInitialized = oldInit; updateIVs(null, null); updatePKRSInfected(null, null); updatePKRSCured(null, null); if (HaX) // Load original values from pk not pkm { MT_Level.Text = (pk.Stat_HPMax != 0 ? pk.Stat_Level : PKX.getLevel(pk.Species, pk.EXP)).ToString(); TB_EXP.Text = pk.EXP.ToString(); MT_Form.Text = pk.AltForm.ToString(); if (pk.Stat_HPMax != 0) // stats present { Stat_HP.Text = pk.Stat_HPCurrent.ToString(); Stat_ATK.Text = pk.Stat_ATK.ToString(); Stat_DEF.Text = pk.Stat_DEF.ToString(); Stat_SPA.Text = pk.Stat_SPA.ToString(); Stat_SPD.Text = pk.Stat_SPD.ToString(); Stat_SPE.Text = pk.Stat_SPE.ToString(); } } fieldsLoaded = true; Label_HatchCounter.Visible = CHK_IsEgg.Checked && SAV.Generation > 1; Label_Friendship.Visible = !CHK_IsEgg.Checked && SAV.Generation > 1; // Set the Preview Box dragout.Image = pk.Sprite(); setMarkings(); updateLegality(); }
private static PKM ConvertPKM(PKM pk, Type PKMType, Type fromType, int toFormat, ref string comment) { PKM pkm = pk.Clone(); if (pkm.IsEgg) { pkm.ForceHatchPKM(); } switch (fromType.Name) { case nameof(PK1): if (toFormat == 7) // VC->Bank { pkm = ((PK1)pk).ConvertToPK7(); } else if (toFormat == 2) // GB<->GB { pkm = ((PK1)pk).ConvertToPK2(); } break; case nameof(PK2): if (toFormat == 7) // VC->Bank { pkm = ((PK2)pk).ConvertToPK7(); } else if (toFormat == 1) // GB<->GB { if (pk.Species > 151) { comment = $"Cannot convert a {PKX.GetSpeciesName(pkm.Species, pkm.Japanese ? 1 : 2)} to {PKMType.Name}"; return(pkm); } pkm = ((PK2)pk).ConvertToPK1(); pkm.ClearInvalidMoves(); } break; case nameof(CK3): pkm = ((CK3)pkm).ConvertToPK3(); goto case nameof(PK3); // fall through case nameof(XK3): pkm = ((XK3)pkm).ConvertToPK3(); goto case nameof(PK3); // fall through case nameof(PK3): if (toFormat == 3) { if (PKMType == typeof(CK3)) { pkm = ((PK3)pkm).ConvertToCK3(); } else if (PKMType == typeof(XK3)) { pkm = ((PK3)pkm).ConvertToXK3(); } break; } pkm = ((PK3)pkm).ConvertToPK4(); if (toFormat == 4) { break; } goto case nameof(PK4); case nameof(BK4): pkm = ((BK4)pkm).ConvertToPK4(); if (toFormat == 4) { break; } goto case nameof(PK4); case nameof(PK4): if (PKMType == typeof(BK4)) { pkm = ((PK4)pkm).ConvertToBK4(); break; } pkm = ((PK4)pkm).ConvertToPK5(); if (toFormat == 5) { break; } goto case nameof(PK5); case nameof(PK5): pkm = ((PK5)pkm).ConvertToPK6(); if (toFormat == 6) { break; } goto case nameof(PK6); case nameof(PK6): if (pkm.Species == 25 && pkm.AltForm != 0) // cosplay pikachu { comment = "Cannot transfer Cosplay Pikachu forward."; return(pkm); } pkm = ((PK6)pkm).ConvertToPK7(); if (toFormat == 7) { break; } goto case nameof(PK7); case nameof(PK7): break; } return(pkm); }