GetLevelLearnMove->TryGetLevelLearnMove

As alluded to in 7442e86d65
This commit is contained in:
Kurt
2025-05-18 01:36:05 -05:00
parent 5a3ebec12b
commit 47bc45d854
30 changed files with 97 additions and 118 deletions

View File

@@ -102,14 +102,14 @@ public static void SetMasteredFlag(this IMoveShop8Mastery shop, Learnset learn,
if (shop.GetMasteredRecordFlag(index))
return;
if (level < (uint)learn.GetLevelLearnMove(move)) // Can't learn it yet; must purchase.
if (learn.TryGetLevelLearnMove(move, out var learnLevel) && level < learnLevel) // Can't learn it yet; must purchase.
{
shop.SetPurchasedRecordFlag(index, true);
shop.SetMasteredRecordFlag(index, true);
return;
}
if (level < (uint)mastery.GetLevelLearnMove(move)) // Can't master it yet; must Seed of Mastery
if (mastery.TryGetLevelLearnMove(move, out var masterLevel) && level < masterLevel) // Can't master it yet; must Seed of Mastery
shop.SetMasteredRecordFlag(index, true);
}
@@ -131,8 +131,8 @@ public static void SetEncounterMasteryFlags(this IMoveShop8Mastery shop, ReadOnl
// If the Pokémon is caught with any move shop move in its learnset,
// and it is high enough level to master it, the game will automatically
// give it the "Mastered" flag but not the "Purchased" flag
// For moves that are not in the learnset, it returns -1 which is true, thus set as mastered.
if (level >= mastery.GetLevelLearnMove(move))
// For moves that are not in the learnset, set as mastered.
if (!mastery.TryGetLevelLearnMove(move, out var masteryLevel) || level >= masteryLevel)
shop.SetMasteredRecordFlag(index, true);
}
}

View File

@@ -256,34 +256,32 @@ public byte GetGender(Gender gender, IGenderDetail pkPersonalInfo)
/// <summary>
/// Gets the gender to generate, random if unspecified.
/// </summary>
public byte GetGender(IGenderDetail pkPersonalInfo)
public byte GetGender(IGenderDetail info)
{
if (!pkPersonalInfo.IsDualGender)
return pkPersonalInfo.FixedGender();
if (pkPersonalInfo.Genderless)
if (!info.IsDualGender)
return info.FixedGender();
if (info.Genderless)
return 2;
if (Gender is not Gender.Random)
return (byte)Gender;
return pkPersonalInfo.RandomGender();
return info.RandomGender();
}
/// <summary>
/// Gets a random ability index (0/1/2) to generate, based off an encounter's <see cref="num"/>.
/// Gets a random ability index (0/1/2) to generate, based off an encounter's <see cref="encounter"/>.
/// </summary>
public int GetAbilityFromNumber(AbilityPermission num)
public int GetAbilityFromNumber(AbilityPermission encounter)
{
if (num.IsSingleValue(out int index)) // fixed number
if (encounter.IsSingleValue(out int index)) // fixed number
return index;
bool canBeHidden = num.CanBeHidden();
return GetAbilityIndexPreference(canBeHidden);
return GetAbilityIndexPreference(encounter);
}
private int GetAbilityIndexPreference(bool canBeHidden = false) => Ability switch
private int GetAbilityIndexPreference(AbilityPermission perm) => Ability switch
{
OnlyFirst => 0,
OnlySecond => 1,
OnlyHidden or Any12H when canBeHidden => 2, // hidden allowed
OnlyHidden or Any12H when perm.CanBeHidden() => 2, // hidden allowed
_ => Util.Rand.Next(2),
};

View File

@@ -16,7 +16,7 @@ namespace PKHeX.Core;
public bool RequiresLvlUp => LevelUpRequired != 0;
public bool InsideLevelRange(int level) => LevelMin <= level && level <= LevelMax;
public bool InsideLevelRange(byte level) => LevelMin <= level && level <= LevelMax;
public override string ToString() => $"{(Species) Species}{(Form != 0 ? $"-{Form}" : "")}}} [{LevelMin},{LevelMax}] via {Method}";

View File

@@ -55,11 +55,12 @@ private static void CheckNincadaMoves(Span<MoveResult> result, ReadOnlySpan<usho
if (move == 0)
break;
var level = moves.GetLevelLearnMove(move);
if (level == -1 || !nincada.InsideLevelRange(level))
if (!moves.TryGetLevelLearnMove(move, out var level))
continue;
if (!nincada.InsideLevelRange(level))
continue;
var info = new MoveLearnInfo(LearnMethod.ShedinjaEvo, LearnEnvironment.E, (byte)level);
var info = new MoveLearnInfo(LearnMethod.ShedinjaEvo, LearnEnvironment.E, level);
result[i] = new MoveResult(info, 0, Generation);
break; // Can only have one Ninjask move.
}

View File

