From b3118afa3bbb5cbcad8e45fd9cba18803be7f94f Mon Sep 17 00:00:00 2001 From: Kamron Batman Date: Tue, 11 Apr 2017 14:07:16 -0700 Subject: [PATCH] Fixes gen 5 force-shiny generation. (#1052) Replicates the ingame PID generation for Forced Shiny --- PKHeX/MysteryGifts/PGF.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/PKHeX/MysteryGifts/PGF.cs b/PKHeX/MysteryGifts/PGF.cs index 20c330afb..931d50835 100644 --- a/PKHeX/MysteryGifts/PGF.cs +++ b/PKHeX/MysteryGifts/PGF.cs @@ -14,7 +14,7 @@ public PGF(byte[] data = null) if (data == null) Data = new byte[Size]; else Data = (byte[])data.Clone(); } - + public ushort TID { get { return BitConverter.ToUInt16(Data, 0x00); } set { BitConverter.GetBytes(value).CopyTo(Data, 0x00); } } public ushort SID { get { return BitConverter.ToUInt16(Data, 0x02); } set { BitConverter.GetBytes(value).CopyTo(Data, 0x02); } } public int OriginGame { get { return Data[0x04]; } set { Data[0x04] = (byte)value; } } @@ -89,7 +89,7 @@ public override string CardTitle // Card Attributes public override int Item { get { return BitConverter.ToUInt16(Data, 0x00); } set { BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x00); } } - + private ushort Year { get { return BitConverter.ToUInt16(Data, 0xAE); } set { BitConverter.GetBytes(value).CopyTo(Data, 0xAE); } } private byte Month { get { return Data[0xAD]; } set { Data[0xAD] = value; } } private byte Day { get { return Data[0xAC]; } set { Data[0xAC] = value; } } @@ -137,7 +137,7 @@ public override int CardID public int CardType { get { return Data[0xB3]; } set { Data[0xB3] = (byte)value; } } public override bool GiftUsed { get { return Data[0xB4] >> 1 > 0; } set { Data[0xB4] = (byte)(Data[0xB4] & ~2 | (value ? 2 : 0)); } } public bool MultiObtain { get { return Data[0xB4] == 1; } set { Data[0xB4] = (byte)(value ? 1 : 0); } } - + // Meta Accessible Properties public int[] IVs => new[] { IV_HP, IV_ATK, IV_DEF, IV_SPE, IV_SPA, IV_SPD }; public bool IsNicknamed => Nickname.Length > 0; @@ -253,20 +253,24 @@ public override PKM convertToPKM(SaveFile SAV) pk.HiddenAbility = av == 2; pk.Ability = PersonalTable.B2W2.getAbilities(Species, pk.AltForm)[av]; - if (PID != 0) + if (PID != 0) pk.PID = PID; else { pk.PID = Util.rnd32(); // Force Ability if (av == 0) pk.PID &= 0xFFFEFFFF; else pk.PID |= 0x10000; + // Force Gender do { pk.PID = (pk.PID & 0xFFFFFF00) | Util.rnd32() & 0xFF; } while (!pk.getGenderIsValid()); + if (PIDType == 2) // Force Shiny { uint gb = pk.PID & 0xFF; - pk.PID = (uint)(((gb ^ pk.TID ^ pk.SID) & 0xFFFE) << 16) | gb; - if (av == 0) pk.PID &= 0xFFFEFFFE; else pk.PID |= 0x10001; + + pk.PID = (uint)((gb ^ pk.TID ^ pk.SID) << 16) | gb; + + if (av == 1) pk.PID |= 0x10000; else pk.PID &= 0xFFFEFFFF; } else if (PIDType != 1) // Force Not Shiny {