Partial match HA species without a HA possible

A captured metapod cannot have hidden ability via ability patch, but a captured caterpie evolved into metapod can, assuming it existed as caterpie.
This commit is contained in:
Kurt 2021-01-31 13:05:36 -08:00
parent 4456a9dc7a
commit 1ece844f78
6 changed files with 37 additions and 15 deletions

View file

@ -203,8 +203,16 @@ namespace PKHeX.Core
{ {
if (IsDeferredWurmple(pkm)) if (IsDeferredWurmple(pkm))
return EncounterMatchRating.PartialMatch; return EncounterMatchRating.PartialMatch;
if (IsDeferredHiddenAbility(pkm.AbilityNumber == 4))
return EncounterMatchRating.Deferred; if (pkm.Format >= 5)
{
bool isHidden = pkm.AbilityNumber == 4;
if (isHidden && this.IsPartialMatchHidden(Species))
return EncounterMatchRating.PartialMatch;
if (IsDeferredHiddenAbility(isHidden))
return EncounterMatchRating.Deferred;
}
return EncounterMatchRating.Match; return EncounterMatchRating.Match;
} }

View file

@ -28,11 +28,9 @@ namespace PKHeX.Core
public override EncounterMatchRating GetMatchRating(PKM pkm) public override EncounterMatchRating GetMatchRating(PKM pkm)
{ {
if (IsDeferredWurmple(pkm)) if (IsDeferredSafari3(pkm.Ball == (int)Ball.Safari))
return EncounterMatchRating.PartialMatch; return EncounterMatchRating.PartialMatch;
if (IsDeferredSafari3(pkm.Ball == (int) Ball.Safari)) return base.GetMatchRating(pkm);
return EncounterMatchRating.PartialMatch;
return EncounterMatchRating.Match;
} }
private bool IsDeferredSafari3(bool IsSafariBall) => IsSafariBall != Locations.IsSafariZoneLocation3(Location); private bool IsDeferredSafari3(bool IsSafariBall) => IsSafariBall != Locations.IsSafariZoneLocation3(Location);

View file

@ -31,8 +31,6 @@ namespace PKHeX.Core
public override EncounterMatchRating GetMatchRating(PKM pkm) public override EncounterMatchRating GetMatchRating(PKM pkm)
{ {
if (IsDeferredWurmple(pkm))
return EncounterMatchRating.PartialMatch;
if ((pkm.Ball == (int)Ball.Safari) != Locations.IsSafariZoneLocation4(Location)) if ((pkm.Ball == (int)Ball.Safari) != Locations.IsSafariZoneLocation4(Location))
return EncounterMatchRating.PartialMatch; return EncounterMatchRating.PartialMatch;
if ((pkm.Ball == (int)Ball.Sport) != (Area.Type == SlotType.BugContest)) if ((pkm.Ball == (int)Ball.Sport) != (Area.Type == SlotType.BugContest))
@ -41,7 +39,7 @@ namespace PKHeX.Core
if (pkm.Species != (int)Core.Species.Shedinja || pkm.Ball != (int)Ball.Poke) if (pkm.Species != (int)Core.Species.Shedinja || pkm.Ball != (int)Ball.Poke)
return EncounterMatchRating.PartialMatch; return EncounterMatchRating.PartialMatch;
} }
return EncounterMatchRating.Match; return base.GetMatchRating(pkm);
} }
} }
} }

View file

@ -55,7 +55,7 @@ namespace PKHeX.Core
{ {
if (IsMatchPartial(pkm)) if (IsMatchPartial(pkm))
return EncounterMatchRating.PartialMatch; return EncounterMatchRating.PartialMatch;
return EncounterMatchRating.Match; return base.GetMatchRating(pkm);
} }
private bool IsMatchPartial(PKM pk) private bool IsMatchPartial(PKM pk)
@ -65,14 +65,11 @@ namespace PKHeX.Core
return true; return true;
if (!GetIVsAboveMinimum(pk)) if (!GetIVsAboveMinimum(pk))
return true; return true;
// Eevee & Glaceon have different base friendships. Make sure if it is invalid that we yield the other encounter before. // Eevee & Glaceon have different base friendships. Make sure if it is invalid that we yield the other encounter before.
if (PersonalTable.SWSH.GetFormEntry(Species, Form).BaseFriendship != pk.OT_Friendship) if (PersonalTable.SWSH.GetFormEntry(Species, Form).BaseFriendship != pk.OT_Friendship)
return true; return true;
if (Species == (int)Core.Species.Wurmple)
return !WurmpleUtil.IsWurmpleEvoValid(pk);
return Species switch return Species switch
{ {
(int)Core.Species.Yamask when pk.Species != Species && Form == 1 => pk is IFormArgument { FormArgument: 0 }, (int)Core.Species.Yamask when pk.Species != Species && Form == 1 => pk is IFormArgument { FormArgument: 0 },

View file

@ -305,6 +305,8 @@ namespace PKHeX.Core
protected virtual bool IsMatchPartial(PKM pkm) protected virtual bool IsMatchPartial(PKM pkm)
{ {
if (pkm.Format >= 5 && pkm.AbilityNumber == 4 && this.IsPartialMatchHidden(Species))
return true;
return pkm.FatefulEncounter != Fateful; return pkm.FatefulEncounter != Fateful;
} }
} }

View file

@ -1,8 +1,27 @@
namespace PKHeX.Core using static PKHeX.Core.Species;
namespace PKHeX.Core
{ {
public interface IEncounterMatch public interface IEncounterMatch
{ {
bool IsMatchExact(PKM pkm, DexLevel dl); bool IsMatchExact(PKM pkm, DexLevel dl);
EncounterMatchRating GetMatchRating(PKM pkm); EncounterMatchRating GetMatchRating(PKM pkm);
} }
internal static class EncounterMatchExtensions
{
/// <summary>
/// Some species do not have a Hidden Ability, but can be altered to have the HA slot via pre-evolution.
/// </summary>
/// <param name="_">Match object</param>
/// <param name="species">Species ID</param>
/// <returns>True if it should not originate as this species.</returns>
public static bool IsPartialMatchHidden(this IEncounterMatch _, int species)
{
return species is (int)Metapod or (int)Kakuna
or (int)Pupitar
or (int)Silcoon or (int)Cascoon
or (int)Vibrava or (int)Flygon;
}
}
} }