@@ -47,11 +47,12 @@ private static void CheckNincadaMoves(Span<MoveResult> result, ReadOnlySpan<usho
if (move == 0)
break;
var level = moves.GetLevelLearnMove(move);
if (level == -1 || !nincada.InsideLevelRange(level))
if (!moves.TryGetLevelLearnMove(move, out var level))
continue;
if (!nincada.InsideLevelRange(level))
continue;
var info = new MoveLearnInfo(LearnMethod.ShedinjaEvo, LearnEnvironment.Pt, (byte)level);
var info = new MoveLearnInfo(LearnMethod.ShedinjaEvo, LearnEnvironment.Pt, level);
result[i] = new MoveResult(info, 0, Generation);
break; // Can only have one Ninjask move.
}

View File

@@ -46,9 +46,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo1 pi, EvoCriteria evo, usho
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = Learnsets[evo.Species];
var level = learn.GetLevelLearnMove(move);
if (level != -1 && evo.InsideLevelRange(level))
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && evo.InsideLevelRange(level))
return new(LevelUp, Game, level);
}
return default;

View File

@@ -46,9 +46,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo1 pi, EvoCriteria evo, usho
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = Learnsets[evo.Species];
var level = learn.GetLevelLearnMove(move);
if (level != -1 && evo.InsideLevelRange(level))
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && evo.InsideLevelRange(level))
return new(LevelUp, Game, level);
}
return default;

View File

@@ -62,9 +62,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo2 pi, EvoCriteria evo, usho
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && evo.InsideLevelRange(level))
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && evo.InsideLevelRange(level))
return new(LevelUp, Game, level);
}
return default;

View File

@@ -85,13 +85,12 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo2 pi, EvoCriteria evo, usho
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = Learnsets[evo.Species];
var level = learn.GetLevelLearnMove(move);
if (level != -1)
if (learn.TryGetLevelLearnMove(move, out var level))
{
if (evo.InsideLevelRange(level))
return new(LevelUp, Game, (byte)level);
return new(LevelUp, Game, level);
if (level == 1 && types.HasFlag(MoveSourceType.Evolve)) // Evolution
return new(Evolution, Game, (byte)level);
return new(Evolution, Game, level);
}
}

View File

@@ -53,9 +53,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo3 pi, EvoCriteria evo, usho
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine))

View File

@@ -53,9 +53,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo3 pi, EvoCriteria evo, usho
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine))

View File

@@ -53,9 +53,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo3 pi, EvoCriteria evo, usho
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine))

View File

@@ -52,9 +52,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo3 pi, EvoCriteria evo, usho
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine))

View File

@@ -52,9 +52,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo4 pi, EvoCriteria evo, usho
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine))

View File

@@ -52,9 +52,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo4 pi, EvoCriteria evo, usho
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine))

View File

@@ -51,9 +51,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo4 pi, EvoCriteria evo, usho
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine))

View File

@@ -50,9 +50,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo5B2W2 pi, EvoCriteria evo,
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine) && GetIsTM(pi, move))

View File

@@ -50,9 +50,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo5BW pi, EvoCriteria evo, us
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine) && GetIsTM(pi, move))

View File

@@ -50,9 +50,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo6AO pi, EvoCriteria evo, us
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine) && GetIsTM(pi, move))

View File

@@ -50,9 +50,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo6XY pi, EvoCriteria evo, us
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine) && pi.GetIsLearnTM(MachineMoves.IndexOf(move)))

View File

@@ -35,9 +35,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo7GG pi, EvoCriteria evo, us
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1) // Can relearn at any level!
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level)) // Can relearn at any level!
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine) && pi.GetIsLearnTM(MachineMoves.IndexOf(move)))

View File

@@ -52,9 +52,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo7 pi, EvoCriteria evo, usho
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1) // Can relearn at any level!
return new(LevelUp, Game, 1);
if (learn.TryGetLevelLearnMove(move, out var level)) // Can relearn at any level!
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine) && pi.GetIsLearnTM(MachineMoves.IndexOf(move)))

View File

@@ -52,9 +52,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo7 pi, EvoCriteria evo, usho
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1) // Can relearn at any level!
return new(LevelUp, Game, 1);
if (learn.TryGetLevelLearnMove(move, out var level)) // Can relearn at any level!
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine) && pi.GetIsLearnTM(MachineMoves.IndexOf(move)))

View File

@@ -53,9 +53,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo8BDSP pi, EvoCriteria evo,
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.SharedEggMove) && GetIsSharedEggMove(pi, move))
@@ -138,9 +137,8 @@ public MoveLearnInfo GetCanLearnHOME(PKM pk, EvoCriteria evo, ushort move, MoveS
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level))
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.SharedEggMove) && GetIsSharedEggMove(pi, move))

View File

@@ -42,9 +42,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo8LA pi, EvoCriteria evo, us
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine) && pi.GetIsLearnMoveShop(move))
@@ -102,9 +101,8 @@ public MoveLearnInfo GetCanLearnHOME(PKM pk, EvoCriteria evo, ushort move, MoveS
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level))
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.Machine) && pi.GetIsLearnMoveShop(move))

