From f631cbbecd428672a241060bdbcf623b2846d25c Mon Sep 17 00:00:00 2001 From: Kurt Date: Thu, 31 Dec 2020 15:51:06 -0800 Subject: [PATCH] Generate gen2 eggs via gen2 method, ignore gen1 versions For searching, only return versions compatible with the save file Don't bother filtering out BU for Japanese-only. --- .../Generator/EncounterEggGenerator.cs | 13 +++++++++--- .../Generator/EncounterMovesetGenerator.cs | 13 ++++++++---- PKHeX.Core/PKM/Searching/SearchSettings.cs | 20 ++++++++++++------- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/PKHeX.Core/Legality/Encounters/Generator/EncounterEggGenerator.cs b/PKHeX.Core/Legality/Encounters/Generator/EncounterEggGenerator.cs index a77a2359c..d6c5d8ecf 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/EncounterEggGenerator.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/EncounterEggGenerator.cs @@ -7,7 +7,6 @@ namespace PKHeX.Core { public static class EncounterEggGenerator { - // EncounterEgg public static IEnumerable GenerateEggs(PKM pkm, bool all = false) { var table = EvolutionTree.GetEvolutionTree(pkm, Math.Max(2, pkm.Format)); @@ -98,9 +97,17 @@ private static bool HasOtherGamePair(GameVersion ver) /// internal static class EncounterEggGenerator2 { - public static IEnumerable GenerateEggs(PKM pkm, IReadOnlyList chain) + public static IEnumerable GenerateEggs(PKM pkm, bool all = false) { - var canBeEgg = GetCanBeEgg(pkm); + var table = EvolutionTree.GetEvolutionTree(pkm, 2); + int maxSpeciesOrigin = GetMaxSpeciesOrigin(2); + var evos = table.GetValidPreEvolutions(pkm, maxLevel: 100, maxSpeciesOrigin: maxSpeciesOrigin, skipChecks: true); + return GenerateEggs(pkm, evos, all); + } + + public static IEnumerable GenerateEggs(PKM pkm, IReadOnlyList chain, bool all = false) + { + var canBeEgg = all || GetCanBeEgg(pkm); if (!canBeEgg) yield break; diff --git a/PKHeX.Core/Legality/Encounters/Generator/EncounterMovesetGenerator.cs b/PKHeX.Core/Legality/Encounters/Generator/EncounterMovesetGenerator.cs index e22056556..82a349820 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/EncounterMovesetGenerator.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/EncounterMovesetGenerator.cs @@ -191,7 +191,7 @@ private static IEnumerable GetPossibleOfType(PKM pk, IReadOnlyCo { return type switch { - EncounterOrder.Egg => GetEggs(pk, needs, version), + EncounterOrder.Egg => GetEggs(pk, needs, chain, version), EncounterOrder.Mystery => GetGifts(pk, needs, chain), EncounterOrder.Static => GetStatic(pk, needs, chain), EncounterOrder.Trade => GetTrades(pk, needs, chain), @@ -205,14 +205,19 @@ private static IEnumerable GetPossibleOfType(PKM pk, IReadOnlyCo /// /// Rough Pokémon data which contains the requested species, gender, and form. /// Moves which cannot be taught by the player. + /// Origin possible evolution chain /// Specific version to iterate for. Necessary for retrieving possible Egg Moves. /// A consumable list of possible encounters. - private static IEnumerable GetEggs(PKM pk, IReadOnlyCollection needs, GameVersion version) + private static IEnumerable GetEggs(PKM pk, IReadOnlyCollection needs, IReadOnlyList chain, GameVersion version) { if (GameVersion.CXD.Contains(version) || GameVersion.Gen7b.Contains(version)) yield break; // no eggs from these games - - var eggs = EncounterEggGenerator.GenerateEggs(pk, all: true); + int gen = version.GetGeneration(); + if (gen < 2) + yield break; + var eggs = gen == 2 + ? EncounterEggGenerator2.GenerateEggs(pk, chain, all: true) + : EncounterEggGenerator.GenerateEggs(pk, chain, all: true); foreach (var egg in eggs) { if (needs.Count == 0) diff --git a/PKHeX.Core/PKM/Searching/SearchSettings.cs b/PKHeX.Core/PKM/Searching/SearchSettings.cs index b5c6f5b65..b784bdd85 100644 --- a/PKHeX.Core/PKM/Searching/SearchSettings.cs +++ b/PKHeX.Core/PKM/Searching/SearchSettings.cs @@ -141,14 +141,20 @@ public IReadOnlyList GetVersions(SaveFile sav, GameVersion fallback { if (Version > 0) return new[] {(GameVersion) Version}; - if (Generation != 0) - { - return fallback.GetGeneration() == Generation - ? GameUtil.GetVersionsWithinRange(sav, Generation).ToArray() - : GameUtil.GameVersions; - } - return GameUtil.GameVersions; + return Generation switch + { + 1 when !ParseSettings.AllowGen1Tradeback => new[] {GameVersion.RD, GameVersion.BU, GameVersion.GN, GameVersion.YW}, + 2 when sav is SAV2 {Korean: true} => new[] {GameVersion.GD, GameVersion.SV}, + 1 or 2 => new[] + { + GameVersion.RD, GameVersion.BU, GameVersion.GN, GameVersion.YW, + GameVersion.GD, GameVersion.SV, GameVersion.C + }, + + _ when fallback.GetGeneration() == Generation => GameUtil.GetVersionsWithinRange(sav, Generation).ToArray(), + _ => GameUtil.GameVersions, + }; } private static GameVersion GetFallbackVersion(ITrainerInfo sav)