From a1153f10047512f4ae6f95f9261a74378b75cf37 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 31 Mar 2017 18:35:43 -0700 Subject: [PATCH] Misc simplifications Segregate gen4 transfer legality check from encounter detection reorder EncounterSlot[] match test to be before EncounterStatic. Closes #1016 Fix manaphy gift handling --- PKHeX/Legality/Checks.cs | 104 ++++++++++++-------------- PKHeX/Legality/Core.cs | 33 ++++---- PKHeX/Legality/Structures/Learnset.cs | 24 ++---- 3 files changed, 67 insertions(+), 94 deletions(-) diff --git a/PKHeX/Legality/Checks.cs b/PKHeX/Legality/Checks.cs index 2b8c2cf8e..b314fa49d 100644 --- a/PKHeX/Legality/Checks.cs +++ b/PKHeX/Legality/Checks.cs @@ -497,7 +497,7 @@ namespace PKHeX.Core private CheckResult verifyEncounterEgg() { // Check Species - if (Legal.NoHatchFromEgg.Contains(pkm.Species) && !EncounterIsMysteryGift) + if (Legal.NoHatchFromEgg.Contains(pkm.Species) && EncounterMatch == null) return new CheckResult(Severity.Invalid, V50, CheckIdentifier.Encounter); switch (pkm.GenNumber) @@ -804,22 +804,19 @@ namespace PKHeX.Core } EncounterMatch = null; - if (null != (EncounterMatch = Legal.getValidStaticEncounter(pkm))) + if (null != (EncounterMatch = Legal.getValidIngameTrade(pkm))) { - G3Result = verifyEncounterStatic(); - if (G3Result?.Valid ?? false) - G3Encounter = EncounterMatch; - } - else if (null != (EncounterMatch = Legal.getValidIngameTrade(pkm))) - { - G3Result = verifyEncounterTrade(); - if (G3Result?.Valid ?? false) + if ((G3Result = verifyEncounterTrade())?.Valid ?? false) G3Encounter = EncounterMatch; } else if (null != (EncounterMatch = Legal.getValidWildEncounters(pkm))) { - G3Result = verifyEncounterWild(); - if (G3Result?.Valid ?? false) + if ((G3Result = verifyEncounterWild())?.Valid ?? false) + G3Encounter = EncounterMatch; + } + else if (null != (EncounterMatch = Legal.getValidStaticEncounter(pkm))) + { + if ((G3Result = verifyEncounterStatic())?.Valid ?? false) G3Encounter = EncounterMatch; } @@ -865,16 +862,7 @@ namespace PKHeX.Core private CheckResult verifyEncounterG4Transfer() { CheckResult Gen4Result = null; - CheckResult InvalidTransferResult = null; - - var CrownLocation = -1; - var AllowCrownLocation = pkm.Gen4 && pkm.FatefulEncounter && Legal.CrownBeasts.Contains(pkm.Species); - if (AllowCrownLocation) - CrownLocation = pkm.Species == 251 ? 30010 : 30012; // Celebi : Beast - if (pkm.Met_Location != 30001 && (!AllowCrownLocation || pkm.Met_Location != CrownLocation)) - InvalidTransferResult = new CheckResult(Severity.Invalid, AllowCrownLocation ? V351 : V61, CheckIdentifier.Encounter); - bool wasEvent = pkm.WasEvent || pkm.WasEventEgg; if (wasEvent) { @@ -887,7 +875,7 @@ namespace PKHeX.Core { var result = verifyEncounterStatic(); if (result != null) - return result.Valid && InvalidTransferResult != null ? InvalidTransferResult : result; + return result; EncounterMatch = null; // Reset Encounter Object, test for remaining encounters } @@ -909,13 +897,14 @@ namespace PKHeX.Core ? new CheckResult(Severity.Invalid, V78, CheckIdentifier.Encounter) : new CheckResult(Severity.Invalid, V80, CheckIdentifier.Encounter); - if (InvalidTransferResult != null) - { - if (Gen4Result.Valid) - return InvalidTransferResult; - // If there is an error in G5 transfer and G4 encounter return both erros - return new CheckResult(Severity.Invalid, Gen4Result.Comment + Environment.NewLine + InvalidTransferResult.Comment, CheckIdentifier.Encounter); - } + // Transfer Legality + var CrownLocation = -1; + var AllowCrownLocation = pkm.Gen4 && pkm.FatefulEncounter && Legal.CrownBeasts.Contains(pkm.Species); + if (AllowCrownLocation) + CrownLocation = pkm.Species == 251 ? 30010 : 30012; // Celebi : Beast + + if (pkm.Met_Location != 30001 && (!AllowCrownLocation || pkm.Met_Location != CrownLocation)) + AddLine(Severity.Invalid, AllowCrownLocation ? V351 : V61, CheckIdentifier.Encounter); return Gen4Result; } @@ -2552,17 +2541,17 @@ namespace PKHeX.Core // Also check if the base egg moves is a non tradeback move for (int m = 0; m < 4; m++) { - if (baseegg.Contains(moves[m])) + if (!baseegg.Contains(moves[m])) + continue; + + if (IsGen2Pkm && Gen1MovesLearned.Any() && moves[m] > Legal.MaxMoveID_1) { - if (IsGen2Pkm && Gen1MovesLearned.Any() && moves[m] > Legal.MaxMoveID_1) - { - res[m] = new CheckResult(Severity.Invalid, V334, CheckIdentifier.Move); - MixedGen1NonTradebackGen2 = true; - } - else - res[m] = new CheckResult(Severity.Valid, V345, CheckIdentifier.Move); - BaseEggMovesLearned.Add(m); + res[m] = new CheckResult(Severity.Invalid, V334, CheckIdentifier.Move); + MixedGen1NonTradebackGen2 = true; } + else + res[m] = new CheckResult(Severity.Valid, V345, CheckIdentifier.Move); + BaseEggMovesLearned.Add(m); } // Check egg moves after all the generations and all the moves, every move that can't be learned in another source should have preference @@ -2602,7 +2591,7 @@ namespace PKHeX.Core // A pokemon could have normal egg moves and regular egg moves // Only if all regular egg moves are event egg moves or all event egg moves are regular egg moves - var RegularEggMovesLearned = EggMovesLearned.Union(BaseEggMovesLearned); + var RegularEggMovesLearned = EggMovesLearned.Union(BaseEggMovesLearned).ToList(); if (RegularEggMovesLearned.Any() && EventEggMovesLearned.Any()) { // Moves that are egg moves or event egg moves but not both @@ -2629,14 +2618,17 @@ namespace PKHeX.Core // Check if the marked hidden moves that were invalid at the start are now marked as valid, that means // the hidden move was learned in gen 3 or 4 but was not removed when transfer to 4 or 5 if (KnowDefogWhirlpool) - KnowDefogWhirlpool = moves.Where((m,i) => (m == 250 || m == 432) && (res[i]?.Valid ?? false)).Count() == 2; + { + int invalidCount = moves.Where((m, i) => (m == 250 || m == 432) && (res[i]?.Valid ?? false)).Count(); + if (invalidCount == 2) // can't know both at the same time + for (int i = 0; i < 4; i++) // flag both moves + if (moves[i] == 250 || moves[i] == 432) + res[i] = new CheckResult(Severity.Invalid, V338, CheckIdentifier.Move); + } - if (KnowDefogWhirlpool) - foreach (int index in moves.Select((m, i) => i).Where(i => moves[i] == 250 || moves[i] == 432)) - res[index] = new CheckResult(Severity.Invalid, V338, CheckIdentifier.Move); - - foreach (int hm in HMLearned.Where(l => res[l]?.Valid ?? false)) - res[hm] = new CheckResult(Severity.Invalid, string.Format(V339, gen, gen + 1), CheckIdentifier.Move); + for (int i = 0; i < HMLearned.Length; i++) + if (res[i]?.Valid ?? false) + res[i] = new CheckResult(Severity.Invalid, string.Format(V339, gen, gen + 1), CheckIdentifier.Move); } // Mark the gen 1 exclusive moves as illegal because the pokemon also have Non tradeback egg moves. @@ -2674,19 +2666,19 @@ namespace PKHeX.Core if (res[m]?.Valid ?? false) continue; - if (ShedinjaEvoMoves[gen].Contains(moves[m])) - { - res[m] = new CheckResult(Severity.Valid, native ? V355 : string.Format(V356, gen), CheckIdentifier.Move); - ShedinjaEvoMovesLearned.Add(m); - } + if (!ShedinjaEvoMoves[gen].Contains(moves[m])) + continue; + + res[m] = new CheckResult(Severity.Valid, native ? V355 : string.Format(V356, gen), CheckIdentifier.Move); + ShedinjaEvoMovesLearned.Add(m); } } - if (ShedinjaEvoMovesLearned.Count() > 1) - { - foreach (int m in ShedinjaEvoMovesLearned) - res[m] = new CheckResult(Severity.Invalid, V357, CheckIdentifier.Move); - } + if (ShedinjaEvoMovesLearned.Count <= 1) + return; + + foreach (int m in ShedinjaEvoMovesLearned) + res[m] = new CheckResult(Severity.Invalid, V357, CheckIdentifier.Move); } private void verifyPreRelearn() diff --git a/PKHeX/Legality/Core.cs b/PKHeX/Legality/Core.cs index 77c9a5df4..5a297ddef 100644 --- a/PKHeX/Legality/Core.cs +++ b/PKHeX/Legality/Core.cs @@ -718,28 +718,23 @@ namespace PKHeX.Core lvl = pkm.CurrentLevel; if (pkm.Species != 292 || lvl < 20) return r; + // If nincada evolves into Ninjask an learn in the evolution a move from ninjask learnset pool // Shedinja would appear with that move learned. Only one move above level 20 allowed, only in generations 3 and 4 - switch(generation) + switch (generation) { - case 0: - case 3: - { - if(pkm.InhabitedGeneration(3)) - // Ninjask have the same learnset in every gen 3 games - r[3] = LevelUpE[291].getMoves(20, lvl).ToList(); - - if (generation == 0) - goto case 4; - break; - } - case 4: - { - if (pkm.InhabitedGeneration(4)) - // Ninjask have the same learnset in every gen 4 games - r[4] = LevelUpPt[291].getMoves(20, lvl).ToList(); - break; - } + case 0: // Default (both) + case 3: // Ninjask have the same learnset in every gen 3 games + if (pkm.InhabitedGeneration(3)) + r[3] = LevelUpE[291].getMoves(20, lvl).ToList(); + + if (generation == 0) + goto case 4; + break; + case 4: // Ninjask have the same learnset in every gen 4 games + if (pkm.InhabitedGeneration(4)) + r[4] = LevelUpPt[291].getMoves(20, lvl).ToList(); + break; } return r; } diff --git a/PKHeX/Legality/Structures/Learnset.cs b/PKHeX/Legality/Structures/Learnset.cs index e8d2339aa..2a5b2303a 100644 --- a/PKHeX/Legality/Structures/Learnset.cs +++ b/PKHeX/Legality/Structures/Learnset.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; using System.Linq; @@ -21,24 +20,11 @@ namespace PKHeX.Core return Moves; } - public int[] getMoves(int minlevel,int maxlevel) + public int[] getMoves(int minLevel, int maxLevel) { - if (minlevel <= 1) - return getMoves(maxlevel); - int i = 0; - int skipmoves = 0; - for (; i < Levels.Length; i++) - if (Levels[i] == minlevel) - { - skipmoves = Math.Min(0, i - 1); - continue; - } - if (maxlevel >= 100) - return Moves.Skip(skipmoves).ToArray(); - for (; i < Levels.Length; i++) - if (Levels[i] > maxlevel) - return Moves.Take(i).Skip(skipmoves).ToArray(); - return Moves.Skip(skipmoves).ToArray(); + return Moves + .SkipWhile((m, i) => Levels[i] < minLevel) + .TakeWhile((m, i) => Levels[i] <= maxLevel).ToArray(); } }