diff --git a/PKHeX.Core/Legality/RNG/MethodFinder.cs b/PKHeX.Core/Legality/RNG/MethodFinder.cs index c3007e3fb..472a8470d 100644 --- a/PKHeX.Core/Legality/RNG/MethodFinder.cs +++ b/PKHeX.Core/Legality/RNG/MethodFinder.cs @@ -266,8 +266,9 @@ private static bool GetG5MGShinyMatch(PKM pk, uint pid, out PIDIV pidiv) // generation 5 shiny PIDs if (low <= 0xFF) { - var high = pid >> 16; - if (((pk.TID ^ pk.SID ^ low) - high & 0xFFFE) == 0) + var av = (pid >> 16) & 1; + var genPID = PIDGenerator.GetMG5ShinyPID(low, av, pk.TID, pk.SID); + if (genPID == pid) { pidiv = new PIDIV {NoSeed = true, Type = PIDType.G5MGShiny}; return true; diff --git a/PKHeX.Core/Legality/RNG/PIDGenerator.cs b/PKHeX.Core/Legality/RNG/PIDGenerator.cs index 68406fa2e..babb1de77 100644 --- a/PKHeX.Core/Legality/RNG/PIDGenerator.cs +++ b/PKHeX.Core/Legality/RNG/PIDGenerator.cs @@ -142,5 +142,13 @@ public static void SetValuesFromSeed(PKM pk, PIDType type, uint seed) break; } } + + public static uint GetMG5ShinyPID(uint gval, uint av, int TID, int SID) + { + uint PID = (uint)((TID ^ SID ^ gval) << 16 | gval); + if ((PID & 0x10000) != av << 16) + PID ^= 0x10000; + return PID; + } } } diff --git a/PKHeX.Core/MysteryGifts/PGF.cs b/PKHeX.Core/MysteryGifts/PGF.cs index 71bc47848..4b26e8380 100644 --- a/PKHeX.Core/MysteryGifts/PGF.cs +++ b/PKHeX.Core/MysteryGifts/PGF.cs @@ -269,13 +269,11 @@ public override PKM ConvertToPKM(SaveFile SAV) if (PIDType == 2) // Force Shiny { uint gb = pk.PID & 0xFF; - pk.PID = (uint)((gb ^ pk.TID ^ pk.SID) << 16) | gb; - // double check forced ability - if (av == 1) pk.PID |= 0x10001; else pk.PID &= 0xFFFEFFFE; + pk.PID = PIDGenerator.GetMG5ShinyPID(gb, (uint)av, pk.TID, pk.SID); } else if (PIDType != 1) // Force Not Shiny { - if (((pk.PID >> 16) ^ (pk.PID & 0xffff) ^ pk.SID ^ pk.TID) < 8) + if (pk.IsShiny) pk.PID ^= 0x10000000; } } diff --git a/PKHeX.Core/PKM/PKM.cs b/PKHeX.Core/PKM/PKM.cs index af4bf9297..e37c90a20 100644 --- a/PKHeX.Core/PKM/PKM.cs +++ b/PKHeX.Core/PKM/PKM.cs @@ -333,13 +333,21 @@ public int GenNumber public int MarkHeart { get => Markings[3]; set { var marks = Markings; marks[3] = value; Markings = marks; } } public int MarkStar { get => Markings[4]; set { var marks = Markings; marks[4] = value; Markings = marks; } } public int MarkDiamond { get => Markings[5]; set { var marks = Markings; marks[5] = value; Markings = marks; } } - protected int SwapBits(int n, int p1, int p2) + /// + /// Swaps bits at a given position + /// + /// Value to swap bits for + /// Position of first bit to be swapped + /// Position of second bit to be swapped + /// Generation 3 marking values are swapped (Square-Triangle, instead of Triangle-Square). + /// Swapped bits value + protected static int SwapBits(int value, int p1, int p2) { - int bit1 = (n >> p1) & 1; - int bit2 = (n >> p2) & 1; + int bit1 = (value >> p1) & 1; + int bit2 = (value >> p2) & 1; int x = bit1 ^ bit2; x = (x << p1) | (x << p2); - return n ^ x; + return value ^ x; } public string ShowdownText => ShowdownSet.GetShowdownText(this); public string[] QRText => this.GetQRLines();