From d288a32ef54eb8a3f99dfae75f483acddfd03ffb Mon Sep 17 00:00:00 2001 From: Kurt Date: Tue, 22 Dec 2020 09:10:10 -0800 Subject: [PATCH] Permit TR flags for "Can Relearn", split branching for TR checks --- PKHeX.Core/Legality/Core.cs | 5 +- .../Information/ValidEncounterMoves.cs | 2 +- PKHeX.Core/Legality/MoveList.cs | 9 ++-- .../Legality/Moves/MoveTechnicalMachine.cs | 52 ++++++++++++++++--- 4 files changed, 54 insertions(+), 14 deletions(-) diff --git a/PKHeX.Core/Legality/Core.cs b/PKHeX.Core/Legality/Core.cs index ee7727eb9..118007aae 100644 --- a/PKHeX.Core/Legality/Core.cs +++ b/PKHeX.Core/Legality/Core.cs @@ -168,12 +168,13 @@ internal static int GetMaxLanguageID(int generation) internal static bool GetCanLearnMachineMove(PKM pkm, int move, int generation, GameVersion version = GameVersion.Any) { - return MoveList.GetValidMoves(pkm, version, EvolutionChain.GetValidPreEvolutions(pkm), generation, types: MoveSourceType.Machine).Contains(move); + var evos = EvolutionChain.GetValidPreEvolutions(pkm); + return MoveList.GetValidMoves(pkm, version, evos, generation, types: MoveSourceType.AllMachines).Contains(move); } internal static bool GetCanRelearnMove(PKM pkm, int move, int generation, IReadOnlyList evos, GameVersion version = GameVersion.Any) { - return MoveList.GetValidMoves(pkm, version, evos, generation, types: MoveSourceType.Relearnable).Contains(move); + return MoveList.GetValidMoves(pkm, version, evos, generation, types: MoveSourceType.Reminder).Contains(move); } internal static bool GetCanKnowMove(PKM pkm, int move, int generation, IReadOnlyList evos, GameVersion version = GameVersion.Any) diff --git a/PKHeX.Core/Legality/Encounters/Information/ValidEncounterMoves.cs b/PKHeX.Core/Legality/Encounters/Information/ValidEncounterMoves.cs index 2974d76ee..fc3b7a20c 100644 --- a/PKHeX.Core/Legality/Encounters/Information/ValidEncounterMoves.cs +++ b/PKHeX.Core/Legality/Encounters/Information/ValidEncounterMoves.cs @@ -25,7 +25,7 @@ public ValidEncounterMoves(PKM pkm, LevelUpRestriction restrict, IEncounterable AddEdgeCaseMoves(x, encounter, pkm); LevelUpMoves = level; - TMHMMoves = MoveList.GetValidMovesAllGens(pkm, restrict.EvolutionChains, types: MoveSourceType.Machine); + TMHMMoves = MoveList.GetValidMovesAllGens(pkm, restrict.EvolutionChains, types: MoveSourceType.AllMachines); TutorMoves = MoveList.GetValidMovesAllGens(pkm, restrict.EvolutionChains, types: MoveSourceType.AllTutors); } diff --git a/PKHeX.Core/Legality/MoveList.cs b/PKHeX.Core/Legality/MoveList.cs index 1aa5f3fc3..7bf812d55 100644 --- a/PKHeX.Core/Legality/MoveList.cs +++ b/PKHeX.Core/Legality/MoveList.cs @@ -322,6 +322,8 @@ private static IEnumerable GetMoves(PKM pkm, int species, int minlvlG1, int r.AddRange(MoveLevelUp.GetMovesLevelUp(pkm, species, minlvlG1, minlvlG2, lvl, form, Version, types.HasFlagFast(MoveSourceType.Reminder), generation)); if (types.HasFlagFast(MoveSourceType.Machine)) r.AddRange(MoveTechnicalMachine.GetTMHM(pkm, species, form, generation, Version, RemoveTransferHM)); + if (types.HasFlagFast(MoveSourceType.TechnicalRecord)) + r.AddRange(MoveTechnicalMachine.GetRecords(pkm, species, form, generation)); if (types.HasFlagFast(MoveSourceType.AllTutors)) r.AddRange(MoveTutor.GetTutorMoves(pkm, species, form, types.HasFlagFast(MoveSourceType.SpecialTutor), generation)); return r.Distinct(); @@ -339,13 +341,14 @@ public enum MoveSourceType SpecialTutor = 1 << 4, EnhancedTutor = 1 << 5, SharedEggMove = 1 << 6, + TechnicalRecord = 1 << 7, - Reminder = 1 << 7, AllTutors = TypeTutor | SpecialTutor | EnhancedTutor, + AllMachines = Machine | TechnicalRecord, - Relearnable = LevelUp | RelearnMoves, + Reminder = LevelUp | RelearnMoves | TechnicalRecord, Encounter = LevelUp | RelearnMoves, - ExternalSources = LevelUp | Machine | Reminder | AllTutors, + ExternalSources = Reminder | AllMachines | AllTutors, All = ExternalSources | SharedEggMove | RelearnMoves, } diff --git a/PKHeX.Core/Legality/Moves/MoveTechnicalMachine.cs b/PKHeX.Core/Legality/Moves/MoveTechnicalMachine.cs index 931082208..fd23843d9 100644 --- a/PKHeX.Core/Legality/Moves/MoveTechnicalMachine.cs +++ b/PKHeX.Core/Legality/Moves/MoveTechnicalMachine.cs @@ -5,7 +5,7 @@ namespace PKHeX.Core { public static class MoveTechnicalMachine { - public static GameVersion GetIsMachineMove(PKM pkm, int species, int form, int generation, int move, GameVersion ver = GameVersion.Any, bool RemoveTransfer = false, bool allowBit = false) + public static GameVersion GetIsMachineMove(PKM pkm, int species, int form, int generation, int move, GameVersion ver = GameVersion.Any, bool RemoveTransfer = false) { if (pkm.IsMovesetRestricted(generation)) ver = (GameVersion) pkm.Version; @@ -21,7 +21,19 @@ public static GameVersion GetIsMachineMove(PKM pkm, int species, int form, int g case 5: return GetIsMachine5(species, move, form); case 6: return GetIsMachine6(species, move, form, ver); case 7: return GetIsMachine7(species, move, form, ver); - case 8: return GetIsMachine8(pkm, species, move, form, ver, allowBit); + case 8: return GetIsMachine8(species, move, form, ver); + default: + return Legal.NONE; + } + } + + public static GameVersion GetIsRecordMove(PKM pkm, int species, int form, int generation, int move, GameVersion ver = GameVersion.Any, bool allowBit = false) + { + if (pkm.IsMovesetRestricted(generation)) + ver = (GameVersion)pkm.Version; + switch (generation) + { + case 8: return GetIsRecord8(pkm, species, move, form, ver, allowBit); default: return Legal.NONE; } @@ -219,7 +231,7 @@ private static GameVersion GetIsMachine7(int species, int move, int form, GameVe return Legal.NONE; } - private static GameVersion GetIsMachine8(PKM pkm, int species, int move, int form, GameVersion ver, bool allowBit) + private static GameVersion GetIsMachine8(int species, int move, int form, GameVersion ver) { if (GameVersion.SWSH.Contains(ver)) { @@ -231,6 +243,15 @@ private static GameVersion GetIsMachine8(PKM pkm, int species, int move, int for return GameVersion.SWSH; break; } + } + + return Legal.NONE; + } + + private static GameVersion GetIsRecord8(PKM pkm, int species, int move, int form, GameVersion ver, bool allowBit) + { + if (GameVersion.SWSH.Contains(ver)) + { for (int i = 0; i < 100; i++) { if (Legal.TMHM_SWSH[i + 100] != move) @@ -239,7 +260,7 @@ private static GameVersion GetIsMachine8(PKM pkm, int species, int move, int for break; if (allowBit) return GameVersion.SWSH; - if (((PK8) pkm).GetMoveRecordFlag(i)) + if (((PK8)pkm).GetMoveRecordFlag(i)) return GameVersion.SWSH; if (i == 12 && species == (int)Species.Calyrex && form == 0) // TR12 return GameVersion.SWSH; // Agility Calyrex without TR glitch. @@ -268,7 +289,17 @@ public static IEnumerable GetTMHM(PKM pkm, int species, int form, int gener case 5: AddMachine5(r, species, form); break; case 6: AddMachine6(r, species, form, ver); break; case 7: AddMachine7(r, species, form, ver); break; - case 8: AddMachine8(r, species, form, pkm, ver); break; + case 8: AddMachine8(r, species, form, ver); break; + } + return r.Distinct(); + } + + public static IEnumerable GetRecords(PKM pkm, int species, int form, int generation) + { + var r = new List(); + switch (generation) + { + case 8: AddRecordSWSH(r, species, form, pkm); break; } return r.Distinct(); } @@ -382,7 +413,7 @@ private static void AddMachine7(List r, int species, int form, GameVersion } } - private static void AddMachine8(List r, int species, int form, PKM pkm, GameVersion ver = GameVersion.Any) + private static void AddMachine8(List r, int species, int form, GameVersion ver = GameVersion.Any) { switch (ver) { @@ -390,7 +421,7 @@ private static void AddMachine8(List r, int species, int form, PKM pkm, Gam case GameVersion.SW: case GameVersion.SH: case GameVersion.SWSH: - AddMachineSWSH(r, species, form, pkm); + AddMachineSWSH(r, species, form); return; } } @@ -429,7 +460,7 @@ private static void AddMachineGG(List r, int species, int form) r.AddRange(Legal.TMHM_GG.Where((_, m) => pi.TMHM[m])); } - private static void AddMachineSWSH(List r, int species, int form, PKM pkm) + private static void AddMachineSWSH(List r, int species, int form) { if (species > Legal.MaxSpeciesID_8) return; @@ -441,7 +472,12 @@ private static void AddMachineSWSH(List r, int species, int form, PKM pkm) continue; r.Add(Legal.TMHM_SWSH[i]); } + } + public static void AddRecordSWSH(List r, int species, int form, PKM pkm) + { + var pi = PersonalTable.SWSH.GetFormEntry(species, form); + var tmhm = pi.TMHM; var pk8 = (PK8)pkm; for (int i = 0; i < 100; i++) {