diff --git a/PKHeX.Core/Legality/Encounters/EncounterGenerator.cs b/PKHeX.Core/Legality/Encounters/EncounterGenerator.cs index ec023ebdb..4093a3d01 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterGenerator.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterGenerator.cs @@ -9,8 +9,7 @@ public static class EncounterGenerator { public static IEnumerable getEncounters(PKM pkm, LegalInfo info) { - int Generation = pkm.GenNumber; - switch (Generation) + switch (info.Generation) { case 1: case 2: @@ -18,10 +17,13 @@ public static IEnumerable getEncounters(PKM pkm, LegalInfo info) yield return enc; yield break; case 3: + // info.PIDIV = MethodFinder.Analyze(pkm); + foreach (var enc in getEncounters3(pkm, info)) + yield return enc; + yield break; case 4: // info.PIDIV = MethodFinder.Analyze(pkm); - // todo: filter PIDIV - foreach (var enc in getEncounters34(pkm)) + foreach (var enc in getEncounters4(pkm, info)) yield return enc; yield break; default: @@ -46,6 +48,22 @@ private static IEnumerable getEncounters12(PKM pkm, LegalInfo in yield return z.Encounter; } } + private static IEnumerable getEncounters3(PKM pkm, LegalInfo info) + { + foreach (var z in GenerateRawEncounters3(pkm)) + { + // todo: pidiv filtering + yield return z; + } + } + private static IEnumerable getEncounters4(PKM pkm, LegalInfo info) + { + foreach (var z in GenerateRawEncounters4(pkm)) + { + // todo: pidiv filtering + yield return z; + } + } private static IEnumerable GenerateRawEncounters12(PKM pkm, GameVersion game) { var gen = game == GameVersion.GSC ? 2 : 1; @@ -118,14 +136,6 @@ private static IEnumerable GenerateFilteredEncounters(PKM pkm) foreach (var z in filter(GenerateRawEncounters12(pkm, GameVersion.GSC))) yield return z; } - private static IEnumerable getEncounters34(PKM pkm) - { - return GenerateRawEncounters(pkm); - } - private static IEnumerable GenerateFilteredEncountersPIDIV(PKM pkm) - { - yield break; - } private static IEnumerable GenerateRawEncounters(PKM pkm) { int ctr = 0; @@ -136,41 +146,95 @@ private static IEnumerable GenerateRawEncounters(PKM pkm) if (ctr != 0) yield break; } - int gen = pkm.GenNumber; - bool wasEvent = pkm.WasEvent || pkm.WasEventEgg || gen == 3; // egg events? - if (wasEvent) + if (pkm.WasEvent || pkm.WasEventEgg) { foreach (var z in getValidGifts(pkm)) { yield return z; ++ctr; } if (ctr != 0) yield break; } - bool gen4egg = gen >= 4 && pkm.WasEgg; - if (gen4egg) + if (pkm.WasEgg) { foreach (var z in generateEggs(pkm)) yield return z; + yield break; } - bool gen3egg = gen <= 3; foreach (var z in getValidStaticEncounter(pkm)) { yield return z; ++ctr; } - if (ctr != 0 && !gen3egg) yield break; + if (ctr != 0) yield break; foreach (var z in getValidFriendSafari(pkm)) { yield return z; ++ctr; } - if (ctr != 0 && !gen3egg) yield break; + if (ctr != 0) yield break; foreach (var z in getValidWildEncounters(pkm)) { yield return z; ++ctr; } - if (ctr != 0 && !gen3egg) yield break; + if (ctr != 0) yield break; foreach (var z in getValidEncounterTrade(pkm)) { yield return z; ++ctr; } // if (ctr != 0) yield break; - - if (gen3egg) + } + private static IEnumerable GenerateRawEncounters4(PKM pkm) + { + int ctr = 0; + bool wasEvent = pkm.WasEvent || pkm.WasEventEgg; // egg events? + if (wasEvent) + { + foreach (var z in getValidGifts(pkm)) + { yield return z; ++ctr; } + if (ctr != 0) yield break; + } + if (pkm.WasEgg) { foreach (var z in generateEggs(pkm)) - yield return z; + { yield return z; ++ctr; } + if (ctr != 0) yield break; } + + bool safariSport = pkm.Ball == 0x05 || pkm.Ball == 0x18; // never static encounters + if (!safariSport) + foreach (var z in getValidStaticEncounter(pkm)) + { yield return z; ++ctr; } + if (ctr != 0) yield break; + foreach (var z in getValidFriendSafari(pkm)) + { yield return z; ++ctr; } + if (ctr != 0) yield break; + foreach (var z in getValidWildEncounters(pkm)) + { yield return z; ++ctr; } + if (ctr != 0) yield break; + foreach (var z in getValidEncounterTrade(pkm)) + { yield return z; ++ctr; } + if (ctr != 0) yield break; + + // do static encounters if they were deferred to end, spit out any possible encounters for invalid pkm + if (safariSport) + foreach (var z in getValidStaticEncounter(pkm)) + yield return z; + } + private static IEnumerable GenerateRawEncounters3(PKM pkm) + { + int ctr = 0; + foreach (var z in getValidGifts(pkm)) + { yield return z; ++ctr; } + if (ctr != 0) yield break; + + bool safari = pkm.Ball == 0x05; // never static encounters + if (!safari) + foreach (var z in getValidStaticEncounter(pkm)) + yield return z; + foreach (var z in getValidFriendSafari(pkm)) + yield return z; + foreach (var z in getValidWildEncounters(pkm)) + yield return z; + foreach (var z in getValidEncounterTrade(pkm)) + yield return z; + + // do static encounters if they were deferred to end, spit out any possible encounters for invalid pkm + if (safari) + foreach (var z in getValidStaticEncounter(pkm)) + yield return z; + + foreach (var z in generateEggs(pkm)) + yield return z; } // EncounterStatic @@ -328,7 +392,7 @@ private static IEnumerable getValidWildEncounters(PKM pkm, GameVe var deferred = new List(); foreach (EncounterSlot slot in s) { - if (slot.Species == 235 && species != 235 && !getWurmpleEvoValid(pkm)) { } // bad wurmple evolution + if (slot.Species == 265 && species != 265 && !getWurmpleEvoValid(pkm)) { } // bad wurmple evolution else if (IsHidden ^ IsHiddenAbilitySlot(slot)) { } // ability mismatch else if (IsSafariBall ^ IsSafariSlot(slot.Type)) { } // Safari Zone only ball else if (IsSportsBall ^ slot.Type == SlotType.BugContest) { } // BCC only ball