diff --git a/PKHeX/MainWindow/Main.cs b/PKHeX/MainWindow/Main.cs index 99351aa3b..86f234ed9 100644 --- a/PKHeX/MainWindow/Main.cs +++ b/PKHeX/MainWindow/Main.cs @@ -151,6 +151,7 @@ public Main() public static string[] wallpapernames, puffs = { }; public static bool unicode; public static List MoveDataSource, ItemDataSource, SpeciesDataSource, BallDataSource, NatureDataSource, AbilityDataSource, VersionDataSource; + private static List metGen1, metGen2, metGen3, metGen4, metGen5, metGen6; public static volatile bool formInitialized, fieldsInitialized, fieldsLoaded; private static int colorizedbox = -1; @@ -172,7 +173,7 @@ public Main() "中文", // CHN "Português", // Portuguese }; - private static string origintrack; + private static GameVersion origintrack; private readonly PictureBox[] SlotPictureBoxes, movePB, relearnPB; private readonly ToolTip Tip1 = new ToolTip(), Tip2 = new ToolTip(), Tip3 = new ToolTip(), NatureTip = new ToolTip(); #endregion @@ -1051,7 +1052,7 @@ private void InitializeStrings() abilitylist[0] = itemlist[0] = movelist[0] = metXY_00000[0] = metBW2_00000[0] = metHGSS_00000[0] = "(" + itemlist[0] + ")"; // Force an update to the met locations - origintrack = ""; + origintrack = GameVersion.Unknown; // Update Legality Analysis strings LegalityAnalysis.movelist = movelist; @@ -1108,6 +1109,48 @@ private void InitializeLanguage() MoveDataSource = Util.getCBList(movelist, null); + #region Met Locations + // Gen 3 + { + var met_list = Util.getCBList(metRSEFRLG_00000, Enumerable.Range(0, 213).ToArray()); + met_list = Util.getOffsetCBList(met_list, metRSEFRLG_00000, 00000, new[] { 253, 254, 255 }); + metGen3 = met_list; + } + // Gen 4 + { + var met_list = Util.getCBList(metHGSS_00000, new[] { 0 }); + met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, new[] { 2000 }); + met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, new[] { 2002 }); + met_list = Util.getOffsetCBList(met_list, metHGSS_03000, 3000, new[] { 3001 }); + met_list = Util.getOffsetCBList(met_list, metHGSS_00000, 0000, Legal.Met_HGSS_0); + met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, Legal.Met_HGSS_2); + met_list = Util.getOffsetCBList(met_list, metHGSS_03000, 3000, Legal.Met_HGSS_3); + metGen4 = met_list; + } + // Gen 5 + { + var met_list = Util.getCBList(metBW2_00000, new[] { 0 }); + met_list = Util.getOffsetCBList(met_list, metBW2_60000, 60001, new[] { 60002 }); + met_list = Util.getOffsetCBList(met_list, metBW2_30000, 30001, new[] { 30003 }); + met_list = Util.getOffsetCBList(met_list, metBW2_00000, 00000, Legal.Met_BW2_0); + met_list = Util.getOffsetCBList(met_list, metBW2_30000, 30001, Legal.Met_BW2_3); + met_list = Util.getOffsetCBList(met_list, metBW2_40000, 40001, Legal.Met_BW2_4); + met_list = Util.getOffsetCBList(met_list, metBW2_60000, 60001, Legal.Met_BW2_6); + metGen5 = met_list; + } + // Gen 6 + { + var met_list = Util.getCBList(metXY_00000, new[] { 0 }); + met_list = Util.getOffsetCBList(met_list, metXY_60000, 60001, new[] { 60002 }); + met_list = Util.getOffsetCBList(met_list, metXY_30000, 30001, new[] { 30002 }); + met_list = Util.getOffsetCBList(met_list, metXY_00000, 00000, Legal.Met_XY_0); + met_list = Util.getOffsetCBList(met_list, metXY_30000, 30001, Legal.Met_XY_3); + met_list = Util.getOffsetCBList(met_list, metXY_40000, 40001, Legal.Met_XY_4); + met_list = Util.getOffsetCBList(met_list, metXY_60000, 60001, Legal.Met_XY_6); + metGen6 = met_list; + } + #endregion + CB_EncounterType.DataSource = Util.getCBList(encountertypelist, new[] { 0 }, Legal.Gen4EncounterTypes); CB_HPType.DataSource = Util.getCBList(types.Skip(1).Take(16).ToArray(), null); CB_Nature.DataSource = new BindingSource(NatureDataSource, null); @@ -1877,114 +1920,112 @@ private void updateSpecies(object sender, EventArgs e) updateLegality(); } + private IEnumerable getLocationList(GameVersion Version, int SaveFormat, bool egg) + { + if (egg) + { + if (Version < GameVersion.W && SaveFormat >= 5) + return metGen4; + } + + switch (Version) + { + case GameVersion.CXD: + if (SaveFormat == 3) + return metGen3; + break; + + case GameVersion.R: + case GameVersion.S: + if (SaveFormat == 3) + return metGen3.OrderByDescending(loc => loc.Value <= 87); // Ferry + break; + case GameVersion.E: + if (SaveFormat == 3) + return metGen3.OrderByDescending(loc => loc.Value <= 87 || (loc.Value >= 196 && loc.Value <= 212)); // Trainer Hill + break; + case GameVersion.FR: + case GameVersion.LG: + if (SaveFormat == 3) + return metGen3.OrderByDescending(loc => loc.Value > 87 && loc.Value < 197); // Celadon Dept. + break; + + case GameVersion.D: + case GameVersion.P: + if (SaveFormat == 4 || (SaveFormat >= 5 && egg)) + return metGen4.Take(4).Concat(metGen6.Skip(4).OrderByDescending(loc => loc.Value <= 111)); // Battle Park + break; + + case GameVersion.Pt: + if (SaveFormat == 4 || (SaveFormat >= 5 && egg)) + return metGen4.Take(4).Concat(metGen6.Skip(4).OrderByDescending(loc => loc.Value <= 125)); // Rock Peak Ruins + break; + + case GameVersion.HG: + case GameVersion.SS: + if (SaveFormat == 4 || (SaveFormat >= 5 && egg)) + return metGen4.Take(4).Concat(metGen6.Skip(4).OrderByDescending(loc => loc.Value > 125 && loc.Value < 234)); // Celadon Dept. + break; + + case GameVersion.B: + case GameVersion.W: + return metGen5; + + case GameVersion.B2: + case GameVersion.W2: + return metGen5.Take(3).Concat(metGen5.Skip(3).OrderByDescending(loc => loc.Value <= 116)); // Abyssal Ruins + + case GameVersion.X: + case GameVersion.Y: + return metGen6.Take(3).Concat(metGen6.Skip(3).OrderByDescending(loc => loc.Value <= 168)); // Unknown Dungeon + + case GameVersion.OR: + case GameVersion.AS: + return metGen6.Take(3).Concat(metGen6.Skip(3).OrderByDescending(loc => loc.Value > 168 && loc.Value <= 354)); // Secret Base + } + + // Currently on a future game, return corresponding list for generation + if (Version <= GameVersion.CXD && SaveFormat == 4) + return metGen4.Where(loc => loc.Value == 0x37) // Pal Park to front + .Concat(metGen4.Take(4)) + .Concat(metGen4.Skip(4).Where(loc => loc.Value != 0x37)); + + if (Version < GameVersion.X && SaveFormat >= 5) // PokéTransfer to front + return metGen5.Where(loc => loc.Value == 30001) + .Concat(metGen5.Take(3)) + .Concat(metGen5.Skip(3).Where(loc => loc.Value != 30001)); + + return metGen6; + } private void updateOriginGame(object sender, EventArgs e) { - int Version = Util.getIndex(CB_GameOrigin); - - if (SAV.Generation == 3 && origintrack != "Gen3") + GameVersion Version = (GameVersion)Util.getIndex(CB_GameOrigin); + + // check if differs + GameVersion newTrack = SaveUtil.getVersionGroup(Version); + if (newTrack != origintrack) { - var met_list = Util.getCBList(metRSEFRLG_00000, Enumerable.Range(0, 213).ToArray()); - met_list = Util.getOffsetCBList(met_list, metRSEFRLG_00000, 00000, new[] {253, 254, 255}); - origintrack = "Gen3"; + var met_list = getLocationList(Version, SAV.Generation, egg:false); CB_MetLocation.DisplayMember = "Text"; CB_MetLocation.ValueMember = "Value"; - CB_MetLocation.DataSource = met_list; - CB_MetLocation.SelectedValue = 0; - } - else if (SAV.Generation == 4 && origintrack != "Gen4") - { - var met_list = Util.getCBList(metHGSS_00000, new[] { 0 }); - met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, new[] { 2000 }); - met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, new[] { 2002 }); - met_list = Util.getOffsetCBList(met_list, metHGSS_03000, 3000, new[] { 3001 }); - met_list = Util.getOffsetCBList(met_list, metHGSS_00000, 0000, Legal.Met_HGSS_0); - met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, Legal.Met_HGSS_2); - met_list = Util.getOffsetCBList(met_list, metHGSS_03000, 3000, Legal.Met_HGSS_3); - CB_MetLocation.DisplayMember = "Text"; - CB_MetLocation.ValueMember = "Value"; - CB_MetLocation.DataSource = met_list; + CB_MetLocation.DataSource = new BindingSource(met_list, null); + CB_MetLocation.SelectedIndex = 0; // transporter or pal park for past gen pkm + + var egg_list = getLocationList(Version, SAV.Generation, egg:true); CB_EggLocation.DisplayMember = "Text"; CB_EggLocation.ValueMember = "Value"; - CB_EggLocation.DataSource = new BindingSource(met_list, null); - CB_EggLocation.SelectedValue = 0; - CB_MetLocation.SelectedValue = 0; - origintrack = "Gen4"; - } - else if (Version < 24 && origintrack != "Past" && SAV.Generation >= 5) - { - // Load Past Gen Locations - #region B2W2 Met Locations - { - // Build up our met list - var met_list = Util.getCBList(metBW2_00000, new[] { 0 }); - met_list = Util.getOffsetCBList(met_list, metBW2_60000, 60001, new[] { 60002 }); - met_list = Util.getOffsetCBList(met_list, metBW2_30000, 30001, new[] { 30003 }); - met_list = Util.getOffsetCBList(met_list, metBW2_00000, 00000, Legal.Met_BW2_0); - met_list = Util.getOffsetCBList(met_list, metBW2_30000, 30001, Legal.Met_BW2_3); - met_list = Util.getOffsetCBList(met_list, metBW2_40000, 40001, Legal.Met_BW2_4); - met_list = Util.getOffsetCBList(met_list, metBW2_60000, 60001, Legal.Met_BW2_6); - CB_MetLocation.DisplayMember = "Text"; - CB_MetLocation.ValueMember = "Value"; - CB_MetLocation.DataSource = met_list; - CB_EggLocation.DisplayMember = "Text"; - CB_EggLocation.ValueMember = "Value"; - CB_EggLocation.DataSource = new BindingSource(met_list, null); - CB_EggLocation.SelectedValue = 0; - CB_MetLocation.SelectedValue = Version < 20 ? 30001 : 60001; - origintrack = "Past"; - } - #endregion - } - else if (Version > 23 && origintrack != "XY") - { - // Load X/Y/OR/AS locations - #region ORAS Met Locations - { - // Build up our met list - var met_list = Util.getCBList(metXY_00000, new[] { 0 }); - met_list = Util.getOffsetCBList(met_list, metXY_60000, 60001, new[] { 60002 }); - met_list = Util.getOffsetCBList(met_list, metXY_30000, 30001, new[] { 30002 }); - met_list = Util.getOffsetCBList(met_list, metXY_00000, 00000, Legal.Met_XY_0); - met_list = Util.getOffsetCBList(met_list, metXY_30000, 30001, Legal.Met_XY_3); - met_list = Util.getOffsetCBList(met_list, metXY_40000, 40001, Legal.Met_XY_4); - met_list = Util.getOffsetCBList(met_list, metXY_60000, 60001, Legal.Met_XY_6); - CB_MetLocation.DisplayMember = "Text"; - CB_MetLocation.ValueMember = "Value"; - CB_MetLocation.DataSource = met_list; - CB_EggLocation.DisplayMember = "Text"; - CB_EggLocation.ValueMember = "Value"; - CB_EggLocation.DataSource = new BindingSource(met_list, null); - CB_EggLocation.SelectedValue = 0; - CB_MetLocation.SelectedValue = 0; - origintrack = "XY"; - } - #endregion - } + CB_EggLocation.DataSource = new BindingSource(egg_list, null); + CB_EggLocation.SelectedIndex = CHK_AsEgg.Checked ? 1 : 0; // daycare : none - if (SAV.Generation >= 4 && Version < 0x10 && origintrack != "Gen4") - { - // Load Gen 4 egg locations if Gen 4 Origin. - #region HGSS Met Locations - var met_list = Util.getCBList(metHGSS_00000, new[] { 0 }); - met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, new[] { 2000 }); - met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, new[] { 2002 }); - met_list = Util.getOffsetCBList(met_list, metHGSS_03000, 3000, new[] { 3001 }); - met_list = Util.getOffsetCBList(met_list, metHGSS_00000, 0000, Legal.Met_HGSS_0); - met_list = Util.getOffsetCBList(met_list, metHGSS_02000, 2000, Legal.Met_HGSS_2); - met_list = Util.getOffsetCBList(met_list, metHGSS_03000, 3000, Legal.Met_HGSS_3); - - CB_EggLocation.DisplayMember = "Text"; - CB_EggLocation.ValueMember = "Value"; - CB_EggLocation.DataSource = met_list; - CB_EggLocation.SelectedValue = 0; - origintrack = "Gen4"; - #endregion + origintrack = newTrack; } // Visibility logic for Gen 4 encounter type; only show for Gen 4 Pokemon. if (SAV.Generation >= 4) { - bool g4 = Version >= 7 && Version <= 12 && Version != 9; + bool g4 = Version >= GameVersion.D && Version <= GameVersion.SS; + if ((int) Version == 9) // invalid + g4 = false; CB_EncounterType.Visible = Label_EncounterType.Visible = g4; if (!g4) CB_EncounterType.SelectedValue = 0; @@ -1993,7 +2034,7 @@ private void updateOriginGame(object sender, EventArgs e) setMarkings(); // Set/Remove KB marking if (!fieldsLoaded) return; - pkm.Version = Version; + pkm.Version = (int)Version; updateLegality(); } private void updateExtraByteValue(object sender, EventArgs e) diff --git a/PKHeX/Saves/SaveUtil.cs b/PKHeX/Saves/SaveUtil.cs index 9ad69d911..ec44a1a14 100644 --- a/PKHeX/Saves/SaveUtil.cs +++ b/PKHeX/Saves/SaveUtil.cs @@ -158,6 +158,59 @@ public static GameVersion getIsG6SAV(byte[] data) return GameVersion.Invalid; } + /// Determines the Version Grouping of an input Version ID + /// Version of which to determine the group + /// Version Group Identifier or Invalid if type cannot be determined. + public static GameVersion getVersionGroup(GameVersion Version) + { + switch (Version) + { + case GameVersion.CXD: + return GameVersion.CXD; + + case GameVersion.R: + case GameVersion.S: + return GameVersion.RS; + + case GameVersion.E: + return GameVersion.E; + + case GameVersion.FR: + case GameVersion.LG: + return GameVersion.FR; + + case GameVersion.D: + case GameVersion.P: + return GameVersion.DP; + + case GameVersion.Pt: + return GameVersion.Pt; + + case GameVersion.HG: + case GameVersion.SS: + return GameVersion.HGSS; + + case GameVersion.B: + case GameVersion.W: + return GameVersion.BW; + + case GameVersion.B2: + case GameVersion.W2: + return GameVersion.B2W2; + + case GameVersion.X: + case GameVersion.Y: + return GameVersion.XY; + + case GameVersion.OR: + case GameVersion.AS: + return GameVersion.ORAS; + + default: + return GameVersion.Invalid; + } + } + /// Creates an instance of a SaveFile using the given save data. /// Save data from which to create a SaveFile. /// An appropriate type of save file for the given data, or null if the save data is invalid. @@ -286,7 +339,7 @@ internal static ushort check32(byte[] data) return (ushort)((val & 0xFFFF) + (val >> 16)); } - public static int getDexFormIndexXY(int species, int formct) + public static int getDexFormIndexBW(int species, int formct) { if (formct < 1 || species < 0) return -1; // invalid @@ -308,11 +361,29 @@ public static int getDexFormIndexXY(int species, int formct) case 648: return 066; // 2 Meloetta case 555: return 068; // 2 Darmanitan case 550: return 070; // 2 Basculin + default: return -1; + } + } + public static int getDexFormIndexB2W2(int species, int formct) + { + if (formct < 1 || species < 0) + return -1; // invalid + switch (species) + { case 646: return 072; // 3 Kyurem case 647: return 075; // 2 Keldeo case 642: return 077; // 2 Thundurus case 641: return 079; // 2 Tornadus case 645: return 081; // 2 Landorus + default: return getDexFormIndexBW(species, formct); + } + } + public static int getDexFormIndexXY(int species, int formct) + { + if (formct < 1 || species < 0) + return -1; // invalid + switch (species) + { case 666: return 083; // 20 Vivillion case 669: return 103; // 5 Flabébé case 670: return 108; // 6 Floette @@ -349,7 +420,7 @@ public static int getDexFormIndexXY(int species, int formct) case 445: return 183; // 2 Garchomp case 448: return 185; // 2 Lucario case 460: return 187; // 2 Abomasnow - default: return -1; + default: return getDexFormIndexB2W2(species, formct); } } public static int getDexFormIndexORAS(int species, int formct)