diff --git a/PKHeX/MainWindow/Main.cs b/PKHeX/MainWindow/Main.cs index 25ea01660..5277d905b 100644 --- a/PKHeX/MainWindow/Main.cs +++ b/PKHeX/MainWindow/Main.cs @@ -1448,14 +1448,31 @@ private void setIsShiny(object sender) private void setMarkings() { PictureBox[] pba = { PB_Mark1, PB_Mark2, PB_Mark3, PB_Mark4, PB_Mark5, PB_Mark6 }; - for (int i = 0; i < 6; i++) - pba[i].Image = Util.ChangeOpacity(pba[i].InitialImage, pkm.Markings[i] ? 1 : 0.1); + for (int i = 0; i < pba.Length; i++) + pba[i].Image = Util.ChangeOpacity(pba[i].InitialImage, pkm.Markings[i] != 0 ? 1 : 0.1); PB_MarkShiny.Image = Util.ChangeOpacity(PB_MarkShiny.InitialImage, !BTN_Shinytize.Enabled ? 1 : 0.1); PB_MarkCured.Image = Util.ChangeOpacity(PB_MarkCured.InitialImage, CHK_Cured.Checked ? 1 : 0.1); PB_MarkPentagon.Image = Util.ChangeOpacity(PB_MarkPentagon.InitialImage, pkm.Gen6 ? 1 : 0.1); + + // Gen7 Markings + if (pkm.Format != 7) + return; + PB_MarkAlola.Image = Util.ChangeOpacity(PB_MarkAlola.InitialImage, pkm.Gen7 ? 1 : 0.1); + for (int i = 0; i < pba.Length; i++) + { + switch (pkm.Markings[i]) + { + case 1: + pba[i].Image = Util.ChangeAllColorTo(pba[i].Image, Color.FromArgb(000, 191, 255)); + break; + case 2: + pba[i].Image = Util.ChangeAllColorTo(pba[i].Image, Color.FromArgb(255, 117, 179)); + break; + } + } } // Clicked Label Shortcuts // private void clickQR(object sender, EventArgs e) @@ -1554,9 +1571,25 @@ private void clickMarking(object sender, EventArgs e) { PictureBox[] pba = { PB_Mark1, PB_Mark2, PB_Mark3, PB_Mark4, PB_Mark5, PB_Mark6 }; int index = Array.IndexOf(pba, sender); - bool[] markings = pkm.Markings; - markings[index] ^= true; - pkm.Markings = markings; + + // Handling Gens 3-6 + int[] markings = pkm.Markings; + switch (pkm.Format) + { + case 3: + case 4: + case 5: + case 6: // on/off + markings[index] ^= 1; // toggle + pkm.Markings = markings; + break; + case 7: // 0 (none) | 1 (blue) | 2 (pink) + markings[index] = (markings[index]+1)%3; // cycle + pkm.Markings = markings; + break; + default: + return; + } setMarkings(); } private void clickStatLabel(object sender, MouseEventArgs e) diff --git a/PKHeX/PKM/BK4.cs b/PKHeX/PKM/BK4.cs index 42503f726..1c83b347c 100644 --- a/PKHeX/PKM/BK4.cs +++ b/PKHeX/PKM/BK4.cs @@ -62,7 +62,7 @@ public override uint EXP } public override int OT_Friendship { get { return Data[0x14]; } set { Data[0x14] = (byte)value; } } public override int Ability { get { return Data[0x15]; } set { Data[0x15] = (byte)value; } } - public override byte MarkByte { get { return Data[0x16]; } protected set { Data[0x16] = value; } } + public override int MarkValue { get { return Data[0x16]; } protected set { Data[0x16] = (byte)value; } } public override int Language { get { return Data[0x17]; } set { Data[0x17] = (byte)value; } } public override int EV_HP { get { return Data[0x18]; } set { Data[0x18] = (byte)value; } } public override int EV_ATK { get { return Data[0x19]; } set { Data[0x19] = (byte)value; } } diff --git a/PKHeX/PKM/CK3.cs b/PKHeX/PKM/CK3.cs index 653305d68..54aff23cd 100644 --- a/PKHeX/PKM/CK3.cs +++ b/PKHeX/PKM/CK3.cs @@ -170,7 +170,7 @@ public CK3(byte[] decryptedData = null, string ident = null) public override int AbilityNumber { get { return Data[0xCC]; } set { Data[0xCC] = (byte)(value & 1); } } public override bool Valid { get { return Data[0xCD] == 0; } set { if (value) Data[0xCD] = 0; } } // 0xCE unknown - public override byte MarkByte { get { return Data[0xCF]; } protected set { Data[0xCF] = value; } } + public override int MarkValue { get { return Data[0xCF]; } protected set { Data[0xCF] = (byte)value; } } public override int PKRS_Days { get { return Math.Max((sbyte)Data[0xD0], (sbyte)0); } set { Data[0xD0] = (byte)(value == 0 ? 0xFF : value & 0xF); } } public int ShadowID { get { return BigEndian.ToUInt16(Data, 0xD8); } set { BigEndian.GetBytes((ushort)value).CopyTo(Data, 0xD8); } } public int Purification { get { return BigEndian.ToInt32(Data, 0xDC); } set { BigEndian.GetBytes(value).CopyTo(Data, 0xDC); } } diff --git a/PKHeX/PKM/PK1.cs b/PKHeX/PKM/PK1.cs index 2be56e445..09fbda3e4 100644 --- a/PKHeX/PKM/PK1.cs +++ b/PKHeX/PKM/PK1.cs @@ -240,7 +240,7 @@ public override bool CanHoldItem(ushort[] ValidArray) public override int TSV => 0x0000; public override int PSV => 0xFFFF; public override int Characteristic => -1; - public override byte MarkByte { get { return 0; } protected set { } } + public override int MarkValue { get { return 0; } protected set { } } public override int CurrentFriendship { get { return 0; } set { } } public override int Ability { get { return 0; } set { } } public override int CurrentHandler { get { return 0; } set { } } diff --git a/PKHeX/PKM/PK2.cs b/PKHeX/PKM/PK2.cs index 05ad47e0b..def164d90 100644 --- a/PKHeX/PKM/PK2.cs +++ b/PKHeX/PKM/PK2.cs @@ -314,7 +314,7 @@ public override int HPType public override int TSV => 0x0000; public override int PSV => 0xFFFF; public override int Characteristic => -1; - public override byte MarkByte { get { return 0; } protected set { } } + public override int MarkValue { get { return 0; } protected set { } } public override int Ability { get { return 0; } set { } } public override int CurrentHandler { get { return 0; } set { } } public override int Egg_Location { get { return 0; } set { } } diff --git a/PKHeX/PKM/PK3.cs b/PKHeX/PKM/PK3.cs index 9421a0ee3..5f94d7f62 100644 --- a/PKHeX/PKM/PK3.cs +++ b/PKHeX/PKM/PK3.cs @@ -55,7 +55,7 @@ public PK3(byte[] decryptedData = null, string ident = null) Array.Resize(ref strdata, 7); strdata.CopyTo(Data, 0x14); } } - public override byte MarkByte { get { return Data[0x1B]; } protected set { Data[0x1B] = value; } } + public override int MarkValue { get { return Data[0x1B]; } protected set { Data[0x1B] = (byte)value; } } public override ushort Checksum { get { return BitConverter.ToUInt16(Data, 0x1C); } set { BitConverter.GetBytes(value).CopyTo(Data, 0x1C); } } public override ushort Sanity { get { return BitConverter.ToUInt16(Data, 0x1E); } set { BitConverter.GetBytes(value).CopyTo(Data, 0x1E); } } diff --git a/PKHeX/PKM/PK4.cs b/PKHeX/PKM/PK4.cs index 96845277b..2761ef059 100644 --- a/PKHeX/PKM/PK4.cs +++ b/PKHeX/PKM/PK4.cs @@ -43,7 +43,7 @@ public PK4(byte[] decryptedData = null, string ident = null) public override uint EXP { get { return BitConverter.ToUInt32(Data, 0x10); } set { BitConverter.GetBytes(value).CopyTo(Data, 0x10); } } public override int OT_Friendship { get { return Data[0x14]; } set { Data[0x14] = (byte)value; } } public override int Ability { get { return Data[0x15]; } set { Data[0x15] = (byte)value; } } - public override byte MarkByte { get { return Data[0x16]; } protected set { Data[0x16] = value; } } + public override int MarkValue { get { return Data[0x16]; } protected set { Data[0x16] = (byte)value; } } public override int Language { get { return Data[0x17]; } set { Data[0x17] = (byte)value; } } public override int EV_HP { get { return Data[0x18]; } set { Data[0x18] = (byte)value; } } public override int EV_ATK { get { return Data[0x19]; } set { Data[0x19] = (byte)value; } } diff --git a/PKHeX/PKM/PK5.cs b/PKHeX/PKM/PK5.cs index 73c7c3986..f75ae2b44 100644 --- a/PKHeX/PKM/PK5.cs +++ b/PKHeX/PKM/PK5.cs @@ -43,7 +43,7 @@ public PK5(byte[] decryptedData = null, string ident = null) public override uint EXP { get { return BitConverter.ToUInt32(Data, 0x10); } set { BitConverter.GetBytes(value).CopyTo(Data, 0x10); } } public override int OT_Friendship { get { return Data[0x14]; } set { Data[0x14] = (byte)value; } } public override int Ability { get { return Data[0x15]; } set { Data[0x15] = (byte)value; } } - public override byte MarkByte { get { return Data[0x16]; } protected set { Data[0x16] = value; } } + public override int MarkValue { get { return Data[0x16]; } protected set { Data[0x16] = (byte)value; } } public override int Language { get { return Data[0x17]; } set { Data[0x17] = (byte)value; } } public override int EV_HP { get { return Data[0x18]; } set { Data[0x18] = (byte)value; } } public override int EV_ATK { get { return Data[0x19]; } set { Data[0x19] = (byte)value; } } diff --git a/PKHeX/PKM/PK6.cs b/PKHeX/PKM/PK6.cs index b26639f4d..1e4c8ff38 100644 --- a/PKHeX/PKM/PK6.cs +++ b/PKHeX/PKM/PK6.cs @@ -93,7 +93,7 @@ public override uint PID public override int CNT_Smart { get { return Data[0x27]; } set { Data[0x27] = (byte)value; } } public override int CNT_Tough { get { return Data[0x28]; } set { Data[0x28] = (byte)value; } } public override int CNT_Sheen { get { return Data[0x29]; } set { Data[0x29] = (byte)value; } } - public override byte MarkByte { get { return Data[0x2A]; } protected set { Data[0x2A] = value; } } + public override int MarkValue { get { return Data[0x2A]; } protected set { Data[0x2A] = (byte)value; } } private byte PKRS { get { return Data[0x2B]; } set { Data[0x2B] = value; } } public override int PKRS_Days { get { return PKRS & 0xF; } set { PKRS = (byte)(PKRS & ~0xF | value); } } public override int PKRS_Strain { get { return PKRS >> 4; } set { PKRS = (byte)(PKRS & 0xF | value << 4); } } diff --git a/PKHeX/PKM/PK7.cs b/PKHeX/PKM/PK7.cs index 4b11deb0c..105789065 100644 --- a/PKHeX/PKM/PK7.cs +++ b/PKHeX/PKM/PK7.cs @@ -70,8 +70,7 @@ public override uint EXP } public override int Ability { get { return Data[0x14]; } set { Data[0x14] = (byte)value; } } public override int AbilityNumber { get { return Data[0x15]; } set { Data[0x15] = (byte)value; } } - public int TrainingBagHits { get { return Data[0x16]; } set { Data[0x16] = (byte)value; } } - public int TrainingBag { get { return Data[0x17]; } set { Data[0x17] = (byte)value; } } + public override int MarkValue { get { return BitConverter.ToUInt16(Data, 0x16); } protected set { BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x16); } } public override uint PID { get { return BitConverter.ToUInt32(Data, 0x18); } @@ -93,7 +92,7 @@ public override uint PID public override int CNT_Smart { get { return Data[0x27]; } set { Data[0x27] = (byte)value; } } public override int CNT_Tough { get { return Data[0x28]; } set { Data[0x28] = (byte)value; } } public override int CNT_Sheen { get { return Data[0x29]; } set { Data[0x29] = (byte)value; } } - public override byte MarkByte { get { return Data[0x2A]; } protected set { Data[0x2A] = value; } } + // public override byte MarkValue { get { return Data[0x2A]; } protected set { Data[0x2A] = value; } } private byte PKRS { get { return Data[0x2B]; } set { Data[0x2B] = value; } } public override int PKRS_Days { get { return PKRS & 0xF; } set { PKRS = (byte)(PKRS & ~0xF | value); } } public override int PKRS_Strain { get { return PKRS >> 4; } set { PKRS = (byte)(PKRS & 0xF | value << 4); } } @@ -423,7 +422,6 @@ public int OppositeFriendship public bool IsUntradedEvent6 => Geo1_Country == 0 && Geo1_Region == 0 && Met_Location / 10000 == 4 && Gen6; // Complex Generated Attributes - public override int Characteristic { get @@ -440,6 +438,27 @@ public override int Characteristic } } + public override int[] Markings + { + get + { + int[] marks = new int[8]; + int val = MarkValue; + for (int i = 0; i < marks.Length; i++) + marks[i] = (val >> (i*2)) & 3; + return marks; + } + set + { + if (value.Length > 8) + return; + int v = 0; + for (int i = 0; i < value.Length; i++) + v |= (value[i] & 3) << (i*2); + MarkValue = v; + } + } + // Methods public override byte[] Encrypt() { diff --git a/PKHeX/PKM/PKM.cs b/PKHeX/PKM/PKM.cs index 34230468e..75f3fcd78 100644 --- a/PKHeX/PKM/PKM.cs +++ b/PKHeX/PKM/PKM.cs @@ -121,7 +121,7 @@ public byte[] Write() public abstract int TSV { get; } public abstract int PSV { get; } public abstract int Characteristic { get; } - public abstract byte MarkByte { get; protected set; } + public abstract int MarkValue { get; protected set; } public abstract int Met_Location { get; set; } public abstract int Egg_Location { get; set; } public abstract int OT_Friendship { get; set; } @@ -285,12 +285,12 @@ public int GenNumber public bool PKRS_Cured => PKRS_Days == 0 && PKRS_Strain > 0; public virtual bool ChecksumValid => Checksum == CalculateChecksum(); public int CurrentLevel => PKX.getLevel(Species, EXP); - public bool MarkCircle { get { return (MarkByte & (1 << 0)) == 1 << 0; } set { MarkByte = (byte)(MarkByte & ~(1 << 0) | (value ? 1 << 0 : 0)); } } - public bool MarkTriangle { get { return (MarkByte & (1 << 1)) == 1 << 1; } set { MarkByte = (byte)(MarkByte & ~(1 << 0) | (value ? 1 << 0 : 0)); } } - public bool MarkSquare { get { return (MarkByte & (1 << 2)) == 1 << 2; } set { MarkByte = (byte)(MarkByte & ~(1 << 0) | (value ? 1 << 0 : 0)); } } - public bool MarkHeart { get { return (MarkByte & (1 << 3)) == 1 << 3; } set { MarkByte = (byte)(MarkByte & ~(1 << 0) | (value ? 1 << 0 : 0)); } } - public bool MarkStar { get { return (MarkByte & (1 << 4)) == 1 << 4; } set { MarkByte = (byte)(MarkByte & ~(1 << 0) | (value ? 1 << 0 : 0)); } } - public bool MarkDiamond { get { return (MarkByte & (1 << 5)) == 1 << 5; } set { MarkByte = (byte)(MarkByte & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool MarkCircle { get { return (MarkValue & (1 << 0)) == 1 << 0; } set { MarkValue = (byte)(MarkValue & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool MarkTriangle { get { return (MarkValue & (1 << 1)) == 1 << 1; } set { MarkValue = (byte)(MarkValue & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool MarkSquare { get { return (MarkValue & (1 << 2)) == 1 << 2; } set { MarkValue = (byte)(MarkValue & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool MarkHeart { get { return (MarkValue & (1 << 3)) == 1 << 3; } set { MarkValue = (byte)(MarkValue & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool MarkStar { get { return (MarkValue & (1 << 4)) == 1 << 4; } set { MarkValue = (byte)(MarkValue & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool MarkDiamond { get { return (MarkValue & (1 << 5)) == 1 << 5; } set { MarkValue = (byte)(MarkValue & ~(1 << 0) | (value ? 1 << 0 : 0)); } } public Image Sprite => PKX.getSprite(this); public string ShowdownText => ShowdownSet.getShowdownText(this); public string[] QRText => PKX.getQRText(this); @@ -343,13 +343,13 @@ public int PIDAbility } } - public bool[] Markings + public virtual int[] Markings { get { - bool[] mark = new bool[8]; + int[] mark = new int[8]; for (int i = 0; i < 8; i++) - mark[i] = ((MarkByte >> i) & 1) == 1; + mark[i] = (MarkValue >> i) & 1; return mark; } set @@ -358,8 +358,8 @@ public bool[] Markings return; byte b = 0; for (int i = 0; i < value.Length; i++) - b |= (byte)(value[i] ? 1 << i : 0); - MarkByte = b; + b |= (byte)((value[i] & 1) << i); + MarkValue = b; } } diff --git a/PKHeX/PKM/XK3.cs b/PKHeX/PKM/XK3.cs index ec34d300a..3f6363ae4 100644 --- a/PKHeX/PKM/XK3.cs +++ b/PKHeX/PKM/XK3.cs @@ -57,7 +57,7 @@ public XK3(byte[] decryptedData = null, string ident = null) public override int Stat_Level { get { return Data[0x11]; } set { Data[0x11] = (byte)value; } } public override int CNT_Sheen { get { return Data[0x12]; } set { Data[0x12] = (byte)value; } } public override int PKRS_Strain { get { return Data[0x13] & 0xF; } set { Data[0x13] = (byte)(value & 0xF); } } - public override byte MarkByte { get { return Data[0x14]; } protected set { Data[0x14] = value; } } + public override int MarkValue { get { return Data[0x14]; } protected set { Data[0x14] = (byte)value; } } public override int PKRS_Days { get { return Math.Max((sbyte)Data[0x15], (sbyte)0); } set { Data[0x15] = (byte)(value == 0 ? 0xFF : value & 0xF); } } // 0x16-0x1C Battle Related private int XDPKMFLAGS { get { return Data[0x1D]; } set { Data[0x1D] = (byte)value; } } diff --git a/PKHeX/Subforms/frmReport.cs b/PKHeX/Subforms/frmReport.cs index 7b11aa83a..a69afee12 100644 --- a/PKHeX/Subforms/frmReport.cs +++ b/PKHeX/Subforms/frmReport.cs @@ -63,7 +63,7 @@ public class Preview public int Smart => pkm.CNT_Smart; public int Tough => pkm.CNT_Tough; public int Sheen => pkm.CNT_Sheen; - public int Markings => pkm.MarkByte; + public int Markings => pkm.MarkValue; public string NotOT => pkm.Format > 5 ? ((PK6) pkm).HT_Name : "N/A"; diff --git a/PKHeX/Util/ImageUtil.cs b/PKHeX/Util/ImageUtil.cs index 84a0d29a9..745c701c2 100644 --- a/PKHeX/Util/ImageUtil.cs +++ b/PKHeX/Util/ImageUtil.cs @@ -41,6 +41,38 @@ internal static Bitmap ChangeOpacity(Image img, double trans) Marshal.Copy(data, 0, ptr, len); bmp.UnlockBits(bmpData); + return bmp; + } + internal static Bitmap ChangeAllColorTo(Image img, Color c) + { + if (img == null) + return null; + if (img.PixelFormat.HasFlag(PixelFormat.Indexed)) + return (Bitmap)img; + + Bitmap bmp = (Bitmap)img.Clone(); + BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); + IntPtr ptr = bmpData.Scan0; + + int len = bmp.Width * bmp.Height * 4; + byte[] data = new byte[len]; + + Marshal.Copy(ptr, data, 0, len); + + byte R = c.R; + byte G = c.G; + byte B = c.B; + for (int i = 0; i < data.Length; i += 4) + if (data[i + 3] != 0) + { + data[i + 0] = B; + data[i + 1] = G; + data[i + 2] = R; + } + + Marshal.Copy(data, 0, ptr, len); + bmp.UnlockBits(bmpData); + return bmp; } } diff --git a/Tests/PKHeX.Tests/PKM/DateTestPKM.cs b/Tests/PKHeX.Tests/PKM/DateTestPKM.cs index 220bfc3c0..40c874d5f 100644 --- a/Tests/PKHeX.Tests/PKM/DateTestPKM.cs +++ b/Tests/PKHeX.Tests/PKM/DateTestPKM.cs @@ -541,7 +541,7 @@ public override int Language } } - public override byte MarkByte + public override int MarkValue { get {