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();