diff --git a/PKHeX.Core/Legality/Encounters/Generator/EncounterCriteria.cs b/PKHeX.Core/Legality/Encounters/Generator/EncounterCriteria.cs index 570738d3c..402998b7e 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/EncounterCriteria.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/EncounterCriteria.cs @@ -55,6 +55,16 @@ public EncounterCriteria() HiddenPowerType = -1; } + public EncounterCriteria WithoutIVs() => this with + { + IV_HP = RandomIV, + IV_ATK = RandomIV, + IV_DEF = RandomIV, + IV_SPA = RandomIV, + IV_SPD = RandomIV, + IV_SPE = RandomIV, + }; + public bool IsSatisfiedHiddenPower(uint iv32) => HiddenPower.GetType(iv32) == HiddenPowerType; private const sbyte RandomIV = -1; diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterStatic8Nest.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterStatic8Nest.cs index 9fe4a4a3b..147049cd6 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterStatic8Nest.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen8/EncounterStatic8Nest.cs @@ -113,7 +113,10 @@ private void SetPINGA(PK8 pk, EncounterCriteria criteria, PersonalInfo8SWSH pi) } while (++ctr < max); if (ctr == max) // fail - while (!TryApply(pk, seed = rand.Next(), iv, param, EncounterCriteria.Unrestricted)) { } + { + if (!TryApply(pk, seed = rand.Next(), iv, param, criteria.WithoutIVs())) + while (!TryApply(pk, seed = rand.Next(), iv, param, EncounterCriteria.Unrestricted)) { } + } FinishCorrelation(pk, seed); if (criteria.IsSpecifiedNature() && criteria.Nature != pk.Nature && criteria.Nature.IsMint()) diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterDist9.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterDist9.cs index 3c48a9807..2926a63aa 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterDist9.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterDist9.cs @@ -279,7 +279,7 @@ private void SetPINGA(PK9 pk, EncounterCriteria criteria, PersonalInfo9SV pi) var init = Util.Rand.Rand64(); var success = this.TryApply32(pk, init, param, criteria); - if (!success) + if (!success && !this.TryApply32(pk, init, param, criteria.WithoutIVs())) this.TryApply32(pk, init, param, EncounterCriteria.Unrestricted); } #endregion diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterMight9.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterMight9.cs index 8043551ce..f1313d402 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterMight9.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterMight9.cs @@ -296,7 +296,7 @@ private void SetPINGA(PK9 pk, EncounterCriteria criteria, PersonalInfo9SV pi) var init = Util.Rand.Rand64(); var success = this.TryApply32(pk, init, param, criteria); - if (!success) + if (!success && !this.TryApply32(pk, init, param, criteria.WithoutIVs())) this.TryApply32(pk, init, param, EncounterCriteria.Unrestricted); } #endregion diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterStatic9.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterStatic9.cs index 9e084319d..bd98c1a90 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterStatic9.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterStatic9.cs @@ -146,9 +146,9 @@ private void SetPINGA(PK9 pk, EncounterCriteria criteria, PersonalInfo9SV pi) Ability, Shiny); ulong init = Util.Rand.Rand64(); - var success = this.TryApply64(pk, init, param, criteria, IVs.IsSpecified); - if (!success) - this.TryApply64(pk, init, param, EncounterCriteria.Unrestricted, IVs.IsSpecified); + var success = this.TryApply64(pk, init, param, criteria); + if (!success && !this.TryApply64(pk, init, param, criteria.WithoutIVs())) + this.TryApply64(pk, init, param, EncounterCriteria.Unrestricted); if (IVs.IsSpecified) { pk.IV_HP = IVs.HP; diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterTera9.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterTera9.cs index 3da64720c..76bf7d330 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterTera9.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen9/EncounterTera9.cs @@ -217,7 +217,7 @@ private void SetPINGA(PK9 pk, EncounterCriteria criteria, PersonalInfo9SV pi) var init = Util.Rand.Rand64(); var success = this.TryApply32(pk, init, param, criteria); - if (!success) + if (!success && !this.TryApply32(pk, init, param, criteria.WithoutIVs())) this.TryApply32(pk, init, param, EncounterCriteria.Unrestricted); } #endregion diff --git a/PKHeX.Core/Legality/RNG/Methods/Gen9/Encounter9RNG.cs b/PKHeX.Core/Legality/RNG/Methods/Gen9/Encounter9RNG.cs index 4f08a7bf9..2a5612198 100644 --- a/PKHeX.Core/Legality/RNG/Methods/Gen9/Encounter9RNG.cs +++ b/PKHeX.Core/Legality/RNG/Methods/Gen9/Encounter9RNG.cs @@ -32,7 +32,7 @@ public static bool TryApply32(this TEnc enc, PK9 pk, in ulong init, in Gen return false; } - public static bool TryApply64(this TEnc enc, PK9 pk, in ulong init, in GenerateParam9 param, EncounterCriteria criteria, bool ignoreIVs) + public static bool TryApply64(this TEnc enc, PK9 pk, in ulong init, in GenerateParam9 param, EncounterCriteria criteria) where TEnc : ISpeciesForm, IGemType { var rand = new Xoroshiro128Plus(init); @@ -40,7 +40,7 @@ public static bool TryApply64(this TEnc enc, PK9 pk, in ulong init, in Gen for (int ctr = 0; ctr < maxCtr; ctr++) { ulong seed = rand.Next(); // fake cryptosecure - if (!GenerateData(pk, param, criteria, seed, ignoreIVs)) + if (!GenerateData(pk, param, criteria, seed)) continue; var type = Tera9RNG.GetTeraType(seed, enc.TeraType, enc.Species, enc.Form);