diff --git a/PKHeX.WinForms/MainWindow/Main.cs b/PKHeX.WinForms/MainWindow/Main.cs index 222900247..163bffadb 100644 --- a/PKHeX.WinForms/MainWindow/Main.cs +++ b/PKHeX.WinForms/MainWindow/Main.cs @@ -2904,7 +2904,7 @@ private void validateComboBox(object sender) if (cb == null) return; - if (cb.Text == "") + if (cb.Text == "" && cb.Items.Count > 0) { cb.SelectedIndex = 0; return; } if (cb.SelectedValue == null) cb.BackColor = Color.DarkSalmon; diff --git a/PKHeX/Legality/Checks.cs b/PKHeX/Legality/Checks.cs index e86258a95..2d60aa058 100644 --- a/PKHeX/Legality/Checks.cs +++ b/PKHeX/Legality/Checks.cs @@ -2070,12 +2070,26 @@ private CheckResult[] verifyMoves(GameVersion game = GameVersion.Any) Legal.RemoveFutureMoves(pkm, EvoChainsAllGens, ref validLevelMoves, ref validTMHM, ref validTutor); CheckResult[] res; int[] Moves = pkm.Moves; - if (pkm.Species == 235) // Smeargle can have any move except a few + if (pkm.IsEgg && pkm.GenNumber < 6) + { + if(EventGiftMatch?.Count > 0) + res = verifyMovesEggPreRelearnEvent(Moves); + else + { + var SpecialMoves = (EncounterMatch as MysteryGift)?.Moves ?? + (EncounterMatch as EncounterStatic)?.Moves ?? + (EncounterMatch as EncounterTrade)?.Moves ?? + null; + var allowinherited = SpecialMoves == null; + res = verifyMovesIsEggPreRelearn(Moves, SpecialMoves ?? new int[0], allowinherited); + } + } + else if (pkm.Species == 235) // Smeargle can have any move except a few res = parseMovesSketch(Moves); + else if (pkm.WasEgg && pkm.GenNumber < 6) + res = verifyMovesWasEggPreRelearn(Moves, validLevelMoves, validTMHM, validTutor); else if (EventGiftMatch?.Count > 1) // Multiple possible Mystery Gifts matched, get the best match too res = parseMovesGetGift(Moves, validLevelMoves, validTMHM, validTutor); - else if (pkm.WasEgg && pkm.GenNumber < 6) - res = verifyMovesEggPreRelearn(Moves, validLevelMoves, validTMHM, validTutor); else // Everything else res = parseMovesRegular(Moves, validLevelMoves, validTMHM, validTutor, new int[0], game); @@ -2086,7 +2100,105 @@ private CheckResult[] verifyMoves(GameVersion game = GameVersion.Any) return res; } - private CheckResult[] verifyMovesEggPreRelearn(int[] Moves, List[] validLevelMoves, List[] validTMHM, List[] validTutor) + private GameVersion[] getBaseMovesIsEggGames() + { + GameVersion[] Games = { }; + switch (pkm.GenNumber) + { + case 1: + case 2: + Games = new[] { GameVersion.GS, GameVersion.C }; + break; + case 3: + switch((GameVersion)pkm.Version) + { + case GameVersion.R: + case GameVersion.S: + Games = new[] { GameVersion.RS}; + break; + case GameVersion.E: + Games = new[] { GameVersion.E }; + break; + case GameVersion.FR: + case GameVersion.LG: + Games = new[] { GameVersion.FRLG }; + break; + } + break; + case 4: + switch ((GameVersion)pkm.Version) + { + case GameVersion.D: + case GameVersion.P: + Games = new[] { GameVersion.DP }; + break; + case GameVersion.Pt: + Games = new[] { GameVersion.Pt }; + break; + case GameVersion.HG: + case GameVersion.SS: + Games = new[] { GameVersion.HGSS }; + break; + } + break; + case 5: + switch ((GameVersion)pkm.Version) + { + case GameVersion.B: + case GameVersion.W: + Games = new[] { GameVersion.BW }; + break; + case GameVersion.Pt: + Games = new[] { GameVersion.Pt }; + break; + case GameVersion.B2: + case GameVersion.W2: + Games = new[] { GameVersion.B2W2 }; + break; + } + break; + } + return Games; + } + private CheckResult[] verifyMovesIsEggPreRelearn(int[] Moves, int[] SpecialMoves, bool allowinherited) + { + CheckResult[] res = new CheckResult[4]; + var ValidSpecialMoves = SpecialMoves.Where(m => m > 0); + // Some games can have different egg movepools. Have to check all situations. + GameVersion[] Games = getBaseMovesIsEggGames(); + int splitctr = Legal.getSplitBreedGeneration(pkm).Contains(pkm.Species) ? 1 : 0; + foreach (var ver in Games) + { + for (int i = 0; i <= splitctr; i++) + { + var baseEggMoves = Legal.getBaseEggMoves(pkm, i, ver, pkm.GenNumber < 4 ? 5 : 1)?.ToList() ?? new List(); + var InheritedLvlMoves = Legal.getBaseEggMoves(pkm, i, ver, 100) ?? new List(); + var EggMoves = Legal.getEggMoves(pkm, ver)?.ToList() ?? new List(); + var InheritedTutorMoves = (ver == GameVersion.C) ? Legal.getTutorMoves(pkm, pkm.Species, pkm.AltForm, false, 2) : new int[0]; + // Only TM Hm moves from the source game of the egg, not any other games from the same generation + var InheritedTMHMMoves = Legal.getTMHM(pkm, pkm.Species, pkm.AltForm, pkm.GenNumber, ver, false); + InheritedLvlMoves = InheritedLvlMoves.Except(baseEggMoves); + + if (pkm.Format > 2 || SpecialMoves.Any()) + { + // For gen 2 is not possible to difference normal eggs from event eggs + // If there is no special moves assume normal egg + res = verifyPreRelearnEggBase(Moves, baseEggMoves, EggMoves, InheritedLvlMoves, InheritedTMHMMoves, InheritedTutorMoves, ValidSpecialMoves, allowinherited, ver); + if (res.All(r => r.Valid)) // moves is satisfactory + return res; + } + if(pkm.Format == 2) + { + // For gen 2 if does not match special egg check for normal egg too + res = verifyPreRelearnEggBase(Moves, baseEggMoves, EggMoves, InheritedLvlMoves, InheritedTMHMMoves, InheritedTutorMoves, new List(), true, ver); + if (res.All(r => r.Valid)) // moves is satisfactory + return res; + } + } + } + return res; + } + private CheckResult[] verifyMovesWasEggPreRelearn(int[] Moves, List[] validLevelMoves, List[] validTMHM, List[] validTutor) { CheckResult[] res = new CheckResult[4]; @@ -2098,8 +2210,8 @@ private CheckResult[] verifyMovesEggPreRelearn(int[] Moves, List[] validLev case 2: Games = new[] { GameVersion.GS, GameVersion.C }; break; - case 3: - Games = new[] { GameVersion.RS, GameVersion.E, GameVersion.FRLG }; + case 3: // Generation 3 does not overwrite source game after pokemon hatched + Games = getBaseMovesIsEggGames(); break; case 4: Games = new[] { GameVersion.DP, GameVersion.Pt, GameVersion.HGSS }; @@ -2108,7 +2220,6 @@ private CheckResult[] verifyMovesEggPreRelearn(int[] Moves, List[] validLev Games = new[] { GameVersion.BW, GameVersion.B2W2 }; break; } - int splitctr = Legal.SplitBreed.Contains(pkm.Species) ? 1 : 0; foreach (var ver in Games) { @@ -2122,6 +2233,22 @@ private CheckResult[] verifyMovesEggPreRelearn(int[] Moves, List[] validLev } return res; } + private CheckResult[] verifyMovesEggPreRelearnEvent(int[] Moves) + { + foreach (MysteryGift mg in EventGiftMatch) + { + int[] SpecialMoves = mg.Moves; + CheckResult[] res = verifyMovesIsEggPreRelearn(Moves, SpecialMoves, false); + if (res.Any(r => !r.Valid)) + continue; + + // Match Found + EncounterMatch = mg; + return res; + } + // no Mystery Gifts matched + return verifyMovesIsEggPreRelearn(Moves, new int[0], false); + } private CheckResult[] parseMovesSketch(int[] Moves) { CheckResult[] res = new CheckResult[4]; @@ -2225,8 +2352,6 @@ private CheckResult[] parseMoves(int[] moves, List[] learn, int[] relearn, res[m] = new CheckResult(Severity.Valid, native ? V173 : string.Format(V332, gen), CheckIdentifier.Move); else if (gen == pkm.GenNumber && special.Contains(moves[m])) res[m] = new CheckResult(Severity.Valid, V175, CheckIdentifier.Move); - else if (gen == pkm.GenNumber && baseegg.Contains(moves[m])) - res[m] = new CheckResult(Severity.Valid, V177, CheckIdentifier.Move); if (res[m] == null) continue; @@ -2236,6 +2361,22 @@ private CheckResult[] parseMoves(int[] moves, List[] learn, int[] relearn, if (gen == generations.Last()) { + // Check base egg moves after all the moves but just before egg moves to different it from normal level up moves + // Also check if the base egg moves is a non tradeback move + for (int m = 0; m < 4; m++) + { + if (baseegg.Contains(moves[m])) + { + if (IsGen2Pkm && Gen1MovesLearned.Any() && moves[m] > Legal.MaxMoveID_1) + { + res[m] = new CheckResult(Severity.Invalid, V334, CheckIdentifier.Move); + MixedGen1NonTradebackGen2 = true; + } + else + res[m] = new CheckResult(Severity.Valid, V345, CheckIdentifier.Move); + } + } + // Check egg moves after all the generations and all the moves, every move that can be learned in another source should have preference // the moves that can only be learned from egg moves should in the future check if the move combinations can be breed in gens 2 to 5 for (int m = 0; m < 4; m++) @@ -2461,7 +2602,7 @@ private CheckResult[] verifyRelearnEgg() } bool checkAllGames = pkm.WasTradedEgg; - bool splitBreed = Legal.SplitBreed.Contains(pkm.Species); + bool splitBreed = Legal.getSplitBreedGeneration(pkm).Contains(pkm.Species); int iterate = (checkAllGames ? Games.Length : 1) * (splitBreed ? 2 : 1); for (int i = 0; i < iterate; i++) @@ -2537,6 +2678,94 @@ private CheckResult[] verifyRelearnEggBase(int[] RelearnMoves, int skipOption, G return res; } + /* Similar to verifyRelearnEgg but in pre relearn generation is the moves what should match the expected order + but only if the pokemon is inside an egg */ + private CheckResult[] verifyPreRelearnEggBase(int[] Moves, List baseMoves, List eggmoves, IEnumerable lvlmoves, IEnumerable tmhmmoves, IEnumerable tutormoves, IEnumerable specialmoves, bool AllowInherited, GameVersion ver) + { + CheckResult[] res = new CheckResult[4]; + + // Obtain level1 moves + int baseCt = baseMoves.Count; + if (baseCt > 4) baseCt = 4; + + // Obtain Inherited moves + var inherited = Moves.Where(m => m != 0 && (!baseMoves.Contains(m) || specialmoves.Contains(m) || eggmoves.Contains(m) || lvlmoves.Contains(m) || tmhmmoves.Contains(m) || tutormoves.Contains(m))).ToList(); + int inheritCt = inherited.Count; + + // Get required amount of base moves + int unique = baseMoves.Concat(inherited).Distinct().Count(); + int reqBase = inheritCt == 4 || baseCt + inheritCt > 4 ? 4 - inheritCt : baseCt; + if (Moves.Where(m => m != 0).Count() < Math.Min(4, baseMoves.Count)) + reqBase = Math.Min(4, unique); + + var em = string.Empty; + var moveoffset = 0; + // Check if the required amount of Base Egg Moves are present. + for (int i = moveoffset; i < reqBase; i++) + { + if (baseMoves.Contains(Moves[i])) + res[i] = new CheckResult(Severity.Valid, V179, CheckIdentifier.Move); + else + { + // mark remaining base egg moves missing + for (int z = i; z < reqBase; z++) + res[z] = new CheckResult(Severity.Invalid, V180, CheckIdentifier.Move); + + // provide the list of suggested base moves for the last required slot + em = string.Join(", ", baseMoves.Select(m => m >= movelist.Length ? V190 : movelist[m])); + break; + } + } + + moveoffset += reqBase; + + // Check also if the required amount of Special Egg Moves are present, ir are after base moves + for (int i = moveoffset; i < moveoffset + specialmoves.Count(); i++) + { + if (specialmoves.Contains(Moves[i])) + res[i] = new CheckResult(Severity.Valid, V333, CheckIdentifier.Move); + else + { + // mark remaining special egg moves missing + for (int z = i; z < moveoffset + specialmoves.Count(); z++) + res[z] = new CheckResult(Severity.Invalid, V342, CheckIdentifier.Move); + + // provide the list of suggested base moves and specia moves for the last required slot + if (!string.IsNullOrEmpty(em)) em += ","; + else + em = string.Join(", ", baseMoves.Select(m => m >= movelist.Length ? V190 : movelist[m])) + ","; + em += string.Join(", ", specialmoves.Select(m => m >= movelist.Length ? V190 : movelist[m])); + break; + } + } + + if(!string.IsNullOrEmpty(em)) + res[reqBase > 0 ? reqBase - 1 : 0].Comment = string.Format(Environment.NewLine + V343, em); + // Non-Base moves that can magically appear in the regular movepool + if (pkm.GenNumber >=3 && Legal.LightBall.Contains(pkm.Species)) + eggmoves.Add(344); + + // Inherited moves appear after the required base moves. + var AllowInheritedSeverity = AllowInherited ? Severity.Valid : Severity.Invalid; + for (int i = reqBase + specialmoves.Count(); i < 4; i++) + { + if (Moves[i] == 0) // empty + res[i] = new CheckResult(Severity.Valid, V167, CheckIdentifier.Move); + else if (eggmoves.Contains(Moves[i])) // inherited egg move + res[i] = new CheckResult(AllowInheritedSeverity, AllowInherited ? V344 : V341, CheckIdentifier.Move); + else if (lvlmoves.Contains(Moves[i])) // inherited lvl moves + res[i] = new CheckResult(AllowInheritedSeverity, AllowInherited ? V345 : V347, CheckIdentifier.Move); + else if (tmhmmoves.Contains(Moves[i])) // inherited TMHM moves + res[i] = new CheckResult(AllowInheritedSeverity, AllowInherited ? V349 : V350, CheckIdentifier.Move); + else if (tutormoves.Contains(Moves[i])) // inherited tutor moves + res[i] = new CheckResult(AllowInheritedSeverity, AllowInherited ? V346 : V348, CheckIdentifier.Move); + else // not inheritable, flag + res[i] = new CheckResult(Severity.Invalid, V340, CheckIdentifier.Move); + } + + return res; + } + private void verifyNoEmptyDuplicates(int[] Moves, CheckResult[] res) { bool emptySlot = false; diff --git a/PKHeX/Legality/Core.cs b/PKHeX/Legality/Core.cs index 0bfed17ea..0f73d55ce 100644 --- a/PKHeX/Legality/Core.cs +++ b/PKHeX/Legality/Core.cs @@ -121,7 +121,8 @@ private static EncounterStatic[] getStaticEncounters(GameVersion Game) default: return null; } - return table?.Where(s => s.Version == GameVersion.Any || s.Version == Game).ToArray(); + // Temp until wwwwwwzx Contains extension is merged into the master branch + return table?.Where(s => s.Version == GameVersion.Any || s.Version == Game || s.Version == GameVersion.RSBOX).ToArray(); } private static EncounterArea[] getEncounterTables(GameVersion Game) { @@ -566,12 +567,12 @@ private static EncounterArea[] getTables2(GameVersion Version) // Moves internal static void RemoveFutureMoves(PKM pkm, DexLevel[][] evoChains, ref List[] validLevelMoves, ref List[] validTMHM, ref List[] validTutor) { + var FutureMoves = new List(); + FutureMoves.AddRange(validLevelMoves[pkm.Format]); + FutureMoves.AddRange(validTMHM[pkm.Format]); + FutureMoves.AddRange(validTutor[pkm.Format]); if (pkm.Format >= 3) { - var FutureMoves = new List(); - FutureMoves.AddRange(validLevelMoves[pkm.Format]); - FutureMoves.AddRange(validTMHM[pkm.Format]); - FutureMoves.AddRange(validTutor[pkm.Format]); if (pkm.VC1) { validLevelMoves[1]?.RemoveAll(x => FutureMoves.Contains(x)); @@ -608,10 +609,9 @@ internal static void RemoveFutureMoves(PKM pkm, DexLevel[][] evoChains, ref List else { int tradeback = pkm.Format == 2 ? 1 : 2; - var formatmoves = validLevelMoves[pkm.Format].Concat(validTMHM[pkm.Format]).Concat(validTutor[pkm.Format]).ToList(); - validLevelMoves[tradeback]?.RemoveAll(x => formatmoves.Contains(x)); - validTMHM[tradeback]?.RemoveAll(x => formatmoves.Contains(x)); - validTutor[tradeback]?.RemoveAll(x => formatmoves.Contains(x)); + validLevelMoves[tradeback]?.RemoveAll(x => FutureMoves.Contains(x)); + validTMHM[tradeback]?.RemoveAll(x => FutureMoves.Contains(x)); + validTutor[tradeback]?.RemoveAll(x => FutureMoves.Contains(x)); } } internal static List[] getValidMovesAllGens(PKM pkm, DexLevel[][] evoChains, bool LVL = true, bool Tutor = true, bool Machine = true, bool MoveReminder = true, bool RemoveTransferHM = true) @@ -1372,6 +1372,25 @@ internal static int[] getWildBalls(PKM pkm) return null; } } + + internal static int[] getSplitBreedGeneration(PKM pkm) + { + return getSplitBreedGeneration(pkm.GenNumber); + } + internal static int[] getSplitBreedGeneration(int generation) + { + switch (generation) + { + case 1: return new int[0]; + case 2: return new int[0]; + case 3: return SplitBreed_3; + case 4: return SplitBreed; + case 5: return SplitBreed; + case 6: return SplitBreed; + case 7: return SplitBreed; + default: return new int[0]; + } + } internal static int getMaxSpeciesOrigin(PKM pkm) { if (pkm.Format == 1 || pkm.VC1) // Gen1 VC could not trade with gen 2 yet @@ -1473,7 +1492,7 @@ internal static bool getEvolutionValid(PKM pkm) var curr = getValidPreEvolutions(pkm); var poss = getValidPreEvolutions(pkm, 100, skipChecks: true); - if (SplitBreed.Contains(getBaseSpecies(pkm, 1))) + if (getSplitBreedGeneration(pkm).Contains(getBaseSpecies(pkm, 1))) return curr.Count() >= poss.Count() - 1; return curr.Count() >= poss.Count(); } @@ -1646,7 +1665,7 @@ internal static int getMaxLevelGeneration(PKM pkm, int generation) if (pkm.Species == 700 && generation == 5) return pkm.CurrentLevel - 1; - if (pkm.Gen3 && pkm.Format > 4 && pkm.Met_Level == pkm.CurrentLevel && FutureEvolutionsGen3_LevelUp.Contains(pkm.Species)) + if (pkm.Gen3 && pkm.Format > 4 && pkm.Met_Level == pkm.CurrentLevel && FutureEvolutionsGen3_LevelUpGen4.Contains(pkm.Species)) return pkm.Met_Level - 1; if (!pkm.HasOriginalMetLocation) @@ -1656,6 +1675,8 @@ internal static int getMaxLevelGeneration(PKM pkm, int generation) } internal static int getMinLevelEncounter(PKM pkm) { + if (pkm.Format == 3 && pkm.WasEgg) + return 5; return pkm.HasOriginalMetLocation ? pkm.Met_Level : getMaxLevelGeneration(pkm); } internal static int getMinLevelGeneration(PKM pkm) @@ -2498,7 +2519,120 @@ private static IEnumerable getEggMoves(PKM pkm, int species, int formnum, G return new List(); } } - private static IEnumerable getTutorMoves(PKM pkm, int species, int form, bool specialTutors, int generation) + internal static IEnumerable getTMHM(PKM pkm, int species, int form, int generation, GameVersion Version = GameVersion.Any, bool RemoveTransferHM = true) + { + List moves = new List(); + int index; + switch (generation) + { + case 1: + index = PersonalTable.RB.getFormeIndex(species, 0); + if (index == 0) + return moves; + var pi_rb = (PersonalInfoG1)PersonalTable.RB[index]; + var pi_y = (PersonalInfoG1)PersonalTable.Y[index]; + moves.AddRange(TMHM_RBY.Where((t, m) => pi_rb.TMHM[m])); + moves.AddRange(TMHM_RBY.Where((t, m) => pi_y.TMHM[m])); + break; + case 2: + index = PersonalTable.C.getFormeIndex(species, 0); + if (index == 0) + return moves; + var pi_c = (PersonalInfoG2)PersonalTable.C[index]; + moves.AddRange(TMHM_GSC.Where((t, m) => pi_c.TMHM[m])); + if (Version == GameVersion.Any) + goto case 1; + break; + case 3: + index = PersonalTable.E.getFormeIndex(species, 0); + var pi_e = PersonalTable.E[index]; + moves.AddRange(TM_3.Where((t, m) => pi_e.TMHM[m])); + if (!RemoveTransferHM || pkm.Format == 3) // HM moves must be removed for 3->4, only give if current format. + moves.AddRange(HM_3.Where((t, m) => pi_e.TMHM[m + 50])); + break; + case 4: + index = PersonalTable.HGSS.getFormeIndex(species, 0); + if (index == 0) + return moves; + var pi_hgss = PersonalTable.HGSS[index]; + var pi_dppt = PersonalTable.Pt[index]; + moves.AddRange(TM_4.Where((t, m) => pi_hgss.TMHM[m])); + // The combination of both these moves is illegal, it should be checked that the pokemon only learn one + // except if it can learn any of these moves in gen 5 or later + if (Version == GameVersion.Any || Version == GameVersion.DP || Version == GameVersion.D || Version == GameVersion.P || Version == GameVersion.Pt) + { + if (RemoveTransferHM && pkm.Format > 4) + { + if (pi_dppt.TMHM[96]) + moves.Add(432); // Defog + } + else + { + moves.AddRange(HM_DPPt.Where((t, m) => pi_dppt.TMHM[m + 92])); + } + } + if (Version == GameVersion.Any || Version == GameVersion.HGSS || Version == GameVersion.HG || Version == GameVersion.SS) + { + if (RemoveTransferHM && pkm.Format > 4) + { + if (pi_hgss.TMHM[96]) + moves.Add(432); // Defog + } + else + { + moves.AddRange(HM_HGSS.Where((t, m) => pi_dppt.TMHM[m + 92])); + } + } + break; + case 5: + index = PersonalTable.B2W2.getFormeIndex(species, 0); + if (index == 0) + return moves; + + var pi_bw = PersonalTable.B2W2[index]; + moves.AddRange(TMHM_BW.Where((t, m) => pi_bw.TMHM[m])); + break; + case 6: + switch (Version) + { + case GameVersion.Any: // Start at the top, hit every table + case GameVersion.X: + case GameVersion.Y: + case GameVersion.XY: + { + index = PersonalTable.XY.getFormeIndex(species, form); + if (index == 0) + return moves; + + PersonalInfo pi_xy = PersonalTable.XY[index]; + moves.AddRange(TMHM_XY.Where((t, m) => pi_xy.TMHM[m])); + + if (Version == GameVersion.Any) // Fall Through + goto case GameVersion.ORAS; + break; + } + case GameVersion.AS: + case GameVersion.OR: + case GameVersion.ORAS: + { + index = PersonalTable.AO.getFormeIndex(species, form); + if (index == 0) + return moves; + PersonalInfo pi_oras = PersonalTable.AO[index]; + moves.AddRange(TMHM_AO.Where((t, m) => pi_oras.TMHM[m])); + break; + } + } + break; + case 7: + index = PersonalTable.SM.getFormeIndex(species, form); + PersonalInfo pi_sm = PersonalTable.SM.getFormeEntry(species, form); + moves.AddRange(TMHM_SM.Where((t, m) => pi_sm.TMHM[m])); + break; + } + return moves.Distinct(); + } + internal static IEnumerable getTutorMoves(PKM pkm, int species, int form, bool specialTutors, int generation) { List moves = new List(); PersonalInfo info; diff --git a/PKHeX/Legality/LegalityCheckStrings.cs b/PKHeX/Legality/LegalityCheckStrings.cs index ba283e673..ecee05022 100644 --- a/PKHeX/Legality/LegalityCheckStrings.cs +++ b/PKHeX/Legality/LegalityCheckStrings.cs @@ -52,6 +52,10 @@ public static class LegalityCheckStrings public static string V331 { get; set; } = "Learned by TM/HM in generation {0}."; public static string V332 { get; set; } = "Learned by Move Tutor in generation {0}."; public static string V333 { get; set; } = "Event Egg Move."; + public static string V344 { get; set; } = "Inherited egg move."; + public static string V345 { get; set; } = "Inherited move learned by Level-up."; + public static string V346 { get; set; } = "Inherited tutor move."; + public static string V349 { get; set; } = "Inherited TM/HM move."; #endregion @@ -325,7 +329,14 @@ public static class LegalityCheckStrings public static string V337 {get; set;} = "Event Egg Move. Incompatible with normal egg moves."; public static string V338 {get; set;} = "Defog and whirpool. One of the two moves should have been removed before transfered to generation 5."; public static string V339 {get; set;} = "Generation {0} HM. Should have been removed before transfered to generation {1}."; + public static string V340 {get; set;} = "Not an expected egg move."; + public static string V341 {get; set;} = "Egg Move.Not expected in an event egg."; + public static string V342 {get; set;} = "Event egg move missing."; + public static string V343 {get; set;} = "Expected the following Moves: { 0}"; + public static string V347 {get; set;} = "Inherited move learned by Level-up.Not expected in an event egg."; + public static string V348 {get; set;} = "Inherited tutor move. Not expected in an event egg."; + public static string V350 {get; set;} = "Inherited TM/HM move. Not expected in an event egg."; #endregion - } + } } diff --git a/PKHeX/Legality/Tables3.cs b/PKHeX/Legality/Tables3.cs index d3de454f8..69e4cd50f 100644 --- a/PKHeX/Legality/Tables3.cs +++ b/PKHeX/Legality/Tables3.cs @@ -10,7 +10,14 @@ public static partial class Legal internal const int MaxItemID_3 = 374; internal const int MaxAbilityID_3 = 77; internal const int MaxBallID_3 = 0xC; - + + public static readonly int[] SplitBreed_3 = + { + // Incense + 183, 184, // Marill + 202, // Wobbuffet + }; + #region RS internal static readonly ushort[] Pouch_Items_RS = { 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, 83, 84, 85, 86, 93, 94, 95, 96, 97, 98, 103, 104, 106, 107, 108, 109, 110, 111, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 254, 255, 256, 257, 258 @@ -89,7 +96,7 @@ public static partial class Legal 407,424,429,430,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,700 }; - internal static readonly int[] FutureEvolutionsGen3_LevelUp = + internal static readonly int[] FutureEvolutionsGen3_LevelUpGen4 = { 424, 461, 462, 463, 465, 469, 470, 471, 472, 473, 476 }; diff --git a/PKHeX/Resources/text/en/LegalityCheckStrings_en.txt b/PKHeX/Resources/text/en/LegalityCheckStrings_en.txt index 0672342f1..d706d8f3e 100644 --- a/PKHeX/Resources/text/en/LegalityCheckStrings_en.txt +++ b/PKHeX/Resources/text/en/LegalityCheckStrings_en.txt @@ -23,6 +23,10 @@ V177 = Learned by Level-up. V330 = Learned by Level-up in generation {0}. V332 = Learned by Move Tutor in generation {0}. V333 = Event Egg Move. +V344 = Inherited egg move. +V345 = Inherited move learned by Level-up. +V346 = Inherited tutor move. +V349 = Inherited TM/HM move. V203 = Genderless Pokémon should not have a gender. V201 = Encryption Constant is not set. V204 = Held item is unreleased. @@ -259,4 +263,11 @@ V335 = Generation 1 exclusive move. Incompatible with Non-tradeback egg moves. V336 = Egg Move. Incompatible with event egg moves. V337 = Event Egg Move. Incompatible with normal egg moves. V338 = Defog and whirpool. One of the two moves should have been removed before transfered to generation 5. -V339 = Generation {0} HM. Should have been removed before transfered to generation {1}. \ No newline at end of file +V339 = Generation {0} HM. Should have been removed before transfered to generation {1}. +V340 = Not an expected egg move. +V341 = Inherited Egg Move. Not expected in an event egg. +V342 = Event egg move missing. +V343 = Expected the following Moves: {0} +V347 = Inherited move learned by Level-up. Not expected in an event egg. +V348 = Inherited tutor move. Not expected in an event egg. +V350 = Inherited TM/HM move. Not expected in an event egg. \ No newline at end of file