From 0c06506a8d710ec732efc5795217e1aada46d2b7 Mon Sep 17 00:00:00 2001 From: Kurt Date: Mon, 18 Jun 2018 19:57:32 -0700 Subject: [PATCH] Refactoring remove some unneeded logic moves in gen1/2 can be reordered, sequence match should be intersect (full) contains match. --- PKHeX.Core/Legality/Core.cs | 57 ------------------- .../Legality/Encounters/EncounterStatic.cs | 1 - .../Generator/EncounterLinkGenerator.cs | 4 +- .../Verifiers/VerifyCurrentMoves.cs | 8 +-- PKHeX.Core/Legality/Moves/MoveLevelUp.cs | 16 +++++- 5 files changed, 20 insertions(+), 66 deletions(-) diff --git a/PKHeX.Core/Legality/Core.cs b/PKHeX.Core/Legality/Core.cs index bdebb2c85..9879de8a0 100644 --- a/PKHeX.Core/Legality/Core.cs +++ b/PKHeX.Core/Legality/Core.cs @@ -395,63 +395,6 @@ internal static IEnumerable GetGen1Versions(LegalInfo Info) // it is sufficient to check just RB's case yield return GameVersion.RB; } - internal static IEnumerable GetInitialMovesGBEncounter(int species, int lvl, GameVersion ver) - { - int[] InitialMoves; - int[] LevelUpMoves; - int diff; - switch (ver) - { - case GameVersion.YW: - case GameVersion.RD: - case GameVersion.BU: - case GameVersion.GN: - case GameVersion.RB: - { - var LevelTable = ver == GameVersion.YW ? LevelUpY : LevelUpRB; - int index = PersonalTable.RB.GetFormeIndex(species, 0); - if (index == 0) - return Enumerable.Empty(); - LevelUpMoves = LevelTable[species].GetEncounterMoves(lvl); - diff = 4 - LevelUpMoves.Count(z => z != 0); - if (diff == 0) - return LevelUpMoves; - var table = ver == GameVersion.YW ? PersonalTable.Y : PersonalTable.RB; - InitialMoves = ((PersonalInfoG1)table[index]).Moves; - break; - } - case GameVersion.C: - case GameVersion.GD: - case GameVersion.SV: - case GameVersion.GS: - { - if (species == 235) - return new[] { 166 }; // Smeargle only learns Sketch, is duplicated in the level up tables - var LevelTable = ver == GameVersion.C ? LevelUpC : LevelUpGS; - int index = PersonalTable.C.GetFormeIndex(species, 0); - if (index == 0) - return Enumerable.Empty(); - LevelUpMoves = LevelTable[species].GetEncounterMoves(lvl); - diff = 4 - LevelUpMoves.Count(z => z != 0); - if (diff == 0) - return LevelUpMoves; - // Level Up 1 moves are initial moves, it can be duplicated in levels 2-100 - InitialMoves = LevelTable[species].GetEncounterMoves(1); - break; - } - default: - return Enumerable.Empty(); - } - // Initial Moves could be duplicated in the level up table - // level up table moves have preference - var moves = InitialMoves.Where(p => p != 0).Except(LevelUpMoves).ToList(); - // If all of the personal table moves can't be included, the last moves have preference. - int pop = moves.Count - diff; - if (pop > 0) - moves.RemoveRange(0, pop); - // The order for the pokemon default moves are first moves from personal table and then moves from level up table - return moves.Union(LevelUpMoves).ToArray(); - } internal static int GetRequiredMoveCount(PKM pk, int[] moves, LegalInfo info, int[] initialmoves) { if (pk.Format != 1 || !pk.Gen1_NotTradeback) // No Move Deleter in Gen 1 diff --git a/PKHeX.Core/Legality/Encounters/EncounterStatic.cs b/PKHeX.Core/Legality/Encounters/EncounterStatic.cs index c4b665cfc..86708879d 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterStatic.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterStatic.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; namespace PKHeX.Core { diff --git a/PKHeX.Core/Legality/Encounters/Generator/EncounterLinkGenerator.cs b/PKHeX.Core/Legality/Encounters/Generator/EncounterLinkGenerator.cs index 45bb4b82a..4cc2e5133 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/EncounterLinkGenerator.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/EncounterLinkGenerator.cs @@ -7,13 +7,13 @@ public static class EncounterLinkGenerator { public static IEnumerable GetPossible(PKM pkm) { - if (pkm.GenNumber != 6) + if (!pkm.Gen6) return Enumerable.Empty(); return Encounters6.LinkGifts6.Where(g => g.Species == pkm.Species); } public static IEnumerable GetPossible(PKM pkm, IReadOnlyList vs) { - if (pkm.GenNumber != 6) + if (!pkm.Gen6) return Enumerable.Empty(); return Encounters6.LinkGifts6.Where(g => vs.Any(z => z.Species == g.Species)); } diff --git a/PKHeX.Core/Legality/Encounters/Verifiers/VerifyCurrentMoves.cs b/PKHeX.Core/Legality/Encounters/Verifiers/VerifyCurrentMoves.cs index f31003888..a405e355b 100644 --- a/PKHeX.Core/Legality/Encounters/Verifiers/VerifyCurrentMoves.cs +++ b/PKHeX.Core/Legality/Encounters/Verifiers/VerifyCurrentMoves.cs @@ -157,11 +157,11 @@ private static CheckMoveResult[] ParseMovesGenGB(PKM pkm, int[] Moves, LegalInfo return ParseMovesSpecialMoveset(pkm, Moves, info); var InitialMoves = new int[0]; int[] SpecialMoves = GetSpecialMoves(info.EncounterMatch); - IEnumerable games = (info.EncounterMatch as IGeneration)?.Generation == 1 ? Legal.GetGen1Versions(info) : Legal.GetGen2Versions(info); - foreach (GameVersion ver in games) + var games = info.EncounterMatch is IGeneration g && g.Generation == 1 ? Legal.GetGen1Versions(info) : Legal.GetGen2Versions(info); + foreach (var ver in games) { - var VerInitialMoves = Legal.GetInitialMovesGBEncounter(G1Encounter.Species, G1Encounter.LevelMin, ver).ToArray(); - if (VerInitialMoves.SequenceEqual(InitialMoves)) + var VerInitialMoves = MoveLevelUp.GetEncounterMoves(G1Encounter.Species, 0, G1Encounter.LevelMin, ver); + if (VerInitialMoves.Intersect(InitialMoves).Count() == VerInitialMoves.Length) return res; var source = new MoveParseSource diff --git a/PKHeX.Core/Legality/Moves/MoveLevelUp.cs b/PKHeX.Core/Legality/Moves/MoveLevelUp.cs index 34ac4e1e1..9ed872fae 100644 --- a/PKHeX.Core/Legality/Moves/MoveLevelUp.cs +++ b/PKHeX.Core/Legality/Moves/MoveLevelUp.cs @@ -424,8 +424,6 @@ private static List AddMovesLevelUp7(List moves, GameVersion ver, int public static int[] GetEncounterMoves(PKM pk, int level, GameVersion version) { - if (RBY.Contains(version)) - return GetEncounterMoves1(pk.Species, level, version); if (version <= 0) version = (GameVersion)pk.Version; return GetEncounterMoves(pk.Species, pk.AltForm, level, version); @@ -441,9 +439,23 @@ private static int[] GetEncounterMoves1(int species, int level, GameVersion vers return learn[index].GetEncounterMoves(level, lvl0, start); } + private static int[] GetEncounterMoves2(int species, int level, GameVersion version) + { + var learn = GameData.GetLearnsets(version); + var table = GameData.GetPersonal(version); + var index = table.GetFormeIndex(species, 0); + var lvl0 = learn[species].GetEncounterMoves(1); + int start = Math.Max(0, Array.FindIndex(lvl0, z => z == 0)); + + return learn[index].GetEncounterMoves(level, lvl0, start); + } public static int[] GetEncounterMoves(int species, int form, int level, GameVersion version) { + if (RBY.Contains(version)) + return GetEncounterMoves1(species, level, version); + if (GSC.Contains(version)) + return GetEncounterMoves2(species, level, version); var learn = GameData.GetLearnsets(version); var table = GameData.GetPersonal(version); var index = table.GetFormeIndex(species, form);