Update gen5 shiny PID generating

Closes #1460
https://pastebin.com/GgcMjmwd
This commit is contained in:
Kurt 2017-09-17 14:43:28 -07:00
parent 84cc366803
commit ad69420ad9
4 changed files with 25 additions and 10 deletions

View file

@ -266,8 +266,9 @@ namespace PKHeX.Core
// 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;

View file

@ -142,5 +142,13 @@
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;
}
}
}

View file

@ -269,13 +269,11 @@ namespace PKHeX.Core
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;
}
}

View file

@ -333,13 +333,21 @@ namespace PKHeX.Core
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)
/// <summary>
/// Swaps bits at a given position
/// </summary>
/// <param name="value">Value to swap bits for</param>
/// <param name="p1">Position of first bit to be swapped</param>
/// <param name="p2">Position of second bit to be swapped</param>
/// <remarks>Generation 3 marking values are swapped (Square-Triangle, instead of Triangle-Square).</remarks>
/// <returns>Swapped bits value</returns>
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();