From 09bfe5bd95e4fd77ba4f6fbb574a2e623f8462d4 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 30 Jan 2021 19:42:58 -0800 Subject: [PATCH] Enforce shadow locks when generating a ck3/xk3 from criteria --- .../EncounterStatic/EncounterStaticShadow.cs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStaticShadow.cs b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStaticShadow.cs index 327de0185..aa85d76f0 100644 --- a/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStaticShadow.cs +++ b/PKHeX.Core/Legality/Encounters/EncounterStatic/EncounterStaticShadow.cs @@ -75,5 +75,39 @@ protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteri base.ApplyDetails(sav, criteria, pk); ((IRibbonSetEvent3)pk).RibbonNational = true; } + + protected override void SetPINGA(PKM pk, EncounterCriteria criteria) + { + var pi = pk.PersonalInfo; + int gender = criteria.GetGender(-1, pi); + int nature = (int)criteria.GetNature(Nature.Random); + int ability = criteria.GetAbilityFromNumber(0, pi); + + // Ensure that any generated specimen has valid Shadow Locks + // This can be kinda slow, depending on how many locks / how strict they are. + // Cancel this operation if too many attempts are made to prevent infinite loops. + int ctr = 0; + const int max = 100_000; + do + { + PIDGenerator.SetRandomWildPID(pk, 3, nature, ability, gender, PIDType.CXD); + var pidiv = MethodFinder.Analyze(pk); + var result = LockFinder.IsAllShadowLockValid(this, pidiv, pk); + if (result) + break; + } + while (++ctr <= max); + +#if DEBUG + System.Diagnostics.Debug.Assert(ctr < 100_000); +#endif + + // E-Reader have all IVs == 0 + if (EReader) + { + for (int i = 0; i < IVs.Count; i++) + pk.SetIV(i, 0); + } + } } }