using System; using System.Collections.Generic; using System.Linq; namespace PKHeX.Core { public static class MoveSetApplicator { /// /// Gets a moveset for the provided data. /// /// PKM to generate for /// Full movepool & shuffling /// 4 moves public static int[] GetMoveSet(this PKM pk, bool random = false) { var la = new LegalityAnalysis(pk); var moves = la.GetMoveSet(random); if (random) return moves; var clone = pk.Clone(); clone.SetMoves(moves); var newLa = new LegalityAnalysis(pk); // ReSharper disable once TailRecursiveCall return newLa.Valid ? moves : GetMoveSet(pk, true); } /// /// Gets a moveset for the provided data. /// /// Precomputed optional /// Full movepool & shuffling /// 4 moves public static int[] GetMoveSet(this LegalityAnalysis la, bool random = false) { int[] m = la.GetSuggestedCurrentMoves(random ? MoveSourceType.All : MoveSourceType.None); var learn = la.GetSuggestedMovesAndRelearn(); if (!m.All(z => learn.Contains(z))) m = m.Intersect(learn).ToArray(); if (random && !la.pkm.IsEgg) Util.Shuffle(m); const int count = 4; if (m.Length > count) return m.SliceEnd(m.Length - count); Array.Resize(ref m, count); return m; } /// /// Fetches based on the provided . /// /// Pokémon to modify. /// best suited for the current data. public static IReadOnlyList GetSuggestedRelearnMoves(this PKM pk) => GetSuggestedRelearnMoves(new LegalityAnalysis(pk)); /// /// Fetches based on the provided . /// /// which contains parsed information pertaining to legality. /// best suited for the current data. public static IReadOnlyList GetSuggestedRelearnMoves(this LegalityAnalysis legal) { var m = legal.GetSuggestedRelearnMovesFromEncounter(); if (m.Any(z => z != 0)) return m; var enc = legal.EncounterMatch; if (enc is MysteryGift || enc is EncounterEgg) return m; var encounter = EncounterSuggestion.GetSuggestedMetInfo(legal.pkm); if (encounter is IRelearn r && r.Relearn.Count > 0) return r.Relearn; return m; } } }