diff --git a/PKHeX/Legality/Checks.cs b/PKHeX/Legality/Checks.cs index 5bc74ed78..8f6275ad7 100644 --- a/PKHeX/Legality/Checks.cs +++ b/PKHeX/Legality/Checks.cs @@ -1382,16 +1382,8 @@ private void verifyAbility() (EncounterMatch as EncounterTrade)?.Ability ?? (EncounterMatch as EncounterLink)?.Ability; - if ((AbilityUnchanged ?? false) && EncounterAbility != null && EncounterAbility != 0 && pkm.AbilityNumber != EncounterAbility) - { - if (pkm.Format >= 6 && abilities[0] != abilities[1] && pkm.AbilityNumber < 4) //Ability Capsule - AddLine(Severity.Valid, V109, CheckIdentifier.Ability); - else if (pkm.Gen3 && EncounterMatch is EncounterTrade && EncounterAbility == 1 << abilval) // Edge case (Static PID?) - AddLine(Severity.Valid, V115, CheckIdentifier.Ability); - else - AddLine(Severity.Invalid, V223, CheckIdentifier.Ability); - return; - } + if (EncounterAbility != null && verifySetAbility(EncounterAbility, AbilityUnchanged, abilities, abilval)) + return; // result added via verifySetAbility switch (pkm.GenNumber) { @@ -1408,6 +1400,26 @@ private void verifyAbility() else AddLine(Severity.Valid, V115, CheckIdentifier.Ability); } + private bool verifySetAbility(int? EncounterAbility, bool? AbilityUnchanged, int[] abilities, int abilval) + { + if (pkm.AbilityNumber == 4 && EncounterAbility != 4) + { + AddLine(Severity.Invalid, V108, CheckIdentifier.Ability); + return true; + } + + if (!(AbilityUnchanged ?? false) || EncounterAbility == 0 || pkm.AbilityNumber == EncounterAbility) + return false; + + if (pkm.Format >= 6 && abilities[0] != abilities[1] && pkm.AbilityNumber < 4) // Ability Capsule + AddLine(Severity.Valid, V109, CheckIdentifier.Ability); + else if (pkm.Gen3 && EncounterMatch is EncounterTrade && EncounterAbility == 1 << abilval) + // Edge case (Static PID?) + AddLine(Severity.Valid, V115, CheckIdentifier.Ability); + else + AddLine(Severity.Invalid, V223, CheckIdentifier.Ability); + return true; + } private bool? verifyAbilityPreCapsule(int[] abilities, int abilval) { // CXD pokemon could have any ability without maching PID @@ -1433,13 +1445,12 @@ private void verifyAbility() private bool? verifyAbilityGen3Transfer(int[] abilities, int abilval, int Species_g3) { var abilities_g3 = PersonalTable.E[Species_g3].Abilities.Where(a => a != 0).Distinct().ToArray(); - if (abilities_g3.Length == 2) - // For non-GC, it has 2 abilities in gen 3, must match PID + if (abilities_g3.Length == 2) // Excluding Colosseum/XD, a gen3 pkm must match PID if it has 2 unique abilities return pkm.Version != (int)GameVersion.CXD; - var Species_g45 = Math.Max(EvoChainsAllGens[4].FirstOrDefault()?.Species ?? 0, pkm.Format == 5 ? EvoChainsAllGens[5].FirstOrDefault()?.Species ?? 0 : 0); - if (Species_g45 > Species_g3) - // it have evolved in gen 4 or 5 games, ability must match PID + int Species_g4 = EvoChainsAllGens[4].FirstOrDefault()?.Species ?? 0; + int Species_g5 = pkm.Format == 5 ? EvoChainsAllGens[5].FirstOrDefault()?.Species ?? 0 : 0; + if (Math.Max(Species_g5, Species_g4) > Species_g3) // it has evolved in either gen 4 or gen 5; the ability must match PID return false; var Evolutions_g45 = Math.Max(EvoChainsAllGens[4].Length, pkm.Format == 5 ? EvoChainsAllGens[5].Length : 0); @@ -2783,7 +2794,6 @@ private CheckResult[] parseMovesForSmeargle(int[] Moves) } private GameVersion[] getBaseMovesIsEggGames() { - GameVersion[] Games = { }; switch (pkm.GenNumber) { case 1: @@ -2823,15 +2833,13 @@ private GameVersion[] getBaseMovesIsEggGames() case GameVersion.B: case GameVersion.W: return new[] { GameVersion.BW }; - case GameVersion.Pt: - return new[] { GameVersion.Pt }; case GameVersion.B2: case GameVersion.W2: return new[] { GameVersion.B2W2 }; } break; } - return Games; + return new GameVersion[] {}; } private CheckResult[] parseMovesIsEggPreRelearn(int[] Moves, int[] SpecialMoves, bool allowinherited) { @@ -2919,7 +2927,6 @@ private CheckResult[] parseMovesWasEggPreRelearn(int[] Moves, List[] validL if (res.All(r => r.Valid)) // moves is satisfactory return res; - } return res; }