diff --git a/PKHeX.Core/Game/GameStrings/LocationSet/LocationSet0.cs b/PKHeX.Core/Game/GameStrings/LocationSet/LocationSet0.cs index 6dcd22d4e..4668d1ae9 100644 --- a/PKHeX.Core/Game/GameStrings/LocationSet/LocationSet0.cs +++ b/PKHeX.Core/Game/GameStrings/LocationSet/LocationSet0.cs @@ -7,6 +7,7 @@ namespace PKHeX.Core; /// Generation 2-3 specific met location name holder. /// /// Single segment, no shift bias. +/// List of location names for bank 0. public sealed record LocationSet0(string[] Met0) : ILocationSet { public ReadOnlySpan GetLocationNames(int bankID) => bankID switch diff --git a/PKHeX.Core/Game/GameStrings/LocationSet/LocationSet4.cs b/PKHeX.Core/Game/GameStrings/LocationSet/LocationSet4.cs index ca614fcad..94a616ff0 100644 --- a/PKHeX.Core/Game/GameStrings/LocationSet/LocationSet4.cs +++ b/PKHeX.Core/Game/GameStrings/LocationSet/LocationSet4.cs @@ -7,6 +7,9 @@ namespace PKHeX.Core; /// Generation 4 specific met location name holder. /// /// Multi-segment, small gaps. +/// List of location names for bank 0. +/// List of location names for bank 2 (2000). +/// List of location names for bank 3 (3000). public sealed record LocationSet4(string[] Met0, string[] Met2, string[] Met3) : ILocationSet { public ReadOnlySpan GetLocationNames(int bankID) => bankID switch diff --git a/PKHeX.Core/Game/GameStrings/LocationSet/LocationSet6.cs b/PKHeX.Core/Game/GameStrings/LocationSet/LocationSet6.cs index cf2919edf..ee670f4bf 100644 --- a/PKHeX.Core/Game/GameStrings/LocationSet/LocationSet6.cs +++ b/PKHeX.Core/Game/GameStrings/LocationSet/LocationSet6.cs @@ -7,6 +7,10 @@ namespace PKHeX.Core; /// Generation 5+ specific met location name holder. /// /// Multi-segment, large gaps. +/// List of location names for bank 0. +/// List of location names for bank 3 (30000). +/// List of location names for bank 4 (40000). +/// List of location names for bank 6 (60000). public sealed record LocationSet6(string[] Met0, string[] Met3, string[] Met4, string[] Met6) : ILocationSet { public ReadOnlySpan GetLocationNames(int bankID) => bankID switch diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen8a/EncounterSlot8a.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen8a/EncounterSlot8a.cs index a5f2f9142..ed204b02e 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen8a/EncounterSlot8a.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen8a/EncounterSlot8a.cs @@ -69,16 +69,17 @@ public PA8 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) private void SetPINGA(PA8 pk, EncounterCriteria criteria, PersonalInfo8LA pi) { var para = GetParams(pi); + bool checkLevel = criteria.IsSpecifiedLevelRange() && this.IsLevelWithinRange(criteria); while (true) { var (_, slotSeed) = Overworld8aRNG.ApplyDetails(pk, criteria, para, HasAlphaMove); if (this.IsRandomLevel()) { // Give a random level according to the RNG correlation. - var lvl = Overworld8aRNG.GetRandomLevel(slotSeed, LevelMin, LevelMax); - if (criteria.IsSpecifiedLevelRange() && !criteria.IsSatisfiedLevelRange(lvl)) + var level = Overworld8aRNG.GetRandomLevel(slotSeed, LevelMin, LevelMax); + if (checkLevel && !criteria.IsSatisfiedLevelRange(level)) continue; - pk.MetLevel = pk.CurrentLevel = lvl; + pk.MetLevel = pk.CurrentLevel = level; } break; } diff --git a/PKHeX.Core/Legality/Encounters/Templates/Interfaces/Properties/ILevelRange.cs b/PKHeX.Core/Legality/Encounters/Templates/Interfaces/Properties/ILevelRange.cs index 591c8b1bc..a010c0bde 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Interfaces/Properties/ILevelRange.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Interfaces/Properties/ILevelRange.cs @@ -42,6 +42,9 @@ public static class LevelRangeExtensions /// public static bool IsLevelWithinRange(int level, int min, int max) => min <= level && level <= max; + /// + public static bool IsLevelWithinRange(this ILevelRange r, T other) where T : ILevelRange => IsLevelWithinRange(r, other.LevelMin, other.LevelMax); + /// /// Gets if the specified level inputs are within range of the and /// diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/GenerateMethodH.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/GenerateMethodH.cs index 913e37e93..d85f64f5c 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/GenerateMethodH.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen3/GenerateMethodH.cs @@ -14,6 +14,7 @@ public static void SetRandom(this T enc, PK3 pk, PersonalInfo3 pi, EncounterC var gr = pi.Gender; var (min, max) = SlotMethodH.GetRange(enc.Type, enc.SlotNumber); bool checkProc = MethodH.IsEncounterCheckApplicable(enc.Type); + bool checkLevel = criteria.IsSpecifiedLevelRange() && enc.IsLevelWithinRange(criteria); // Generate Method H correlated PID and IVs, no lead (keep things simple). while (true) @@ -57,7 +58,7 @@ public static void SetRandom(this T enc, PK3 pk, PersonalInfo3 pi, EncounterC { var level = (byte)MethodH.GetRandomLevel(enc, lv, LeadRequired.None); - if (criteria.IsSpecifiedLevelRange() && !criteria.IsSatisfiedLevelRange(level)) + if (checkLevel && !criteria.IsSatisfiedLevelRange(level)) break; // try again pk.MetLevel = pk.CurrentLevel = level; } diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodJ.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodJ.cs index 8e039e9f9..5d1e822d1 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodJ.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodJ.cs @@ -24,6 +24,7 @@ public static uint SetRandomJ(this T enc, PK4 pk, PersonalInfo4 pi, Encounter var (min, max) = SlotMethodJ.GetRange(enc.Type, enc.SlotNumber); bool randLevel = MethodJ.IsLevelRand(enc); bool checkProc = MethodJ.IsEncounterCheckApplicable(enc.Type); + bool checkLevel = criteria.IsSpecifiedLevelRange() && enc.IsLevelWithinRange(criteria); // Generate Method J correlated PID and IVs, no lead (keep things simple). while (true) @@ -82,7 +83,7 @@ public static uint SetRandomJ(this T enc, PK4 pk, PersonalInfo4 pi, Encounter if (randLevel) { var level = (byte)MethodJ.GetRandomLevel(enc, lv, LeadRequired.None); - if (criteria.IsSpecifiedLevelRange() && !criteria.IsSatisfiedLevelRange(level)) + if (checkLevel && !criteria.IsSatisfiedLevelRange(level)) break; // try again pk.MetLevel = pk.CurrentLevel = level; } diff --git a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodK.cs b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodK.cs index 3dd97c49d..f600d8ac7 100644 --- a/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodK.cs +++ b/PKHeX.Core/Legality/RNG/ClassicEra/Gen4/GenerateMethodK.cs @@ -25,6 +25,7 @@ public static uint SetRandomK(this T enc, PK4 pk, PersonalInfo4 pi, Encounter bool randLevel = MethodK.IsLevelRand(enc); var modulo = enc.Type.IsSafari() ? 10u : 100u; bool checkProc = MethodK.IsEncounterCheckApplicable(enc.Type); + bool checkLevel = criteria.IsSpecifiedLevelRange() && enc.IsLevelWithinRange(criteria); // Generate Method K correlated PID and IVs, no lead (keep things simple). while (true) @@ -79,7 +80,7 @@ public static uint SetRandomK(this T enc, PK4 pk, PersonalInfo4 pi, Encounter if (randLevel) { var level = (byte)MethodK.GetRandomLevel(enc, lv, LeadRequired.None); - if (criteria.IsSpecifiedLevelRange() && !criteria.IsSatisfiedLevelRange(level)) + if (checkLevel && !criteria.IsSatisfiedLevelRange(level)) break; // try again pk.MetLevel = pk.CurrentLevel = level; }