From ebb4e2a56a04818278c2e33b1bfeb9b4ef3f4e80 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 14 Feb 2021 21:24:31 -0800 Subject: [PATCH] Defer curry mark static encounters, flag as invalid Closes #3001 as all marks that can be checked are checked. Promote trades above static encounters, as it's just met location. --- .../EncounterSlot/EncounterSlot8.cs | 6 ++- .../EncounterStatic/EncounterStatic8.cs | 10 ++++- .../ByGeneration/EncounterGenerator8.cs | 45 ++++++++++++------- PKHeX.Core/Legality/Verifiers/MarkVerifier.cs | 17 ++++--- 4 files changed, 51 insertions(+), 27 deletions(-) diff --git a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot8.cs b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot8.cs index 9704cccf1..6fd351e23 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot8.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterSlot/EncounterSlot8.cs @@ -57,12 +57,16 @@ public bool IsOverworldCorrelationCorrect(PKM pk) public override EncounterMatchRating GetMatchRating(PKM pkm) { + var rating = base.GetMatchRating(pkm); + if (rating != EncounterMatchRating.Match) + return rating; + var req = GetRequirement(pkm); return req switch { MustHave when !IsOverworldCorrelationCorrect(pkm) => EncounterMatchRating.Deferred, MustNotHave when IsOverworldCorrelationCorrect(pkm) => EncounterMatchRating.Deferred, - _ => base.GetMatchRating(pkm), + _ => EncounterMatchRating.Match, }; } } diff --git a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic8.cs b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic8.cs index 3ad964b19..436653f1d 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic8.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStatic8.cs @@ -74,11 +74,19 @@ public bool IsOverworldCorrelationCorrect(PKM pk) public override EncounterMatchRating GetMatchRating(PKM pkm) { + var rating = base.GetMatchRating(pkm); + if (rating != EncounterMatchRating.Match) + return rating; + var req = GetRequirement(pkm); bool correlation = IsOverworldCorrelationCorrect(pkm); if ((req == MustHave) != correlation) return EncounterMatchRating.Deferred; - return base.GetMatchRating(pkm); + + if (pkm is IRibbonSetMark8 {RibbonMarkCurry: true}) + return EncounterMatchRating.Deferred; + + return EncounterMatchRating.Match; } } diff --git a/PKHeX.Core/Legality/Encounters/Generator/ByGeneration/EncounterGenerator8.cs b/PKHeX.Core/Legality/Encounters/Generator/ByGeneration/EncounterGenerator8.cs index d41df231b..d562f0ac4 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/ByGeneration/EncounterGenerator8.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/ByGeneration/EncounterGenerator8.cs @@ -23,7 +23,6 @@ public static IEnumerable GetEncounters(PKM pkm) private static IEnumerable GetEncountersMainline(PKM pkm, IReadOnlyList chain) { - // Static Encounters can collide with wild encounters (close match); don't break if a Static Encounter is yielded. int ctr = 0; if (pkm.WasEvent || pkm.WasEventEgg) { @@ -42,36 +41,50 @@ private static IEnumerable GetEncountersMainline(PKM pkm, IReadO IEncounterable? deferred = null; IEncounterable? partial = null; + // Trades + if (pkm.Met_Location == Locations.LinkTrade6NPC) + { + foreach (var z in GetValidEncounterTrades(pkm, chain)) + { + var match = z.GetMatchRating(pkm); + switch (match) + { + case Match: yield return z; ++ctr; break; + case Deferred: deferred ??= z; break; + case PartialMatch: partial ??= z; break; + } + } + + if (ctr != 0) + { + if (deferred != null) + yield return deferred; + + if (partial != null) + yield return partial; + } + + yield break; + } + + // Static Encounters can collide with wild encounters (close match); don't break if a Static Encounter is yielded. foreach (var z in GetValidStaticEncounter(pkm, chain)) { var match = z.GetMatchRating(pkm); switch (match) { - case Match: yield return z; ++ctr; break; + case Match: yield return z; break; case Deferred: deferred ??= z; break; case PartialMatch: partial ??= z; break; } } - // if (ctr != 0) yield break; foreach (var z in GetValidWildEncounters(pkm, chain)) { var match = z.GetMatchRating(pkm); switch (match) { - case Match: yield return z; ++ctr; break; - case Deferred: deferred ??= z; break; - case PartialMatch: partial ??= z; break; - } - } - - if (ctr != 0) yield break; - foreach (var z in GetValidEncounterTrades(pkm, chain)) - { - var match = z.GetMatchRating(pkm); - switch (match) - { - case Match: yield return z; /*++ctr*/ break; + case Match: yield return z; break; case Deferred: deferred ??= z; break; case PartialMatch: partial ??= z; break; } diff --git a/PKHeX.Core/Legality/Verifiers/MarkVerifier.cs b/PKHeX.Core/Legality/Verifiers/MarkVerifier.cs index 0d4cb9019..6259b0af6 100644 --- a/PKHeX.Core/Legality/Verifiers/MarkVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/MarkVerifier.cs @@ -63,9 +63,9 @@ public static bool IsMarkValid(RibbonIndex mark, PKM pk, IEncounterable enc) return IsMarkAllowedAny(enc) && IsMarkAllowedSpecific(mark, pk, enc); } - public static bool IsMarkAllowedSpecific(RibbonIndex mark, PKM pk, IEncounterable _) => mark switch + public static bool IsMarkAllowedSpecific(RibbonIndex mark, PKM pk, IEncounterable x) => mark switch { - RibbonIndex.MarkCurry when !IsMarkAllowedCurry(pk) => false, + RibbonIndex.MarkCurry when !IsMarkAllowedCurry(pk, x) => false, RibbonIndex.MarkDestiny => false, _ => true }; @@ -81,16 +81,15 @@ public static bool IsMarkValid(RibbonIndex mark, PKM pk, IEncounterable enc) _ => true, }; - public static bool IsMarkAllowedCurry(ILocation enc, int ball = (int)Ball.Poke) => IsMarkAllowedCurry(enc.Location, ball); - public static bool IsMarkAllowedCurry(PKM pkm) => IsMarkAllowedCurry(pkm.Met_Location, pkm.Ball); - - public static bool IsMarkAllowedCurry(int met, int ball) + public static bool IsMarkAllowedCurry(PKM pkm, IEncounterable enc) { - if (EncounterArea8.IsWildArea(met)) + if (enc is not EncounterSlot8 s || !((EncounterArea8)s.Area).PermitCrossover) return false; - if ((uint) (ball - 2) > 2) // Poke,Great,Ultra only + + if (!EncounterArea8.IsWildArea(s.Location)) return false; - return true; + var ball = pkm.Ball; + return (uint)(ball - 2) <= 2; } private void VerifyAffixedRibbonMark(LegalityAnalysis data, IRibbonIndex m)