View File

@@ -48,9 +48,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo8SWSH pi, EvoCriteria evo,
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.SharedEggMove) && GetIsSharedEggMove(pi, move))
@@ -188,9 +187,8 @@ public MoveLearnInfo GetCanLearnHOME(PKM pk, EvoCriteria evo, ushort move, MoveS
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level))
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.SharedEggMove) && GetIsSharedEggMove(pi, move))

View File

@@ -68,9 +68,8 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo9SV pi, EvoCriteria evo, us
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1 && level <= evo.LevelMax)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level) && level <= evo.LevelMax)
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.SharedEggMove) && GetIsSharedEggMove(pi, move))
@@ -205,9 +204,8 @@ public MoveLearnInfo GetCanLearnHOME(PKM pk, EvoCriteria evo, ushort move, MoveS
if (types.HasFlag(MoveSourceType.LevelUp))
{
var learn = GetLearnset(evo.Species, evo.Form);
var level = learn.GetLevelLearnMove(move);
if (level != -1)
return new(LevelUp, Game, (byte)level);
if (learn.TryGetLevelLearnMove(move, out var level))
return new(LevelUp, Game, level);
}
if (types.HasFlag(MoveSourceType.SharedEggMove) && GetIsSharedEggMove(pi, move))

View File

@@ -221,15 +221,22 @@ public void SetEvolutionMoves(Span<ushort> moves, ReadOnlySpan<ushort> ignore, i
/// <param name="move">Move ID</param>
public bool GetIsLearn(ushort move) => Moves.AsSpan().Contains(move);
/// <summary>Returns the level that a Pokémon can learn the specified move.</summary>
/// <summary>
/// Checks if the specified move is learned by level up.
/// </summary>
/// <param name="move">Move ID</param>
/// <returns>Level the move is learned at. If the result is below 0, the move cannot be learned by leveling up.</returns>
public int GetLevelLearnMove(ushort move)
/// <param name="level">Level at which the move is learned</param>
/// <returns>True if the move is learned by level up, false otherwise.</returns>
public bool TryGetLevelLearnMove(ushort move, out byte level)
{
var index = Array.IndexOf(Moves, move);
if (index == -1)
return -1;
return Levels[index];
{
level = 0;
return false;
}
level = Levels[index];
return true;
}
public ReadOnlySpan<ushort> GetBaseEggMoves(byte level)

View File

@@ -154,9 +154,8 @@ private static int AddMasteredMissing(PA8 pa, Span<ushort> current, int ctr, Lea
// Check if we can swap it into the moveset after it evolves.
var move = purchased[i];
var baseLevel = baseLearn.GetLevelLearnMove(move);
var mustKnow = baseLevel is not -1 && baseLevel <= pa.MetLevel;
if (!mustKnow && currentLearn.GetLevelLearnMove(move) != level)
var mustKnow = baseLearn.TryGetLevelLearnMove(move, out var baseLevel) && baseLevel <= pa.MetLevel;
if (!mustKnow && currentLearn.TryGetLevelLearnMove(move, out var c2) && c2 != level)
continue;
if (!current.Contains(move))
@@ -229,8 +228,7 @@ private static bool CanLearnMoveByLevelUp(LegalityAnalysis data, PA8 pa, int i,
foreach (var evo in data.Info.EvoChainsAllGens.Gen8a)
{
var moveset = LearnSource8LA.Instance.GetLearnset(evo.Species, evo.Form);
var lvl = moveset.GetLevelLearnMove(moves[i]);
if (lvl == -1)
if (!moveset.TryGetLevelLearnMove(moves[i], out var lvl))
continue; // cannot learn via level up
level = Math.Min(lvl, level);
}

View File

@@ -76,8 +76,9 @@ public static bool IsValidPurchasedEncounter(this IMoveShop8 shop, Learnset lear
var move = permit[i];
// Can only purchase a move if it is not already in the available learnset.
var learnLevel = learn.GetLevelLearnMove(move);
if ((uint)learnLevel <= level)
if (!learn.TryGetLevelLearnMove(move, out var learnLevel))
return false;
if (learnLevel <= level)
return false;
// Can only purchase an Alpha Move if it was pre-1.1 patch.
@@ -101,15 +102,14 @@ public static bool IsValidMasteredEncounter(this IMoveShop8Mastery shop, Span<us
bool purchased = shop.GetPurchasedRecordFlag(index);
bool mastered = shop.GetMasteredRecordFlag(index);
var masteryLevel = mastery.GetLevelLearnMove(move);
if (masteryLevel > metLevel && move != alphaMove) // no master flag set
if (mastery.TryGetLevelLearnMove(move, out var masteryLevel) && masteryLevel > metLevel && move != alphaMove)
{
if (!mastered)
continue;
if (purchased)
continue;
// Check for seed of mastery usage
if (learn.GetLevelLearnMove(move) > metLevel)
if (learn.TryGetLevelLearnMove(move, out var learnLevel) && learnLevel > metLevel)
return false;
}
else