From 84cc366803ace8cb9b8ca5af496fa7f9b042f24c Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 17 Sep 2017 13:07:12 -0700 Subject: [PATCH] Swap markings in gen3 Closes #1463 --- PKHeX.Core/PKM/CK3.cs | 2 +- PKHeX.Core/PKM/PK3.cs | 2 +- PKHeX.Core/PKM/PKM.cs | 8 ++++++++ PKHeX.Core/PKM/XK3.cs | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/PKHeX.Core/PKM/CK3.cs b/PKHeX.Core/PKM/CK3.cs index 3c937f592..31162a501 100644 --- a/PKHeX.Core/PKM/CK3.cs +++ b/PKHeX.Core/PKM/CK3.cs @@ -178,7 +178,7 @@ public CK3(byte[] decryptedData = null, string ident = null) public override int AbilityNumber { get => 1 << Data[0xCC]; set => Data[0xCC] = (byte)((value >> 1) & 1); } public override bool Valid { get => Data[0xCD] == 0; set { if (value) Data[0xCD] = 0; } } // 0xCE unknown - public override int MarkValue { get => Data[0xCF]; protected set => Data[0xCF] = (byte)value; } + public override int MarkValue { get => SwapBits(Data[0xCF], 1, 2); protected set => Data[0xCF] = (byte)SwapBits(value, 1, 2); } public override int PKRS_Days { get => Math.Max((sbyte)Data[0xD0], (sbyte)0); set => Data[0xD0] = (byte)(value == 0 ? 0xFF : value & 0xF); } public int ShadowID { get => BigEndian.ToUInt16(Data, 0xD8); set => BigEndian.GetBytes((ushort)value).CopyTo(Data, 0xD8); } public int Purification { get => BigEndian.ToInt32(Data, 0xDC); set => BigEndian.GetBytes(value).CopyTo(Data, 0xDC); } diff --git a/PKHeX.Core/PKM/PK3.cs b/PKHeX.Core/PKM/PK3.cs index aceac23a6..0f3b94dca 100644 --- a/PKHeX.Core/PKM/PK3.cs +++ b/PKHeX.Core/PKM/PK3.cs @@ -51,7 +51,7 @@ public PK3(byte[] decryptedData = null, string ident = null) public override string Nickname { get => GetString(0x08, 10); set => SetString(IsEgg ? "タマゴ" : value, 10).CopyTo(Data, 0x08); } public override int Language { get => BitConverter.ToUInt16(Data, 0x12) & 0xFF; set => BitConverter.GetBytes((ushort)(IsEgg ? 0x601 : value | 0x200)).CopyTo(Data, 0x12); } public override string OT_Name { get => GetString(0x14, 7); set => SetString(value, 7).CopyTo(Data, 0x14); } - public override int MarkValue { get => Data[0x1B]; protected set => Data[0x1B] = (byte)value; } + public override int MarkValue { get => SwapBits(Data[0x1B], 1, 2); protected set => Data[0x1B] = (byte)SwapBits(value, 1, 2); } public override ushort Checksum { get => BitConverter.ToUInt16(Data, 0x1C); set => BitConverter.GetBytes(value).CopyTo(Data, 0x1C); } public override ushort Sanity { get => BitConverter.ToUInt16(Data, 0x1E); set => BitConverter.GetBytes(value).CopyTo(Data, 0x1E); } diff --git a/PKHeX.Core/PKM/PKM.cs b/PKHeX.Core/PKM/PKM.cs index d19930e23..af4bf9297 100644 --- a/PKHeX.Core/PKM/PKM.cs +++ b/PKHeX.Core/PKM/PKM.cs @@ -333,6 +333,14 @@ 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) + { + int bit1 = (n >> p1) & 1; + int bit2 = (n >> p2) & 1; + int x = bit1 ^ bit2; + x = (x << p1) | (x << p2); + return n ^ x; + } public string ShowdownText => ShowdownSet.GetShowdownText(this); public string[] QRText => this.GetQRLines(); diff --git a/PKHeX.Core/PKM/XK3.cs b/PKHeX.Core/PKM/XK3.cs index bfc61c7cc..8528183a2 100644 --- a/PKHeX.Core/PKM/XK3.cs +++ b/PKHeX.Core/PKM/XK3.cs @@ -64,7 +64,7 @@ public XK3(byte[] decryptedData = null, string ident = null) public override int Stat_Level { get => Data[0x11]; set => Data[0x11] = (byte)value; } public override int CNT_Sheen { get => Data[0x12]; set => Data[0x12] = (byte)value; } public override int PKRS_Strain { get => Data[0x13] & 0xF; set => Data[0x13] = (byte)(value & 0xF); } - public override int MarkValue { get => Data[0x14]; protected set => Data[0x14] = (byte)value; } + public override int MarkValue { get => SwapBits(Data[0x14], 1, 2); protected set => Data[0x14] = (byte)SwapBits(value, 1, 2); } public override int PKRS_Days { get => Math.Max((sbyte)Data[0x15], (sbyte)0); set => Data[0x15] = (byte)(value == 0 ? 0xFF : value & 0xF); } // 0x16-0x1C Battle Related private int XDPKMFLAGS { get => Data[0x1D]; set => Data[0x1D] = (byte)value; }