diff --git a/PKHeX.Core/Legality/Encounters/Information/EncounterDate.cs b/PKHeX.Core/Legality/Encounters/Information/EncounterDate.cs index 70f0abe40..2d1101c67 100644 --- a/PKHeX.Core/Legality/Encounters/Information/EncounterDate.cs +++ b/PKHeX.Core/Legality/Encounters/Information/EncounterDate.cs @@ -70,7 +70,7 @@ public static bool IsValidDate3DS(DateOnly date) /// public static bool IsValidDateSwitch(DateOnly date) { - if (date.Year is < 2000 or > 2050) + if (date.Year is < 2000 or > 2060) return false; return true; } diff --git a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup2.cs b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup2.cs index 6390e76cc..ba637d17e 100644 --- a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup2.cs +++ b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup2.cs @@ -38,7 +38,25 @@ public sealed class LearnGroup2 : ILearnGroup if (enc is EncounterEgg { Generation: Generation } egg) CheckEncounterMoves(result, current, egg); - return MoveResult.AllParsed(result); + bool vc1 = pk.VC1; + if (!vc1 && MoveResult.AllParsed(result)) + return true; + + // Uh-oh, not all moves are verified yet. + // To visit Gen1, we need to invalidate moves that can't be learned in Gen1 or re-learned in Gen2. + for (int i = 0; i < result.Length; i++) + { + if (current[i] <= Legal.MaxMoveID_1) + continue; + var move = result[i]; + if (!move.IsParsed) + continue; + var method = move.Info.Method; + if ((vc1 && move.Generation == 2) || method is LearnMethod.Initial || method.IsEggSource()) + result[i] = MoveResult.Unobtainable(); + } + + return false; } private static void CheckEncounterMoves(PKM pk, Span result, ReadOnlySpan current, IEncounterTemplate enc) diff --git a/PKHeX.Core/Legality/LearnSource/Verify/LearnVerifierHistory.cs b/PKHeX.Core/Legality/LearnSource/Verify/LearnVerifierHistory.cs index 3afbd592a..752ad3e39 100644 --- a/PKHeX.Core/Legality/LearnSource/Verify/LearnVerifierHistory.cs +++ b/PKHeX.Core/Legality/LearnSource/Verify/LearnVerifierHistory.cs @@ -32,7 +32,8 @@ public static void Verify(Span result, ReadOnlySpan current, MarkRelearnMoves(result, current, pk); // Knock off initial moves if available. - MarkSpecialMoves(result, current, enc, pk); + if (enc.Generation != 2) // Handle trade-backs in Gen2 separately. + MarkSpecialMoves(result, current, enc, pk); } // Iterate games to identify move sources. diff --git a/Tests/PKHeX.Core.Tests/Legality/Illegal/Gen2 Tradeback/0061 - Poliwhirl - 4B4A648BA093.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Gen2 Tradeback/0061 - Poliwhirl - 4B4A648BA093.pk7 new file mode 100644 index 000000000..39d878063 Binary files /dev/null and b/Tests/PKHeX.Core.Tests/Legality/Illegal/Gen2 Tradeback/0061 - Poliwhirl - 4B4A648BA093.pk7 differ diff --git a/Tests/PKHeX.Core.Tests/Legality/Illegal/Gen2 Tradeback/0149 - Dragonite - B1A1E209D2E0.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Gen2 Tradeback/0149 - Dragonite - B1A1E209D2E0.pk7 new file mode 100644 index 000000000..8ee95d4ff Binary files /dev/null and b/Tests/PKHeX.Core.Tests/Legality/Illegal/Gen2 Tradeback/0149 - Dragonite - B1A1E209D2E0.pk7 differ diff --git a/Tests/PKHeX.Core.Tests/Legality/Illegal/Gen2 Tradeback/0149 - Dragonite - D1C5E209D2E0.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Gen2 Tradeback/0149 - Dragonite - D1C5E209D2E0.pk7 new file mode 100644 index 000000000..db3934337 Binary files /dev/null and b/Tests/PKHeX.Core.Tests/Legality/Illegal/Gen2 Tradeback/0149 - Dragonite - D1C5E209D2E0.pk7 differ