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.
This commit is contained in:
Kurt 2021-02-14 21:24:31 -08:00
parent 927c83d660
commit ebb4e2a56a
4 changed files with 51 additions and 27 deletions

View file

@ -57,12 +57,16 @@ namespace PKHeX.Core
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,
};
}
}

View file

@ -74,11 +74,19 @@ namespace PKHeX.Core
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;
}
}

View file

@ -23,7 +23,6 @@ namespace PKHeX.Core
private static IEnumerable<IEncounterable> GetEncountersMainline(PKM pkm, IReadOnlyList<EvoCriteria> 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 @@ namespace PKHeX.Core
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;
}

View file

@ -63,9 +63,9 @@ namespace PKHeX.Core
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 @@ namespace PKHeX.Core
_ => 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)