From a64d08e7e9bf4bafa510cf93d0d859db86592295 Mon Sep 17 00:00:00 2001 From: Kurt Date: Wed, 14 Nov 2018 18:25:43 -0800 Subject: [PATCH] Add GO transfer IV verification --- .../Verifiers/IndividualValueVerifier.cs | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/PKHeX.Core/Legality/Verifiers/IndividualValueVerifier.cs b/PKHeX.Core/Legality/Verifiers/IndividualValueVerifier.cs index 636e5247f..7fbf3671e 100644 --- a/PKHeX.Core/Legality/Verifiers/IndividualValueVerifier.cs +++ b/PKHeX.Core/Legality/Verifiers/IndividualValueVerifier.cs @@ -79,10 +79,32 @@ private static bool GetIsFixedIVSequenceValid(IReadOnlyList IVs, IReadOnlyL private void VerifyIVsSlot(LegalityAnalysis data, EncounterSlot w) { + switch (w.Generation) + { + case 6: VerifyIVsGen6(data, w); break; + case 7: VerifyIVsGen7(data); break; + } + } + + private void VerifyIVsGen7(LegalityAnalysis data) + { + var pkm = data.pkm; - if (w.Generation == 7 && pkm.AbilityNumber == 4) // SOS + if (pkm.GG) + { + if (pkm.Version == (int)GameVersion.GO) + VerifyIVsGoTransfer(data); + } + else if (pkm.AbilityNumber == 4) + { VerifyIVsFlawless(data, 2); // Chain of 10 yields 5% HA and 2 flawless IVs - else if (pkm.XY && PersonalTable.XY[data.EncounterMatch.Species].IsEggGroup(15)) // Undiscovered + } + } + + private void VerifyIVsGen6(LegalityAnalysis data, EncounterSlot w) + { + var pkm = data.pkm; + if (pkm.XY && PersonalTable.XY[data.EncounterMatch.Species].IsEggGroup(15)) // Undiscovered VerifyIVsFlawless(data, 3); else if (w.Type == SlotType.FriendSafari) VerifyIVsFlawless(data, 2); @@ -99,5 +121,26 @@ private void VerifyIVsStatic(LegalityAnalysis data, EncounterStatic s) if (s.FlawlessIVCount != 0) VerifyIVsFlawless(data, s.FlawlessIVCount); } + + private void VerifyIVsGoTransfer(LegalityAnalysis data) + { + if (!IsGoIVSetValid(data.pkm)) + data.AddLine(GetInvalid(LEncGiftIVMismatch)); + } + + private static bool IsGoIVSetValid(PKM pkm) + { + // Stamina*2 | 1 -> HP + // ATK * 2 | 1 -> ATK&SPA + // DEF * 2 | 1 -> DEF&SPD + // Speed is random. + + // All IVs must be odd (except speed) and equal to their counterpart. + if ((pkm.GetIV(1) & 1) != 1 || pkm.GetIV(1) != pkm.GetIV(4)) // ATK=SPA + return false; + if ((pkm.GetIV(2) & 1) != 1 || pkm.GetIV(2) != pkm.GetIV(5)) // DEF=SPD + return false; + return (pkm.GetIV(0) & 1) == 1; // HP + } } } \ No newline at end of file