diff --git a/PKHeX/Legality/Analysis.cs b/PKHeX/Legality/Analysis.cs index 773228603..2cf4ba21f 100644 --- a/PKHeX/Legality/Analysis.cs +++ b/PKHeX/Legality/Analysis.cs @@ -121,7 +121,8 @@ private void parsePK4(PKM pk) pkm = pk; if (!pkm.IsOriginValid) { AddLine(Severity.Invalid, V187, CheckIdentifier.None); return; } - + + verifyPreRelearn(); updateEncounterChain(); updateMoveLegality(); updateEncounterInfo(); @@ -133,7 +134,8 @@ private void parsePK5(PKM pk) pkm = pk; if (!pkm.IsOriginValid) { AddLine(Severity.Invalid, V187, CheckIdentifier.None); return; } - + + verifyPreRelearn(); updateEncounterChain(); updateMoveLegality(); updateEncounterInfo(); diff --git a/PKHeX/Legality/Checks.cs b/PKHeX/Legality/Checks.cs index 87da39a66..32a86c271 100644 --- a/PKHeX/Legality/Checks.cs +++ b/PKHeX/Legality/Checks.cs @@ -241,7 +241,7 @@ private void verifyNickname() { // Can't have another language name if it hasn't evolved or wasn't a language-traded egg. bool match = PKX.getSpeciesNameGeneration(pkm.Species, pkm.Language, pkm.Format) == nickname; - match |= (pkm.WasTradedEgg || Legal.getHasEvolved(pkm)) && PKX.getIsNicknamedAnyLanguage(pkm.Species, nickname, pkm.Format); + match |= (pkm.WasTradedEgg || Legal.getHasEvolved(pkm)) && !PKX.getIsNicknamedAnyLanguage(pkm.Species, nickname, pkm.Format); if (!match) { @@ -1107,7 +1107,7 @@ private void verifyAbility() if (3 <= pkm.Format && pkm.Format <= 5) // 3-5 { - if (pkm.Version != (int) GameVersion.CXD && abilities[0] != abilities[1] && pkm.PIDAbility != abilval) + if (pkm.Version != (int) GameVersion.CXD && abilities[0] != abilities[1] && pkm.AbilityNumber != 1 << abilval) { AddLine(Severity.Invalid, V113, CheckIdentifier.Ability); return; @@ -2149,6 +2149,16 @@ private static CheckResult[] parseMoves(int[] moves, int[] learn, int[] relearn, return res; } + private void verifyPreRelearn() + { + // For origins prior to relearn moves, need to try to match a mystery gift if applicable. + + if (pkm.WasEvent || pkm.WasEventEgg) + { + EventGiftMatch = new List(Legal.getValidGifts(pkm)); + EncounterMatch = EventGiftMatch.FirstOrDefault(); + } + } private CheckResult[] verifyRelearn() { RelearnBase = null; diff --git a/PKHeX/Legality/Core.cs b/PKHeX/Legality/Core.cs index 1244ab88d..8c6bf56a9 100644 --- a/PKHeX/Legality/Core.cs +++ b/PKHeX/Legality/Core.cs @@ -1064,13 +1064,13 @@ private static IEnumerable getMatchingPGF(PKM pkm, IEnumerable 5 || Format > 5) return -1; - if (GenNumber == 5) - return (int)((PID >> 16) & 1); - return (int)(PID & 1); + + if (Version == (int) GameVersion.CXD) + return Array.IndexOf(PersonalInfo.Abilities, Ability); + return (int)((GenNumber == 5 ? PID >> 16 : PID) & 1); } }