Permit TR flags for "Can Relearn", split branching for TR checks

This commit is contained in:
Kurt 2020-12-22 09:10:10 -08:00
parent 53e0046a48
commit d288a32ef5
4 changed files with 54 additions and 14 deletions

View File

@ -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<EvoCriteria> 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<EvoCriteria> evos, GameVersion version = GameVersion.Any)

View File

@ -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);
}

View File

@ -322,6 +322,8 @@ private static IEnumerable<int> 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,
}

View File

@ -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<int> 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<int> GetRecords(PKM pkm, int species, int form, int generation)
{
var r = new List<int>();
switch (generation)
{
case 8: AddRecordSWSH(r, species, form, pkm); break;
}
return r.Distinct();
}
@ -382,7 +413,7 @@ private static void AddMachine7(List<int> r, int species, int form, GameVersion
}
}
private static void AddMachine8(List<int> r, int species, int form, PKM pkm, GameVersion ver = GameVersion.Any)
private static void AddMachine8(List<int> r, int species, int form, GameVersion ver = GameVersion.Any)
{
switch (ver)
{
@ -390,7 +421,7 @@ private static void AddMachine8(List<int> 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<int> r, int species, int form)
r.AddRange(Legal.TMHM_GG.Where((_, m) => pi.TMHM[m]));
}
private static void AddMachineSWSH(List<int> r, int species, int form, PKM pkm)
private static void AddMachineSWSH(List<int> r, int species, int form)
{
if (species > Legal.MaxSpeciesID_8)
return;
@ -441,7 +472,12 @@ private static void AddMachineSWSH(List<int> r, int species, int form, PKM pkm)
continue;
r.Add(Legal.TMHM_SWSH[i]);
}
}
public static void AddRecordSWSH(List<int> 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++)
{