diff --git a/Misc/PK6.cs b/Misc/PK6.cs new file mode 100644 index 000000000..1e606541b --- /dev/null +++ b/Misc/PK6.cs @@ -0,0 +1,518 @@ +using System; +using System.Drawing; +using System.Linq; +using System.Text; + +namespace PKHeX +{ + public class PK6 : PKX + { + public PK6(byte[] pkx, string ident = null) + { + Data = (byte[])pkx.Clone(); + Identifier = ident; + if (Data.Length != 260) + Array.Resize(ref Data, 260); + } + + // Internal Attributes set on creation + public byte[] Data; // Raw Storage + public string Identifier; // User or Form Custom Attribute + + // Structure + #region Block A + public uint EncryptionConstant + { + get { return BitConverter.ToUInt32(Data, 0x00); } + set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0x00, 4); } + } + public ushort Sanity + { + get { return BitConverter.ToUInt16(Data, 0x02); } + // set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0x04, 2); } + } + public ushort Checksum + { + get { return BitConverter.ToUInt16(Data, 0x06); } + set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0x06, 2); } + } + public int Species + { + get { return BitConverter.ToUInt16(Data, 0x08); } + set { Array.Copy(BitConverter.GetBytes((ushort)value), 0, Data, 0x08, 2); } + } + public int HeldItem + { + get { return BitConverter.ToUInt16(Data, 0x0A); } + set { Array.Copy(BitConverter.GetBytes((ushort)value), 0, Data, 0x0A, 2); } + } + public int TID + { + get { return BitConverter.ToUInt16(Data, 0x0C); } + set { Array.Copy(BitConverter.GetBytes((ushort)value), 0, Data, 0x0C, 2); } + } + public int SID + { + get { return BitConverter.ToUInt16(Data, 0x0E); } + set { Array.Copy(BitConverter.GetBytes((ushort)value), 0, Data, 0x0E, 2); } + } + public uint EXP + { + get { return BitConverter.ToUInt32(Data, 0x10); } + set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0x10, 4); } + } + public int Ability { get { return Data[0x14]; } set { Data[0x14] = (byte)value; } } + public 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 uint PID + { + get { return BitConverter.ToUInt32(Data, 0x18); } + set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0x18, 4); } + } + public int Nature { get { return Data[0x1C]; } set { Data[0x1C] = (byte)value; } } + public bool FatefulEncounter { get { return (Data[0x1D] & 1) == 1; } set { Data[0x1D] = (byte)(Data[0x1D] & ~0x01 | (value ? 1 : 0)); } } + public int Gender { get { return (Data[0x1D] >> 1) & 0x3; } set { Data[0x1D] = (byte)(Data[0x1D] & 0xF9 | (value << 1)); } } + public int AltForm { get { return Data[0x1D] >> 3; } set { Data[0x1D] = (byte)(Data[0x1D] & 0x07 | (value << 3)); } } + public int EV_HP { get { return Data[0x1E]; } set { Data[0x1E] = (byte)value; } } + public int EV_ATK { get { return Data[0x1F]; } set { Data[0x1F] = (byte)value; } } + public int EV_DEF { get { return Data[0x20]; } set { Data[0x20] = (byte)value; } } + public int EV_SPE { get { return Data[0x21]; } set { Data[0x21] = (byte)value; } } + public int EV_SPA { get { return Data[0x22]; } set { Data[0x22] = (byte)value; } } + public int EV_SPD { get { return Data[0x23]; } set { Data[0x23] = (byte)value; } } + public int CNT_Cool { get { return Data[0x24]; } set { Data[0x24] = (byte)value; } } + public int CNT_Beauty { get { return Data[0x25]; } set { Data[0x25] = (byte)value; } } + public int CNT_Cute { get { return Data[0x26]; } set { Data[0x26] = (byte)value; } } + public int CNT_Smart { get { return Data[0x27]; } set { Data[0x27] = (byte)value; } } + public int CNT_Tough { get { return Data[0x28]; } set { Data[0x28] = (byte)value; } } + public int CNT_Sheen { get { return Data[0x29]; } set { Data[0x29] = (byte)value; } } + public byte Markings { get { return Data[0x2A]; } set { Data[0x2A] = value; } } + public bool Circle { get { return (Markings & (1 << 0)) == 1 << 0; } set { Markings = (byte)(Markings & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool Triangle { get { return (Markings & (1 << 1)) == 1 << 1; } set { Markings = (byte)(Markings & ~(1 << 1) | (value ? 1 << 1 : 0)); } } + public bool Square { get { return (Markings & (1 << 2)) == 1 << 2; } set { Markings = (byte)(Markings & ~(1 << 2) | (value ? 1 << 2 : 0)); } } + public bool Heart { get { return (Markings & (1 << 3)) == 1 << 3; } set { Markings = (byte)(Markings & ~(1 << 3) | (value ? 1 << 3 : 0)); } } + public bool Star { get { return (Markings & (1 << 4)) == 1 << 4; } set { Markings = (byte)(Markings & ~(1 << 4) | (value ? 1 << 4 : 0)); } } + public bool Diamond { get { return (Markings & (1 << 5)) == 1 << 5; } set { Markings = (byte)(Markings & ~(1 << 5) | (value ? 1 << 5 : 0)); } } + private byte PKRS { get { return Data[0x2B]; } set { Data[0x2B] = value; } } + public int PKRS_Days { get { return PKRS & 0xF; } set { PKRS = (byte)(PKRS & ~0xF | value); } } + public int PKRS_Strain { get { return PKRS >> 4; } set { PKRS = (byte)(PKRS & 0xF | (value << 4)); } } + private byte ST1 { get { return Data[0x2C]; } set { Data[0x2C] = value; } } + public bool ST1_0 { get { return (ST1 & (1 << 0)) == 1 << 0; } set { ST1 = (byte)(ST1 & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool ST1_1 { get { return (ST1 & (1 << 1)) == 1 << 1; } set { ST1 = (byte)(ST1 & ~(1 << 1) | (value ? 1 << 1 : 0)); } } + public bool ST1_2 { get { return (ST1 & (1 << 2)) == 1 << 2; } set { ST1 = (byte)(ST1 & ~(1 << 2) | (value ? 1 << 2 : 0)); } } + public bool ST1_3 { get { return (ST1 & (1 << 3)) == 1 << 3; } set { ST1 = (byte)(ST1 & ~(1 << 3) | (value ? 1 << 3 : 0)); } } + public bool ST1_4 { get { return (ST1 & (1 << 4)) == 1 << 4; } set { ST1 = (byte)(ST1 & ~(1 << 4) | (value ? 1 << 4 : 0)); } } + public bool ST1_5 { get { return (ST1 & (1 << 5)) == 1 << 5; } set { ST1 = (byte)(ST1 & ~(1 << 5) | (value ? 1 << 5 : 0)); } } + public bool ST1_6 { get { return (ST1 & (1 << 6)) == 1 << 6; } set { ST1 = (byte)(ST1 & ~(1 << 6) | (value ? 1 << 7 : 0)); } } + public bool ST1_7 { get { return (ST1 & (1 << 7)) == 1 << 7; } set { ST1 = (byte)(ST1 & ~(1 << 7) | (value ? 1 << 6 : 0)); } } + private byte ST2 { get { return Data[0x2D]; } set { Data[0x2D] = value; } } + public bool ST2_0 { get { return (ST2 & (1 << 0)) == 1 << 0; } set { ST2 = (byte)(ST2 & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool ST2_1 { get { return (ST2 & (1 << 1)) == 1 << 1; } set { ST2 = (byte)(ST2 & ~(1 << 1) | (value ? 1 << 1 : 0)); } } + public bool ST2_2 { get { return (ST2 & (1 << 2)) == 1 << 2; } set { ST2 = (byte)(ST2 & ~(1 << 2) | (value ? 1 << 2 : 0)); } } + public bool ST2_3 { get { return (ST2 & (1 << 3)) == 1 << 3; } set { ST2 = (byte)(ST2 & ~(1 << 3) | (value ? 1 << 3 : 0)); } } + public bool ST2_4 { get { return (ST2 & (1 << 4)) == 1 << 4; } set { ST2 = (byte)(ST2 & ~(1 << 4) | (value ? 1 << 4 : 0)); } } + public bool ST2_5 { get { return (ST2 & (1 << 5)) == 1 << 5; } set { ST2 = (byte)(ST2 & ~(1 << 5) | (value ? 1 << 5 : 0)); } } + public bool ST2_6 { get { return (ST2 & (1 << 6)) == 1 << 6; } set { ST2 = (byte)(ST2 & ~(1 << 6) | (value ? 1 << 7 : 0)); } } + public bool ST2_7 { get { return (ST2 & (1 << 7)) == 1 << 7; } set { ST2 = (byte)(ST2 & ~(1 << 7) | (value ? 1 << 6 : 0)); } } + private byte ST3 { get { return Data[0x2E]; } set { Data[0x2E] = value; } } + public bool ST3_0 { get { return (ST3 & (1 << 0)) == 1 << 0; } set { ST3 = (byte)(ST3 & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool ST3_1 { get { return (ST3 & (1 << 1)) == 1 << 1; } set { ST3 = (byte)(ST3 & ~(1 << 1) | (value ? 1 << 1 : 0)); } } + public bool ST3_2 { get { return (ST3 & (1 << 2)) == 1 << 2; } set { ST3 = (byte)(ST3 & ~(1 << 2) | (value ? 1 << 2 : 0)); } } + public bool ST3_3 { get { return (ST3 & (1 << 3)) == 1 << 3; } set { ST3 = (byte)(ST3 & ~(1 << 3) | (value ? 1 << 3 : 0)); } } + public bool ST3_4 { get { return (ST3 & (1 << 4)) == 1 << 4; } set { ST3 = (byte)(ST3 & ~(1 << 4) | (value ? 1 << 4 : 0)); } } + public bool ST3_5 { get { return (ST3 & (1 << 5)) == 1 << 5; } set { ST3 = (byte)(ST3 & ~(1 << 5) | (value ? 1 << 5 : 0)); } } + public bool ST3_6 { get { return (ST3 & (1 << 6)) == 1 << 6; } set { ST3 = (byte)(ST3 & ~(1 << 6) | (value ? 1 << 7 : 0)); } } + public bool ST3_7 { get { return (ST3 & (1 << 7)) == 1 << 7; } set { ST3 = (byte)(ST3 & ~(1 << 7) | (value ? 1 << 6 : 0)); } } + private byte ST4 { get { return Data[0x2F]; } set { Data[0x2F] = value; } } + public bool ST4_0 { get { return (ST4 & (1 << 0)) == 1 << 0; } set { ST4 = (byte)(ST4 & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool ST4_1 { get { return (ST4 & (1 << 1)) == 1 << 1; } set { ST4 = (byte)(ST4 & ~(1 << 1) | (value ? 1 << 1 : 0)); } } + public bool ST4_2 { get { return (ST4 & (1 << 2)) == 1 << 2; } set { ST4 = (byte)(ST4 & ~(1 << 2) | (value ? 1 << 2 : 0)); } } + public bool ST4_3 { get { return (ST4 & (1 << 3)) == 1 << 3; } set { ST4 = (byte)(ST4 & ~(1 << 3) | (value ? 1 << 3 : 0)); } } + public bool ST4_4 { get { return (ST4 & (1 << 4)) == 1 << 4; } set { ST4 = (byte)(ST4 & ~(1 << 4) | (value ? 1 << 4 : 0)); } } + public bool ST4_5 { get { return (ST4 & (1 << 5)) == 1 << 5; } set { ST4 = (byte)(ST4 & ~(1 << 5) | (value ? 1 << 5 : 0)); } } + public bool ST4_6 { get { return (ST4 & (1 << 6)) == 1 << 6; } set { ST4 = (byte)(ST4 & ~(1 << 6) | (value ? 1 << 7 : 0)); } } + public bool ST4_7 { get { return (ST4 & (1 << 7)) == 1 << 7; } set { ST4 = (byte)(ST4 & ~(1 << 7) | (value ? 1 << 6 : 0)); } } + private byte RIB0 { get { return Data[0x30]; } set { Data[0x30] = value; } } + public bool RIB0_0 { get { return (RIB0 & (1 << 0)) == 1 << 0; } set { RIB0 = (byte)(RIB0 & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool RIB0_1 { get { return (RIB0 & (1 << 1)) == 1 << 1; } set { RIB0 = (byte)(RIB0 & ~(1 << 1) | (value ? 1 << 1 : 0)); } } + public bool RIB0_2 { get { return (RIB0 & (1 << 2)) == 1 << 2; } set { RIB0 = (byte)(RIB0 & ~(1 << 2) | (value ? 1 << 2 : 0)); } } + public bool RIB0_3 { get { return (RIB0 & (1 << 3)) == 1 << 3; } set { RIB0 = (byte)(RIB0 & ~(1 << 3) | (value ? 1 << 3 : 0)); } } + public bool RIB0_4 { get { return (RIB0 & (1 << 4)) == 1 << 4; } set { RIB0 = (byte)(RIB0 & ~(1 << 4) | (value ? 1 << 4 : 0)); } } + public bool RIB0_5 { get { return (RIB0 & (1 << 5)) == 1 << 5; } set { RIB0 = (byte)(RIB0 & ~(1 << 5) | (value ? 1 << 5 : 0)); } } + public bool RIB0_6 { get { return (RIB0 & (1 << 6)) == 1 << 6; } set { RIB0 = (byte)(RIB0 & ~(1 << 6) | (value ? 1 << 7 : 0)); } } + public bool RIB0_7 { get { return (RIB0 & (1 << 7)) == 1 << 7; } set { RIB0 = (byte)(RIB0 & ~(1 << 7) | (value ? 1 << 6 : 0)); } } + private byte RIB1 { get { return Data[0x31]; } set { Data[0x31] = value; } } + public bool RIB1_0 { get { return (RIB1 & (1 << 0)) == 1 << 0; } set { RIB1 = (byte)(RIB1 & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool RIB1_1 { get { return (RIB1 & (1 << 1)) == 1 << 1; } set { RIB1 = (byte)(RIB1 & ~(1 << 1) | (value ? 1 << 1 : 0)); } } + public bool RIB1_2 { get { return (RIB1 & (1 << 2)) == 1 << 2; } set { RIB1 = (byte)(RIB1 & ~(1 << 2) | (value ? 1 << 2 : 0)); } } + public bool RIB1_3 { get { return (RIB1 & (1 << 3)) == 1 << 3; } set { RIB1 = (byte)(RIB1 & ~(1 << 3) | (value ? 1 << 3 : 0)); } } + public bool RIB1_4 { get { return (RIB1 & (1 << 4)) == 1 << 4; } set { RIB1 = (byte)(RIB1 & ~(1 << 4) | (value ? 1 << 4 : 0)); } } + public bool RIB1_5 { get { return (RIB1 & (1 << 5)) == 1 << 5; } set { RIB1 = (byte)(RIB1 & ~(1 << 5) | (value ? 1 << 5 : 0)); } } + public bool RIB1_6 { get { return (RIB1 & (1 << 6)) == 1 << 6; } set { RIB1 = (byte)(RIB1 & ~(1 << 6) | (value ? 1 << 7 : 0)); } } + public bool RIB1_7 { get { return (RIB1 & (1 << 7)) == 1 << 7; } set { RIB1 = (byte)(RIB1 & ~(1 << 7) | (value ? 1 << 6 : 0)); } } + private byte RIB2 { get { return Data[0x32]; } set { Data[0x32] = value; } } + public bool RIB2_0 { get { return (RIB2 & (1 << 0)) == 1 << 0; } set { RIB2 = (byte)(RIB2 & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool RIB2_1 { get { return (RIB2 & (1 << 1)) == 1 << 1; } set { RIB2 = (byte)(RIB2 & ~(1 << 1) | (value ? 1 << 1 : 0)); } } + public bool RIB2_2 { get { return (RIB2 & (1 << 2)) == 1 << 2; } set { RIB2 = (byte)(RIB2 & ~(1 << 2) | (value ? 1 << 2 : 0)); } } + public bool RIB2_3 { get { return (RIB2 & (1 << 3)) == 1 << 3; } set { RIB2 = (byte)(RIB2 & ~(1 << 3) | (value ? 1 << 3 : 0)); } } + public bool RIB2_4 { get { return (RIB2 & (1 << 4)) == 1 << 4; } set { RIB2 = (byte)(RIB2 & ~(1 << 4) | (value ? 1 << 4 : 0)); } } + public bool RIB2_5 { get { return (RIB2 & (1 << 5)) == 1 << 5; } set { RIB2 = (byte)(RIB2 & ~(1 << 5) | (value ? 1 << 5 : 0)); } } + public bool RIB2_6 { get { return (RIB2 & (1 << 6)) == 1 << 6; } set { RIB2 = (byte)(RIB2 & ~(1 << 6) | (value ? 1 << 7 : 0)); } } + public bool RIB2_7 { get { return (RIB2 & (1 << 7)) == 1 << 7; } set { RIB2 = (byte)(RIB2 & ~(1 << 7) | (value ? 1 << 6 : 0)); } } + private byte RIB3 { get { return Data[0x33]; } set { Data[0x33] = value; } } + public bool RIB3_0 { get { return (RIB3 & (1 << 0)) == 1 << 0; } set { RIB3 = (byte)(RIB3 & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool RIB3_1 { get { return (RIB3 & (1 << 1)) == 1 << 1; } set { RIB3 = (byte)(RIB3 & ~(1 << 1) | (value ? 1 << 1 : 0)); } } + public bool RIB3_2 { get { return (RIB3 & (1 << 2)) == 1 << 2; } set { RIB3 = (byte)(RIB3 & ~(1 << 2) | (value ? 1 << 2 : 0)); } } + public bool RIB3_3 { get { return (RIB3 & (1 << 3)) == 1 << 3; } set { RIB3 = (byte)(RIB3 & ~(1 << 3) | (value ? 1 << 3 : 0)); } } + public bool RIB3_4 { get { return (RIB3 & (1 << 4)) == 1 << 4; } set { RIB3 = (byte)(RIB3 & ~(1 << 4) | (value ? 1 << 4 : 0)); } } + public bool RIB3_5 { get { return (RIB3 & (1 << 5)) == 1 << 5; } set { RIB3 = (byte)(RIB3 & ~(1 << 5) | (value ? 1 << 5 : 0)); } } + public bool RIB3_6 { get { return (RIB3 & (1 << 6)) == 1 << 6; } set { RIB3 = (byte)(RIB3 & ~(1 << 6) | (value ? 1 << 7 : 0)); } } + public bool RIB3_7 { get { return (RIB3 & (1 << 7)) == 1 << 7; } set { RIB3 = (byte)(RIB3 & ~(1 << 7) | (value ? 1 << 6 : 0)); } } + private byte RIB4 { get { return Data[0x34]; } set { Data[0x34] = value; } } + public bool RIB4_0 { get { return (RIB4 & (1 << 0)) == 1 << 0; } set { RIB4 = (byte)(RIB4 & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool RIB4_1 { get { return (RIB4 & (1 << 1)) == 1 << 1; } set { RIB4 = (byte)(RIB4 & ~(1 << 1) | (value ? 1 << 1 : 0)); } } + public bool RIB4_2 { get { return (RIB4 & (1 << 2)) == 1 << 2; } set { RIB4 = (byte)(RIB4 & ~(1 << 2) | (value ? 1 << 2 : 0)); } } + public bool RIB4_3 { get { return (RIB4 & (1 << 3)) == 1 << 3; } set { RIB4 = (byte)(RIB4 & ~(1 << 3) | (value ? 1 << 3 : 0)); } } + public bool RIB4_4 { get { return (RIB4 & (1 << 4)) == 1 << 4; } set { RIB4 = (byte)(RIB4 & ~(1 << 4) | (value ? 1 << 4 : 0)); } } + public bool RIB4_5 { get { return (RIB4 & (1 << 5)) == 1 << 5; } set { RIB4 = (byte)(RIB4 & ~(1 << 5) | (value ? 1 << 5 : 0)); } } + public bool RIB4_6 { get { return (RIB4 & (1 << 6)) == 1 << 6; } set { RIB4 = (byte)(RIB4 & ~(1 << 6) | (value ? 1 << 7 : 0)); } } + public bool RIB4_7 { get { return (RIB4 & (1 << 7)) == 1 << 7; } set { RIB4 = (byte)(RIB4 & ~(1 << 7) | (value ? 1 << 6 : 0)); } } + private byte RIB5 { get { return Data[0x35]; } set { Data[0x35] = value; } } + public bool RIB5_0 { get { return (RIB5 & (1 << 0)) == 1 << 0; } set { RIB5 = (byte)(RIB5 & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool RIB5_1 { get { return (RIB5 & (1 << 1)) == 1 << 1; } set { RIB5 = (byte)(RIB5 & ~(1 << 1) | (value ? 1 << 1 : 0)); } } + public bool RIB5_2 { get { return (RIB5 & (1 << 2)) == 1 << 2; } set { RIB5 = (byte)(RIB5 & ~(1 << 2) | (value ? 1 << 2 : 0)); } } + public bool RIB5_3 { get { return (RIB5 & (1 << 3)) == 1 << 3; } set { RIB5 = (byte)(RIB5 & ~(1 << 3) | (value ? 1 << 3 : 0)); } } + public bool RIB5_4 { get { return (RIB5 & (1 << 4)) == 1 << 4; } set { RIB5 = (byte)(RIB5 & ~(1 << 4) | (value ? 1 << 4 : 0)); } } + public bool RIB5_5 { get { return (RIB5 & (1 << 5)) == 1 << 5; } set { RIB5 = (byte)(RIB5 & ~(1 << 5) | (value ? 1 << 5 : 0)); } } + public bool RIB5_6 { get { return (RIB5 & (1 << 6)) == 1 << 6; } set { RIB5 = (byte)(RIB5 & ~(1 << 6) | (value ? 1 << 7 : 0)); } } + public bool RIB5_7 { get { return (RIB5 & (1 << 7)) == 1 << 7; } set { RIB5 = (byte)(RIB5 & ~(1 << 7) | (value ? 1 << 6 : 0)); } } + public byte _0x36 { get { return Data[0x36]; } set { Data[0x36] = value; } } + public byte _0x37 { get { return Data[0x37]; } set { Data[0x37] = value; } } + public byte Memory_ContestCount { get { return Data[0x38]; } set { Data[0x38] = value; } } + public byte Memory_BattleCount { get { return Data[0x39]; } set { Data[0x39] = value; } } + private byte DistByte { get { return Data[0x3A]; } set { Data[0x3A] = value; } } + public bool Dist1 { get { return (DistByte & (1 << 0)) == 1 << 0; } set { DistByte = (byte)(DistByte & ~(1 << 0) | (value ? 1 << 0 : 0)); } } + public bool Dist2 { get { return (DistByte & (1 << 1)) == 1 << 1; } set { DistByte = (byte)(DistByte & ~(1 << 1) | (value ? 1 << 1 : 0)); } } + public bool Dist3 { get { return (DistByte & (1 << 2)) == 1 << 2; } set { DistByte = (byte)(DistByte & ~(1 << 2) | (value ? 1 << 2 : 0)); } } + public bool Dist4 { get { return (DistByte & (1 << 3)) == 1 << 3; } set { DistByte = (byte)(DistByte & ~(1 << 3) | (value ? 1 << 3 : 0)); } } + public bool Dist5 { get { return (DistByte & (1 << 4)) == 1 << 4; } set { DistByte = (byte)(DistByte & ~(1 << 4) | (value ? 1 << 4 : 0)); } } + public bool Dist6 { get { return (DistByte & (1 << 5)) == 1 << 5; } set { DistByte = (byte)(DistByte & ~(1 << 5) | (value ? 1 << 5 : 0)); } } + public bool Dist7 { get { return (DistByte & (1 << 6)) == 1 << 6; } set { DistByte = (byte)(DistByte & ~(1 << 6) | (value ? 1 << 6 : 0)); } } + public bool Dist8 { get { return (DistByte & (1 << 7)) == 1 << 7; } set { DistByte = (byte)(DistByte & ~(1 << 7) | (value ? 1 << 7 : 0)); } } + public byte _0x3B { get { return Data[0x3B]; } set { Data[0x3B] = value; } } + public byte _0x3C { get { return Data[0x3C]; } set { Data[0x3C] = value; } } + public byte _0x3D { get { return Data[0x3D]; } set { Data[0x3D] = value; } } + public byte _0x3E { get { return Data[0x3E]; } set { Data[0x3E] = value; } } + public byte _0x3F { get { return Data[0x3F]; } set { Data[0x3F] = value; } } + #endregion + #region Block B + public string Nickname + { + get + { + return Util.TrimFromZero(Encoding.Unicode.GetString(Data, 0x40, 24)) + .Replace("\uE08F", "\u2640") // nidoran + .Replace("\uE08E", "\u2642") // nidoran + .Replace("\u2019", "\u0027"); // farfetch'd + } + set + { + string TempNick = value // Replace Special Characters and add Terminator + .Replace("\u2640", "\uE08F") // nidoran + .Replace("\u2642", "\uE08E") // nidoran + .Replace("\u0027", "\u2019") // farfetch'd + .PadRight(value.Length + 1, '\0'); // Null Terminator + byte[] NickBytes = Encoding.Unicode.GetBytes(TempNick); + Array.Copy(NickBytes, 0, Data, 0x40, NickBytes.Length); + } + } + public int Move1 + { + get { return BitConverter.ToUInt16(Data, 0x5A); } + set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0x5A, 2); } + } + public int Move2 + { + get { return BitConverter.ToUInt16(Data, 0x5C); } + set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0x5C, 2); } + } + public int Move3 + { + get { return BitConverter.ToUInt16(Data, 0x5E); } + set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0x5E, 2); } + } + public int Move4 + { + get { return BitConverter.ToUInt16(Data, 0x60); } + set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0x60, 2); } + } + public int Move1_PP { get { return Data[0x62]; } set { Data[0x62] = (byte)value; } } + public int Move2_PP { get { return Data[0x63]; } set { Data[0x63] = (byte)value; } } + public int Move3_PP { get { return Data[0x64]; } set { Data[0x64] = (byte)value; } } + public int Move4_PP { get { return Data[0x65]; } set { Data[0x65] = (byte)value; } } + public int Move1_PPUps { get { return Data[0x66]; } set { Data[0x66] = (byte)value; } } + public int Move2_PPUps { get { return Data[0x67]; } set { Data[0x67] = (byte)value; } } + public int Move3_PPUps { get { return Data[0x68]; } set { Data[0x68] = (byte)value; } } + public int Move4_PPUps { get { return Data[0x69]; } set { Data[0x69] = (byte)value; } } + public int RelearnMove1 + { + get { return BitConverter.ToUInt16(Data, 0x6A); } + set { Array.Copy(BitConverter.GetBytes((ushort)value), 0, Data, 0x6A, 2); } + } + public int RelearnMove2 + { + get { return BitConverter.ToUInt16(Data, 0x6C); } + set { Array.Copy(BitConverter.GetBytes((ushort)value), 0, Data, 0x6C, 2); } + } + public int RelearnMove3 + { + get { return BitConverter.ToUInt16(Data, 0x6E); } + set { Array.Copy(BitConverter.GetBytes((ushort)value), 0, Data, 0x6E, 2); } + } + public int RelearnMove4 + { + get { return BitConverter.ToUInt16(Data, 0x70); } + set { Array.Copy(BitConverter.GetBytes((ushort)value), 0, Data, 0x70, 2); } + } + public bool SecretSuperTraining { get { return Data[0x72] == 1; } set { Data[0x72] = (byte)((Data[0x72] & ~1) | (value ? 1 : 0)); } } + public byte _0x73 { get { return Data[0x73]; } set { Data[0x73] = value; } } + private uint IV32 { get { return BitConverter.ToUInt32(Data, 0x74); } set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0x74, 4); } } + public int IV_HP { get { return (int)(IV32 >> 00) & 0x1F; } set { IV32 = (uint)((IV32 & ~(0x1F << 00)) | (uint)((value > 31 ? 31 : value) << 00)); } } + public int IV_ATK { get { return (int)(IV32 >> 05) & 0x1F; } set { IV32 = (uint)((IV32 & ~(0x1F << 05)) | (uint)((value > 31 ? 31 : value) << 05)); } } + public int IV_DEF { get { return (int)(IV32 >> 10) & 0x1F; } set { IV32 = (uint)((IV32 & ~(0x1F << 10)) | (uint)((value > 31 ? 31 : value) << 10)); } } + public int IV_SPE { get { return (int)(IV32 >> 15) & 0x1F; } set { IV32 = (uint)((IV32 & ~(0x1F << 15)) | (uint)((value > 31 ? 31 : value) << 15)); } } + public int IV_SPA { get { return (int)(IV32 >> 20) & 0x1F; } set { IV32 = (uint)((IV32 & ~(0x1F << 20)) | (uint)((value > 31 ? 31 : value) << 20)); } } + public int IV_SPD { get { return (int)(IV32 >> 25) & 0x1F; } set { IV32 = (uint)((IV32 & ~(0x1F << 25)) | (uint)((value > 31 ? 31 : value) << 25)); } } + public bool IsEgg { get { return ((IV32 >> 30) & 1) == 1; } set { IV32 = (uint)((IV32 & ~0x40000000) | (uint)(value ? 0x40000000 : 0)); } } + public bool IsNicknamed { get { return ((IV32 >> 31) & 1) == 1; } set { IV32 = ((IV32 & ~0x80000000) | (value ? 0x80000000 : 0)); } } + #endregion + #region Block C + public string HT_Name + { + get + { + return Util.TrimFromZero(Encoding.Unicode.GetString(Data, 0x78, 24)) + .Replace("\uE08F", "\u2640") // nidoran + .Replace("\uE08E", "\u2642") // nidoran + .Replace("\u2019", "\u0027"); // farfetch'd + } + set + { + string TempNick = value // Replace Special Characters and add Terminator + .Replace("\u2640", "\uE08F") // nidoran + .Replace("\u2642", "\uE08E") // nidoran + .Replace("\u0027", "\u2019") // farfetch'd + .PadRight(value.Length + 1, '\0'); // Null Terminator + byte[] nameBytes = Encoding.Unicode.GetBytes(TempNick); + Array.Copy(nameBytes, 0, Data, 0x78, nameBytes.Length); + } + } + public int HT_Gender { get { return Data[0x92]; } set { Data[0x92] = (byte)value; } } + public int CurrentHandler { get { return Data[0x93]; } set { Data[0x93] = (byte)value; } } + public int Geo1_Region { get { return Data[0x94]; } set { Data[0x94] = (byte)value; } } + public int Geo1_Country { get { return Data[0x95]; } set { Data[0x95] = (byte)value; } } + public int Geo2_Region { get { return Data[0x96]; } set { Data[0x96] = (byte)value; } } + public int Geo2_Country { get { return Data[0x97]; } set { Data[0x97] = (byte)value; } } + public int Geo3_Region { get { return Data[0x98]; } set { Data[0x98] = (byte)value; } } + public int Geo3_Country { get { return Data[0x99]; } set { Data[0x99] = (byte)value; } } + public int Geo4_Region { get { return Data[0x9A]; } set { Data[0x9A] = (byte)value; } } + public int Geo4_Country { get { return Data[0x9B]; } set { Data[0x9B] = (byte)value; } } + public int Geo5_Region { get { return Data[0x9C]; } set { Data[0x9C] = (byte)value; } } + public int Geo5_Country { get { return Data[0x9D]; } set { Data[0x9D] = (byte)value; } } + public byte _0x9E { get { return Data[0x9E]; } set { Data[0x9E] = value; } } + public byte _0x9F { get { return Data[0x9F]; } set { Data[0x9F] = value; } } + public byte _0xA0 { get { return Data[0xA0]; } set { Data[0xA0] = value; } } + public byte _0xA1 { get { return Data[0xA1]; } set { Data[0xA1] = value; } } + public int HT_Friendship { get { return Data[0xA2]; } set { Data[0xA2] = (byte)value; } } + public int HT_Affection { get { return Data[0xA3]; } set { Data[0xA3] = (byte)value; } } + public int HT_Intensity { get { return Data[0xA4]; } set { Data[0xA4] = (byte)value; } } + public int HT_Memory { get { return Data[0xA5]; } set { Data[0xA5] = (byte)value; } } + public int HT_Feeling { get { return Data[0xA6]; } set { Data[0xA6] = (byte)value; } } + public byte _0xA7 { get { return Data[0xA7]; } set { Data[0xA7] = value; } } + public int HT_TextVar { get { return BitConverter.ToUInt16(Data, 0xA8); } set { Array.Copy(BitConverter.GetBytes((ushort)value), 0, Data, 0xA8, 2); } } + public byte _0xAA { get { return Data[0xAA]; } set { Data[0xAA] = value; } } + public byte _0xAB { get { return Data[0xAB]; } set { Data[0xAB] = value; } } + public byte _0xAC { get { return Data[0xAC]; } set { Data[0xAC] = value; } } + public byte _0xAD { get { return Data[0xAD]; } set { Data[0xAD] = value; } } + public byte Fullness { get { return Data[0xAE]; } set { Data[0xAE] = value; } } + public byte Enjoyment { get { return Data[0xAF]; } set { Data[0xAF] = value; } } + #endregion + #region Block D + public string OT_Name + { + get + { + return Util.TrimFromZero(Encoding.Unicode.GetString(Data, 0xB0, 24)) + .Replace("\uE08F", "\u2640") // nidoran + .Replace("\uE08E", "\u2642") // nidoran + .Replace("\u2019", "\u0027"); // farfetch'd + } + set + { + string TempNick = value // Replace Special Characters and add Terminator + .Replace("\u2640", "\uE08F") // nidoran + .Replace("\u2642", "\uE08E") // nidoran + .Replace("\u0027", "\u2019") // farfetch'd + .PadRight(value.Length + 1, '\0'); // Null Terminator + byte[] nameBytes = Encoding.Unicode.GetBytes(TempNick); + Array.Copy(nameBytes, 0, Data, 0xB0, nameBytes.Length); + } + } + public int OT_Friendship { get { return Data[0xCA]; } set { Data[0xCA] = (byte)value; } } + public int OT_Affection { get { return Data[0xCB]; } set { Data[0xCB] = (byte)value; } } + public int OT_Intensity { get { return Data[0xCC]; } set { Data[0xCC] = (byte)value; } } + public int OT_Memory { get { return Data[0xCD]; } set { Data[0xCD] = (byte)value; } } + public int OT_TextVar { get { return BitConverter.ToUInt16(Data, 0xCE); } set { Array.Copy(BitConverter.GetBytes((ushort)value), 0, Data, 0xCE, 2); } } + public int OT_Feeling { get { return Data[0xD0]; } set { Data[0xD0] = (byte)value; } } + public int Egg_Year { get { return Data[0xD1]; } set { Data[0xD1] = (byte)value; } } + public int Egg_Month { get { return Data[0xD2]; } set { Data[0xD2] = (byte)value; } } + public int Egg_Day { get { return Data[0xD3]; } set { Data[0xD3] = (byte)value; } } + public int Met_Year { get { return Data[0xD4]; } set { Data[0xD4] = (byte)value; } } + public int Met_Month { get { return Data[0xD5]; } set { Data[0xD5] = (byte)value; } } + public int Met_Day { get { return Data[0xD6]; } set { Data[0xD6] = (byte)value; } } + public byte _0xD7 { get { return Data[0xD7]; } set { Data[0xD7] = value; } } + public int Egg_Location { get { return BitConverter.ToUInt16(Data, 0xD8); } set { Array.Copy(BitConverter.GetBytes((ushort)value), 0, Data, 0xD8, 2); } } + public int Met_Location { get { return BitConverter.ToUInt16(Data, 0xDA); } set { Array.Copy(BitConverter.GetBytes((ushort)value), 0, Data, 0xDA, 2); } } + public int Ball { get { return Data[0xDC]; } set { Data[0xDC] = (byte)value; } } + public int Met_Level { get { return Data[0xDD] & 0x80; } set { Data[0xDD] = (byte)((Data[0xDD] & ~0x80) | value); } } + public int OT_Gender { get { return Data[0xDD] >> 7; } set { Data[0xDD] = (byte)((Data[0xDD] & 0x80) | (value << 7)); } } + public int EncounterType { get { return Data[0xDE]; } set { Data[0xDE] = (byte)value; } } + public int Version { get { return Data[0xDF]; } set { Data[0xDF] = (byte)value; } } + public int Country { get { return Data[0xE0]; } set { Data[0xE0] = (byte)value; } } + public int Region { get { return Data[0xE1]; } set { Data[0xE1] = (byte)value; } } + public int ConsoleRegion { get { return Data[0xE2]; } set { Data[0xE2] = (byte)value; } } + public int Language { get { return Data[0xE3]; } set { Data[0xE3] = (byte)value; } } + #endregion + #region Battle Stats + public int Stat_Level { get { return Data[0xEC]; } set { Data[0xEC] = (byte)value; } } + public int Stat_HPCurrent { get { return BitConverter.ToUInt16(Data, 0xF0); } set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0xF0, 2); } } + public int Stat_HPMax { get { return BitConverter.ToUInt16(Data, 0xF2); } set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0xF2, 2); } } + public int Stat_ATK { get { return BitConverter.ToUInt16(Data, 0xF4); } set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0xF4, 2); } } + public int Stat_DEF { get { return BitConverter.ToUInt16(Data, 0xF6); } set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0xF6, 2); } } + public int Stat_SPE { get { return BitConverter.ToUInt16(Data, 0xF8); } set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0xF8, 2); } } + public int Stat_SPA { get { return BitConverter.ToUInt16(Data, 0xFA); } set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0xFA, 2); } } + public int Stat_SPD { get { return BitConverter.ToUInt16(Data, 0xFC); } set { Array.Copy(BitConverter.GetBytes(value), 0, Data, 0xFC, 2); } } + #endregion + + // Simple Generated Attributes + public int[] IVs { get { return new[] { IV_HP, IV_ATK, IV_DEF, IV_SPE, IV_SPA, IV_SPD }; } } + public int[] EVs { get { return new[] { EV_HP, EV_ATK, EV_DEF, EV_SPE, EV_SPA, EV_SPD }; } } + public int PSV { get { return (int)(((PID >> 16) ^ (PID & 0xFFFF)) >> 4); } } + public int TSV { get { return (TID ^ SID) >> 4; } } + public bool IsShiny { get { return TSV == PSV; } } + public bool PKRS_Infected { get { return PKRS_Strain > 0; } } + public bool PKRS_Cured { get { return PKRS_Days == 0 && PKRS_Strain > 0; } } + public string[] ShowdownText { get { return getShowdownText(Nickname, Species, HeldItem, Ability, EVs, HPType, Move1, Move2, Move3, Move4); } } + + // Complex Generated Attributes + public Image Sprite { get { return getSprite(Species, AltForm, Gender, HeldItem, IsEgg, IsShiny); } } + public int HPType + { + get { return (15 * ((IV_HP & 1) + 2 * (IV_ATK & 1) + 4 * (IV_DEF & 1) + 8 * (IV_SPE & 1) + 16 * (IV_SPA & 1) + 32 * (IV_SPD & 1))) / 63; } + set + { + IV_HP = (IV_HP & ~1) + hpivs[value][0]; + IV_ATK = (IV_ATK & ~1) + hpivs[value][1]; + IV_DEF = (IV_DEF & ~1) + hpivs[value][2]; + IV_SPE = (IV_SPE & ~1) + hpivs[value][3]; + IV_SPA = (IV_SPA & ~1) + hpivs[value][4]; + IV_SPD = (IV_SPD & ~1) + hpivs[value][5]; + } + } + public int Characteristic + { + get + { + // Characteristic with EC%6 + int pm6 = (int)(EncryptionConstant % 6); // EC MOD 6 + int maxIV = IVs.Max(); + int pm6stat = 0; + + for (int i = 0; i < 6; i++) + { + pm6stat = (pm6 + i) % 6; + if (IVs[pm6stat] == maxIV) + break; // P%6 is this stat + } + return pm6stat*5 + maxIV%5; + } + } + public int PotentialRating + { + get + { + int ivTotal = IVs.Sum(); + if (ivTotal <= 90) + return 0; + if (ivTotal <= 120) + return 1; + return ivTotal <= 150 ? 2 : 3; + } + } + + // Methods + public void RefreshChecksum() + { + Checksum = CalculateChecksum(); + } + public ushort CalculateChecksum() + { + ushort chk = 0; + for (int i = 8; i < 232; i += 2) // Loop through the entire PKX + chk += BitConverter.ToUInt16(Data, i); + + return chk; + } + public byte[] Write() + { + RefreshChecksum(); + return Data; + } + public byte[] Encrypt() + { + Checksum = CalculateChecksum(); + return encryptArray(Data); + } + public void CalculateStats() + { + ushort[] Stats = getStats(Species, Stat_Level, Nature, AltForm, + EV_HP, EV_ATK, EV_DEF, EV_SPA, EV_SPD, EV_SPE, + IV_HP, IV_ATK, IV_DEF, IV_SPA, IV_SPD, IV_SPE); + + Stat_HPMax = Stats[0]; + Stat_ATK = Stats[1]; + Stat_DEF = Stats[2]; + Stat_SPE = Stats[3]; + Stat_SPA = Stats[4]; + Stat_SPD = Stats[5]; + } + public string[] Summarize(string SpeciesName = null) + { + string[] response = new string[3]; + // Summarize + string filename = Nickname; + if (Nickname != SpeciesName && SpeciesName != null) + filename += " (" + SpeciesName + ")"; + response[0] = String.Format("{0} [{4}] lv{3} @ {1} -- {2}", filename, HeldItem, Nature, Stat_Level, Ability); + response[1] = String.Format("{0} / {1} / {2} / {3}", Move1, Move2, Move3, Move4); + response[2] = String.Format( + "IVs:{0}{1}{2}{3}{4}{5}" + + Environment.NewLine + Environment.NewLine + + "EVs:{6}{7}{8}{9}{10}{11}", + Environment.NewLine + IV_HP.ToString("00"), + Environment.NewLine + IV_ATK.ToString("00"), + Environment.NewLine + IV_DEF.ToString("00"), + Environment.NewLine + IV_SPA.ToString("00"), + Environment.NewLine + IV_SPD.ToString("00"), + Environment.NewLine + IV_SPE.ToString("00"), + Environment.NewLine + EV_HP.ToString("00"), + Environment.NewLine + EV_ATK.ToString("00"), + Environment.NewLine + EV_DEF.ToString("00"), + Environment.NewLine + EV_SPA.ToString("00"), + Environment.NewLine + EV_SPD.ToString("00"), + Environment.NewLine + EV_SPE.ToString("00")); + + return response; + } + } +} diff --git a/Misc/PKX.cs b/Misc/PKX.cs index 74a52e6b5..d568b4e25 100644 --- a/Misc/PKX.cs +++ b/Misc/PKX.cs @@ -5,7 +5,6 @@ using System.Linq; using System.Security.Cryptography; using System.Text; -using System.Text.RegularExpressions; namespace PKHeX { @@ -213,7 +212,7 @@ internal static byte getBaseFriendship(int species) { return PersonalGetter.GetPersonal(species).BaseFriendship; } - internal static int getLevel(int species, ref uint exp) + internal static int getLevel(int species, uint exp) { if (exp == 0) { return 1; } @@ -226,7 +225,6 @@ internal static int getLevel(int species, ref uint exp) while ((uint)table.Rows[++tl][growth + 1] <= exp) { if (tl != 100) continue; - exp = getEXP(100, species); // Fix EXP return 100; // After we find the level above ours, we're done. } @@ -257,6 +255,8 @@ internal static byte[] getAbilities(int species, int formnum) } internal static int getGender(string s) { + if (s == null) + return -1; if (s == "♂" || s == "M") return 0; if (s == "♀" || s == "F") @@ -518,286 +518,6 @@ internal static uint getRandomPID(int species, int cg) return pid; } - // Object - #region PKX Object - private Image pksprite; - private uint mEC, mPID, mIV32, - - mexp, - mHP_EV, mATK_EV, mDEF_EV, mSPA_EV, mSPD_EV, mSPE_EV, - mHP_IV, mATK_IV, mDEF_IV, mSPE_IV, mSPA_IV, mSPD_IV, - mcnt_cool, mcnt_beauty, mcnt_cute, mcnt_smart, mcnt_tough, mcnt_sheen, - mmarkings, mhptype; - - private string - slot, - mnicknamestr, mgenderstring, mnotOT, mot, mSpeciesName, mNatureName, mHPName, mAbilityName, - mMove1N, mMove2N, mMove3N, mMove4N, mhelditemN, - mRMove1N, mRMove2N, mRMove3N, mRMove4N, - mMetLocN, mEggLocN, - mcountryID, mregionID, mGameN, mBallN, mdsregIDN, motlangN; - - private int - mability, mabilitynum, mnature, mgenderflag, maltforms, mPKRS_Strain, mPKRS_Duration, - mmetlevel, motgender, mLevel; - - private bool - misegg, misnick, misshiny, mfeflag; - - private ushort - mhelditem, mspecies, mTID, mSID, mTSV, mESV, - mmove1, mmove2, mmove3, mmove4, - mmove1_pp, mmove2_pp, mmove3_pp, mmove4_pp, - mmove1_ppu, mmove2_ppu, mmove3_ppu, mmove4_ppu, - meggmove1, meggmove2, meggmove3, meggmove4, - mchk, - - mOTfriendship, mOTaffection, - megg_year, megg_month, megg_day, - mmet_year, mmet_month, mmet_day, - meggloc, mmetloc, - mball, mencountertype, - mgamevers, mdsregID, motlang; - - public string Position { get { return slot; } } - public Image Sprite { get { return pksprite; } } - public string Nickname { get { return mnicknamestr; } } - public string Species { get { return mSpeciesName; } } - public string Nature { get { return mNatureName; } } - public string Gender { get { return mgenderstring; } } - public string ESV { get { return mESV.ToString("0000"); } } - public string HP_Type { get { return mHPName; } } - public string Ability { get { return mAbilityName; } } - public string Move1 { get { return mMove1N; } } - public string Move2 { get { return mMove2N; } } - public string Move3 { get { return mMove3N; } } - public string Move4 { get { return mMove4N; } } - public string HeldItem { get { return mhelditemN; } } - public string MetLoc { get { return mMetLocN; } } - public string EggLoc { get { return mEggLocN; } } - public string Ball { get { return mBallN; } } - public string OT { get { return mot; } } - public string Version { get { return mGameN; } } - public string OTLang { get { return motlangN; } } - public string CountryID { get { return mcountryID; } } - public string RegionID { get { return mregionID; } } - public string DSRegionID { get { return mdsregIDN; } } - - #region Extraneous - public string EC { get { return mEC.ToString("X8"); } } - public string PID { get { return mPID.ToString("X8"); } } - public uint HP_IV { get { return mHP_IV; } } - public uint ATK_IV { get { return mATK_IV; } } - public uint DEF_IV { get { return mDEF_IV; } } - public uint SPA_IV { get { return mSPA_IV; } } - public uint SPD_IV { get { return mSPD_IV; } } - public uint SPE_IV { get { return mSPE_IV; } } - public uint EXP { get { return mexp; } } - public int Level { get { return mLevel; } } - public uint HP_EV { get { return mHP_EV; } } - public uint ATK_EV { get { return mATK_EV; } } - public uint DEF_EV { get { return mDEF_EV; } } - public uint SPA_EV { get { return mSPA_EV; } } - public uint SPD_EV { get { return mSPD_EV; } } - public uint SPE_EV { get { return mSPE_EV; } } - public uint Cool { get { return mcnt_cool; } } - public uint Beauty { get { return mcnt_beauty; } } - public uint Cute { get { return mcnt_cute; } } - public uint Smart { get { return mcnt_smart; } } - public uint Tough { get { return mcnt_tough; } } - public uint Sheen { get { return mcnt_sheen; } } - public uint Markings { get { return mmarkings; } } - - public string NotOT { get { return mnotOT; } } - - public int AbilityNum { get { return mabilitynum; } } - public int GenderFlag { get { return mgenderflag; } } - public int AltForms { get { return maltforms; } } - public int PKRS_Strain { get { return mPKRS_Strain; } } - public int PKRS_Days { get { return mPKRS_Duration; } } - public int MetLevel { get { return mmetlevel; } } - public int OT_Gender { get { return motgender; } } - - public bool FatefulFlag { get { return mfeflag; } } - public bool IsEgg { get { return misegg; } } - public bool IsNicknamed { get { return misnick; } } - public bool IsShiny { get { return misshiny; } } - - public ushort TID { get { return mTID; } } - public ushort SID { get { return mSID; } } - public ushort TSV { get { return mTSV; } } - public ushort Move1_PP { get { return mmove1_pp; } } - public ushort Move2_PP { get { return mmove2_pp; } } - public ushort Move3_PP { get { return mmove3_pp; } } - public ushort Move4_PP { get { return mmove4_pp; } } - public ushort Move1_PPUp { get { return mmove1_ppu; } } - public ushort Move2_PPUp { get { return mmove2_ppu; } } - public ushort Move3_PPUp { get { return mmove3_ppu; } } - public ushort Move4_PPUp { get { return mmove4_ppu; } } - public string Relearn1 { get { return mRMove1N; } } - public string Relearn2 { get { return mRMove2N; } } - public string Relearn3 { get { return mRMove3N; } } - public string Relearn4 { get { return mRMove4N; } } - public ushort Checksum { get { return mchk; } } - public ushort mFriendship { get { return mOTfriendship; } } - public ushort OT_Affection { get { return mOTaffection; } } - public ushort Egg_Year { get { return megg_year; } } - public ushort Egg_Day { get { return megg_month; } } - public ushort Egg_Month { get { return megg_day; } } - public ushort Met_Year { get { return mmet_year; } } - public ushort Met_Day { get { return mmet_month; } } - public ushort Met_Month { get { return mmet_day; } } - public ushort Encounter { get { return mencountertype; } } - - #endregion - public PKX(byte[] pkx, string ident) - { - slot = ident; - mnicknamestr = ""; - mnotOT = ""; - mot = ""; - mEC = BitConverter.ToUInt32(pkx, 0); - mchk = BitConverter.ToUInt16(pkx, 6); - mspecies = BitConverter.ToUInt16(pkx, 0x08); - mhelditem = BitConverter.ToUInt16(pkx, 0x0A); - mTID = BitConverter.ToUInt16(pkx, 0x0C); - mSID = BitConverter.ToUInt16(pkx, 0x0E); - mexp = BitConverter.ToUInt32(pkx, 0x10); - mability = pkx[0x14]; - mabilitynum = pkx[0x15]; - // 0x16, 0x17 - Training bag - mPID = BitConverter.ToUInt32(pkx, 0x18); - mnature = pkx[0x1C]; - mfeflag = (pkx[0x1D] % 2) == 1; - mgenderflag = (pkx[0x1D] >> 1) & 0x3; - maltforms = (pkx[0x1D] >> 3); - mHP_EV = pkx[0x1E]; - mATK_EV = pkx[0x1F]; - mDEF_EV = pkx[0x20]; - mSPA_EV = pkx[0x22]; - mSPD_EV = pkx[0x23]; - mSPE_EV = pkx[0x21]; - mcnt_cool = pkx[0x24]; - mcnt_beauty = pkx[0x25]; - mcnt_cute = pkx[0x26]; - mcnt_smart = pkx[0x27]; - mcnt_tough = pkx[0x28]; - mcnt_sheen = pkx[0x29]; - mmarkings = pkx[0x2A]; - mPKRS_Strain = pkx[0x2B] >> 4; - mPKRS_Duration = pkx[0x2B] % 0x10; - - // Block B - mnicknamestr = Util.TrimFromZero(Encoding.Unicode.GetString(pkx, 0x40, 24)); - // 0x58, 0x59 - unused - mmove1 = BitConverter.ToUInt16(pkx, 0x5A); - mmove2 = BitConverter.ToUInt16(pkx, 0x5C); - mmove3 = BitConverter.ToUInt16(pkx, 0x5E); - mmove4 = BitConverter.ToUInt16(pkx, 0x60); - mmove1_pp = pkx[0x62]; - mmove2_pp = pkx[0x63]; - mmove3_pp = pkx[0x64]; - mmove4_pp = pkx[0x65]; - mmove1_ppu = pkx[0x66]; - mmove2_ppu = pkx[0x67]; - mmove3_ppu = pkx[0x68]; - mmove4_ppu = pkx[0x69]; - meggmove1 = BitConverter.ToUInt16(pkx, 0x6A); - meggmove2 = BitConverter.ToUInt16(pkx, 0x6C); - meggmove3 = BitConverter.ToUInt16(pkx, 0x6E); - meggmove4 = BitConverter.ToUInt16(pkx, 0x70); - - // 0x72 - Super Training Flag - Passed with pkx to new form - - // 0x73 - unused/unknown - mIV32 = BitConverter.ToUInt32(pkx, 0x74); - mHP_IV = mIV32 & 0x1F; - mATK_IV = (mIV32 >> 5) & 0x1F; - mDEF_IV = (mIV32 >> 10) & 0x1F; - mSPE_IV = (mIV32 >> 15) & 0x1F; - mSPA_IV = (mIV32 >> 20) & 0x1F; - mSPD_IV = (mIV32 >> 25) & 0x1F; - misegg = Convert.ToBoolean((mIV32 >> 30) & 1); - misnick = Convert.ToBoolean((mIV32 >> 31)); - - // Block C - mnotOT = Util.TrimFromZero(Encoding.Unicode.GetString(pkx, 0x78, 24)); - bool notOTG = Convert.ToBoolean(pkx[0x92]); - // Memory Editor edits everything else with pkx in a new form - - // Block D - mot = Util.TrimFromZero(Encoding.Unicode.GetString(pkx, 0xB0, 24)); - // 0xC8, 0xC9 - unused - mOTfriendship = pkx[0xCA]; - mOTaffection = pkx[0xCB]; // Handled by Memory Editor - // 0xCC, 0xCD, 0xCE, 0xCF, 0xD0 - megg_year = pkx[0xD1]; - megg_month = pkx[0xD2]; - megg_day = pkx[0xD3]; - mmet_year = pkx[0xD4]; - mmet_month = pkx[0xD5]; - mmet_day = pkx[0xD6]; - // 0xD7 - unused - meggloc = BitConverter.ToUInt16(pkx, 0xD8); - mmetloc = BitConverter.ToUInt16(pkx, 0xDA); - mball = pkx[0xDC]; - mmetlevel = pkx[0xDD] & 0x7F; - motgender = (pkx[0xDD]) >> 7; - mencountertype = pkx[0xDE]; - mgamevers = pkx[0xDF]; - string[] data = getCountryRegionText(pkx[0xE0], pkx[0xE1], Main.curlanguage); - mcountryID = data[0x0]; - mregionID = data[0x1]; - mdsregID = pkx[0xE2]; - motlang = pkx[0xE3]; - - if (mgenderflag == 0) - mgenderstring = "♂"; - else if (mgenderflag == 1) - mgenderstring = "♀"; - else - mgenderstring = "-"; - - mhptype = (15 * ((mHP_IV & 1) + 2 * (mATK_IV & 1) + 4 * (mDEF_IV & 1) + 8 * (mSPE_IV & 1) + 16 * (mSPA_IV & 1) + 32 * (mSPD_IV & 1))) / 63 + 1; - - mTSV = (ushort)((mTID ^ mSID) >> 4); - mESV = (ushort)(((mPID >> 16) ^ (mPID & 0xFFFF)) >> 4); - - misshiny = (mTSV == mESV); - // Nidoran Gender Fixing Text - { - mnicknamestr = Regex.Replace(mnicknamestr, "\uE08F", "\u2640"); - mnicknamestr = Regex.Replace(mnicknamestr, "\uE08E", "\u2642"); - } - { - pksprite = getSprite(pkx); - } - try - { - mSpeciesName = Main.specieslist[mspecies]; - mhelditemN = Main.itemlist[mhelditem]; - mNatureName = Main.natures[mnature]; - mHPName = Main.types[mhptype]; - mAbilityName = Main.abilitylist[mability]; - mMove1N = Main.movelist[mmove1]; - mMove2N = Main.movelist[mmove2]; - mMove3N = Main.movelist[mmove3]; - mMove4N = Main.movelist[mmove4]; - mRMove1N = Main.movelist[meggmove1]; - mRMove2N = Main.movelist[meggmove2]; - mRMove3N = Main.movelist[meggmove3]; - mRMove4N = Main.movelist[meggmove4]; - mMetLocN = getLocation(false, mgamevers, mmetloc); - mEggLocN = getLocation(true, mgamevers, meggloc); - mLevel = getLevel(mspecies, ref mexp); - mGameN = Main.gamelist[mgamevers]; - mBallN = Main.balllist[mball]; - motlangN = Main.gamelanguages[motlang] ?? String.Format("UNK {0}", motlang); - mdsregIDN = Main.consoleregions[mdsregID] ?? String.Format("UNK {0}", mdsregID); - } - catch { return; } - } - #endregion #region SaveGame public class Structures @@ -1048,7 +768,7 @@ public SaveGame(string GameID) OPower = 0x17400; // ****changed**** EventConst = 0x14A00; EventAsh = EventConst + 0x78; - EventFlag = 0x14A00; // Confirmed + EventFlag = EventConst + 0x2FC; PokeDex = 0x15000; Spinda = PokeDex + 0x680; EncounterCount = PokeDex + 0x686; @@ -1079,35 +799,6 @@ public SaveGame(string GameID) } #endregion - internal static string[] getPKXSummary(PKX data) - { - string[] response = new string[3]; - // Summarize - string filename = data.Nickname; - if (filename != data.Species) - filename += " (" + data.Species + ")"; - response[0] = String.Format("{0} [{4}] lv{3} @ {1} -- {2}", filename, data.HeldItem, data.Nature, data.Level, data.Ability); - response[1] = String.Format("{0} / {1} / {2} / {3}", data.Move1, data.Move2, data.Move3, data.Move4); - response[2] = String.Format( - "IVs:{0}{1}{2}{3}{4}{5}" - + Environment.NewLine + Environment.NewLine + - "EVs:{6}{7}{8}{9}{10}{11}", - Environment.NewLine + data.HP_IV.ToString("00"), - Environment.NewLine + data.ATK_IV.ToString("00"), - Environment.NewLine + data.DEF_IV.ToString("00"), - Environment.NewLine + data.SPA_IV.ToString("00"), - Environment.NewLine + data.SPD_IV.ToString("00"), - Environment.NewLine + data.SPE_IV.ToString("00"), - Environment.NewLine + data.HP_EV.ToString("00"), - Environment.NewLine + data.ATK_EV.ToString("00"), - Environment.NewLine + data.DEF_EV.ToString("00"), - Environment.NewLine + data.SPA_EV.ToString("00"), - Environment.NewLine + data.SPD_EV.ToString("00"), - Environment.NewLine + data.SPE_EV.ToString("00")); - - return response; - } - // SAV Manipulation internal static int detectSAVIndex(byte[] data, out int savindex) { @@ -1638,19 +1329,6 @@ internal static byte[] writeG6SHA(byte[] savefile, bool oras, int savegame) } // Data Requests - internal static Image getSprite(byte[] data) - { - int species = BitConverter.ToInt16(data, 0x08); // Get Species - int form = (data[0x1D] >> 3); - int gender = (data[0x1D] >> 1) & 0x3; - int item = BitConverter.ToUInt16(data, 0xA); - bool isEgg = ((BitConverter.ToUInt32(data, 0x74) >> 30) & 1) == 1; - bool isShiny = getIsShiny(BitConverter.ToUInt32(data, 0x18), - BitConverter.ToUInt16(data, 0x0C), - BitConverter.ToUInt16(data, 0x0E)); - - return getSprite(species, form, gender, item, isEgg, isShiny); - } internal static Image getSprite(int species, int form, int gender, int item, bool isegg, bool shiny) { string file; @@ -1700,7 +1378,21 @@ internal static Image getSprite(int species, int form, int gender, int item, boo } return baseImage; } + internal static Image getSprite(PK6 pk6) + { + return pk6.Sprite; + } + internal static Image getSprite(byte[] data) + { + return new PK6(data).Sprite; + } + internal static string[] getShowdownText(string Nickname, int Species, int HeldItem, int Ability, int[] EVs, + int HPType, int Move1, int Move2, int Move3, int Move4) + { + // TODO + return null; + } // Font Related [System.Runtime.InteropServices.DllImport("gdi32.dll")] @@ -2167,6 +1859,8 @@ public Set(string input, string[] species, string[] items, string[] natures, str string[] lines = input.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None); for (int i = 0; i < lines.Length; i++) lines[i] = lines[i].Replace("'", "’").Trim(); // Sanitize apostrophes + if (lines.Length < 3) return; + // Seek for start of set int start = -1; for (int i = 0; i < lines.Length; i++) @@ -2211,8 +1905,7 @@ public Set(string input, string[] species, string[] items, string[] natures, str } if (Species < -1) return; - else - lines = lines.Skip(1).Take(lines.Length - 1).ToArray(); + lines = lines.Skip(1).Take(lines.Length - 1).ToArray(); } int movectr = 0; // Detect relevant data @@ -2239,6 +1932,7 @@ public Set(string input, string[] species, string[] items, string[] natures, str string[] brokenline = line.Split(new[] { ": " }, StringSplitOptions.None); switch (brokenline[0]) { + case "Trait": case "Ability": { Ability = Array.IndexOf(abilities, brokenline[1]); break; } case "Level": { Level = Util.ToInt32(brokenline[1]); break; } case "Shiny": { Shiny = (brokenline[1] == "Yes"); break; } diff --git a/Misc/pk2pk.cs b/Misc/pk2pk.cs index 27bb9ce37..7d7c8989f 100644 --- a/Misc/pk2pk.cs +++ b/Misc/pk2pk.cs @@ -160,7 +160,7 @@ public byte[] convertPK3toPK4(byte[] pk3) pk4[0x5F] = (byte)((origins >> 7) & 0xF); // Hometown Game pk4[0x82] = pk3[0x44]; // Copy Pokerus pk4[0x83] = (byte)((origins >> 11) & 0xF); // Ball - pk4[0x84] = (byte)((pk3[0x47] & 0x80) | ((byte)PKX.getLevel(species, ref exp))); + pk4[0x84] = (byte)((pk3[0x47] & 0x80) | ((byte)PKX.getLevel(species, exp))); // Nickname and OT Name handling... byte[][] trash = new byte[8][]; @@ -348,8 +348,8 @@ public byte[] convertPK4toPK5(byte[] pk4) // Fix Level pk5[0x84] &= 0x80; uint exp = BitConverter.ToUInt32(pk5, 0x10); - pk5[0x84] |= (byte)PKX.getLevel(species, ref exp); - + pk5[0x84] |= (byte)PKX.getLevel(species, exp); + // Fix Checksum ushort chk = 0; for (int i = 8; i < 136; i += 2) // Loop through the entire PKX diff --git a/PKHeX.csproj b/PKHeX.csproj index 2a396b488..d3f518468 100644 --- a/PKHeX.csproj +++ b/PKHeX.csproj @@ -73,6 +73,7 @@ + Form diff --git a/PKX/f1-Main.cs b/PKX/f1-Main.cs index ac9766cd0..e44818197 100644 --- a/PKX/f1-Main.cs +++ b/PKX/f1-Main.cs @@ -20,6 +20,7 @@ public Main() SplashSCR.Start(); #endregion #region Initialize Form + pk6.RefreshChecksum(); InitializeComponent(); SlotPictureBoxes = new[] { bpkx1, bpkx2, bpkx3, bpkx4, bpkx5, bpkx6, @@ -187,7 +188,7 @@ public Main() } #region Global Variables: Always Visible! - public static byte[] buff = new byte[260]; // Tab Pokemon Data Storage + public static PK6 pk6 = new PK6(new byte[260]); // Tab Pokemon Data Storage public static byte[] savefile = new byte[0x760000]; // required to initialize the program public static PKX.Structures.SaveGame SaveGame = new PKX.Structures.SaveGame("ORAS"); public static byte[] originalSAV; // original save @@ -379,12 +380,12 @@ private void mainMenuCodeGen(object sender, EventArgs e) byte[] data = CodeGen.returnArray; if (data == null) return; byte[] decdata = PKX.decryptArray(data); - Array.Copy(decdata, buff, 232); - try { populateFields(buff); } + Array.Copy(decdata, pk6.Data, 232); + try { populateFields(pk6.Data); } catch { - Array.Copy(new byte[232], buff, 232); - populateFields(buff); + Array.Copy(new byte[232], pk6.Data, 232); + populateFields(pk6.Data); Util.Error("Imported code did not decrypt properly", "Please verify that what you imported was correct."); } } @@ -519,8 +520,7 @@ private void openFile(byte[] input, string path, string ext) if ((ext == ".pk6") || (ext == ".ek6") || (ext == ".pkx") || (ext == ".ekx") || (ext == ".bin") || (ext == "")) { // Check if Encrypted before Loading - buff = (BitConverter.ToUInt16(input, 0xC8) == 0 && BitConverter.ToUInt16(input, 0x58) == 0) ? input : PKX.decryptArray(input); - populateFields(buff); + populateFields((BitConverter.ToUInt16(input, 0xC8) == 0 && BitConverter.ToUInt16(input, 0x58) == 0) ? input : PKX.decryptArray(input)); } else Util.Error("Unable to recognize file." + Environment.NewLine + "Only valid .pk* .ek* .bin supported.", String.Format("File Loaded:{0}{1}", Environment.NewLine, path)); @@ -533,13 +533,12 @@ private void openFile(byte[] input, string path, string ext) try // to convert g5pkm { byte[] data = Converter.ConvertPKM(input); - Array.Copy(data, buff, 232); - populateFields(buff); + Array.Resize(ref data, 232); + populateFields(data); } catch { - Array.Copy(new byte[232], buff, 232); - populateFields(buff); + populateFields(new byte[232]); Util.Error("Attempted to load previous generation PKM.", "Conversion failed."); } } @@ -548,14 +547,16 @@ private void openFile(byte[] input, string path, string ext) else if (input.Length == 363 && BitConverter.ToUInt16(input, 0x6B) == 0) { // EAD Packet of 363 length - Array.Copy(input, 0x67, buff, 0, 0xE8); - populateFields(buff); + Array.Copy(input, 0x67, pk6.Data, 0, 0xE8); + Array.Resize(ref pk6.Data, 232); + populateFields(pk6.Data); } else if (input.Length == 407 && BitConverter.ToUInt16(input, 0x98) == 0) { // EAD Packet of 407 length - Array.Copy(input, 0x93, buff, 0, 0xE8); - populateFields(buff); + Array.Copy(input, 0x93, pk6.Data, 0, 0xE8); + Array.Resize(ref pk6.Data, 232); + populateFields(pk6.Data); } #endregion #region Box Data @@ -757,13 +758,13 @@ private void openSave(bool oras) // Language Translation private void changeMainLanguage(object sender, EventArgs e) { - if (init) buff = preparepkx(); // get data currently in form + if (init) pk6.Data = preparepkx(); // get data currently in form Menu_Options.DropDown.Close(); InitializeStrings(); InitializeLanguage(); Util.TranslateInterface(this, lang_val[CB_MainLanguage.SelectedIndex], menuStrip1); // Translate the UI to language. - populateFields(buff); // put data back in form + populateFields(pk6.Data); // put data back in form } private void InitializeStrings() { @@ -878,7 +879,7 @@ private void InitializeStrings() private void InitializeFields() { // Now that the ComboBoxes are ready, load the data. - populateFields(buff); + populateFields(pk6.Data); { TB_OT.Text = "PKHeX"; TB_TID.Text = 12345.ToString(); @@ -959,269 +960,152 @@ private void InitializeLanguage() } private void populateFields(byte[] data) { - // Store all loaded data in a persistent buffer for easy access. - Array.Resize(ref buff, data.Length); - Array.Copy(data, buff, data.Length); + pk6 = new PK6(data); + if (init & !PKX.verifychk(pk6.Data)) + Util.Alert("PKX File has an invalid checksum."); + // Reset a little. init = false; CAL_EggDate.Value = new DateTime(2000, 01, 01); Tab_Main.Focus(); - // Encryption Constant - TB_EC.Text = BitConverter.ToUInt32(buff, 0).ToString("X8"); - // Block A - int species = BitConverter.ToInt16(buff, 0x08); - int helditem = BitConverter.ToUInt16(buff, 0x0A); - uint TID = BitConverter.ToUInt16(buff, 0x0C); - uint SID = BitConverter.ToUInt16(buff, 0x0E); - uint exp = BitConverter.ToUInt32(buff, 0x10); - int ability = buff[0x14]; - int abilitynum = buff[0x15]; - // 0x16, 0x17 - Training Bags handled by the Ribbon Editor - uint PID = BitConverter.ToUInt32(buff, 0x18); - int nature = buff[0x1C]; - int feflag = buff[0x1D] & 1; - int genderflag = (buff[0x1D] >> 1) & 0x3; - int altforms = (buff[0x1D] >> 3); - int HP_EV = buff[0x1E]; - int ATK_EV = buff[0x1F]; - int DEF_EV = buff[0x20]; - int SPA_EV = buff[0x22]; - int SPD_EV = buff[0x23]; - int SPE_EV = buff[0x21]; - int cnt_cool = buff[0x24]; - int cnt_beauty = buff[0x25]; - int cnt_cute = buff[0x26]; - int cnt_smart = buff[0x27]; - int cnt_tough = buff[0x28]; - int cnt_sheen = buff[0x29]; - int markings = buff[0x2A]; - int PKRS_Strain = buff[0x2B] >> 4; - int PKRS_Duration = buff[0x2B] & 0xF; - - // Medals and Ribbons, passed with buff to new form - // 0x2C, 0x2D, 0x2E, 0x2F - // 0x33, 0x34, 0x35, 0x36 - // 0x34, 0x35, 0x36, 0x37 - // 0x38, 0x39, 0x3A - - // 0x3B, 0x3C, 0x3D, 0x3E, 0x3F - Unused/Unknown - - // Block B - string nicknamestr = Util.TrimFromZero(Encoding.Unicode.GetString(buff, 0x40, 24)); - // 0x58, 0x59 - unused - int move1 = BitConverter.ToInt16(buff, 0x5A); - int move2 = BitConverter.ToInt16(buff, 0x5C); - int move3 = BitConverter.ToInt16(buff, 0x5E); - int move4 = BitConverter.ToInt16(buff, 0x60); - int move1_pp = buff[0x62]; - int move2_pp = buff[0x63]; - int move3_pp = buff[0x64]; - int move4_pp = buff[0x65]; - int move1_ppu = buff[0x66]; - int move2_ppu = buff[0x67]; - int move3_ppu = buff[0x68]; - int move4_ppu = buff[0x69]; - int eggmove1 = BitConverter.ToInt16(buff, 0x6A); - int eggmove2 = BitConverter.ToInt16(buff, 0x6C); - int eggmove3 = BitConverter.ToInt16(buff, 0x6E); - int eggmove4 = BitConverter.ToInt16(buff, 0x70); - - // 0x72 - Super Training Flag - Passed with buff to new form - - // 0x73 - Unused/Unknown - uint IV32 = BitConverter.ToUInt32(buff, 0x74); - uint HP_IV = IV32 & 0x1F; - uint ATK_IV = (IV32 >> 5) & 0x1F; - uint DEF_IV = (IV32 >> 10) & 0x1F; - uint SPE_IV = (IV32 >> 15) & 0x1F; - uint SPA_IV = (IV32 >> 20) & 0x1F; - uint SPD_IV = (IV32 >> 25) & 0x1F; - uint isegg = (IV32 >> 30) & 1; - uint isnick = (IV32 >> 31); - - // Block C - string notOT = Util.TrimFromZero(Encoding.Unicode.GetString(buff, 0x78, 24)); - bool notOTG = Convert.ToBoolean(buff[0x92]); - // Memory Editor edits everything else with buff in a new form - - // Block D - string ot = Util.TrimFromZero(Encoding.Unicode.GetString(buff, 0xB0, 24)); - // 0xC8, 0xC9 - unused - int OTfriendship = buff[0xCA]; - // int OTaffection = buff[0xCB]; // Handled by Memory Editor - // 0xCC, 0xCD, 0xCE, 0xCF, 0xD0 - int egg_year = buff[0xD1]; - int egg_month = buff[0xD2]; - int egg_day = buff[0xD3]; - int met_year = buff[0xD4]; - int met_month = buff[0xD5]; - int met_day = buff[0xD6]; - // 0xD7 - unused - int eggloc = BitConverter.ToUInt16(buff, 0xD8); - int metloc = BitConverter.ToUInt16(buff, 0xDA); - int ball = buff[0xDC]; - int metlevel = buff[0xDD] & 0x7F; - int otgender = (buff[0xDD]) >> 7; - int encountertype = buff[0xDE]; - int gamevers = buff[0xDF]; - int countryID = buff[0xE0]; - int regionID = buff[0xE1]; - int dsregID = buff[0xE2]; - int otlang = buff[0xE3]; - // 0xE4, 0xE5, 0xE6, 0xE7 - unused - - // - // Populate Fields - // - - CHK_Fateful.Checked = Convert.ToBoolean(feflag); - CHK_IsEgg.Checked = Convert.ToBoolean(isegg); - CHK_Nicknamed.Checked = Convert.ToBoolean(isnick); - Label_OTGender.Text = gendersymbols[otgender]; - Label_OTGender.ForeColor = ((otgender == 1) ? Color.Red : Color.Blue); - - // Private Use Character Fixing Text + TB_EC.Text = pk6.EncryptionConstant.ToString("X8"); + CHK_Fateful.Checked = pk6.FatefulEncounter; + CHK_IsEgg.Checked = pk6.IsEgg; + CHK_Nicknamed.Checked = pk6.IsNicknamed; + Label_OTGender.Text = gendersymbols[pk6.OT_Gender]; + Label_OTGender.ForeColor = ((pk6.OT_Gender == 1) ? Color.Red : Color.Blue); + CHK_Circle.Checked = pk6.Circle; + CHK_Triangle.Checked = pk6.Triangle; + CHK_Square.Checked = pk6.Square; + CHK_Heart.Checked = pk6.Heart; + CHK_Star.Checked = pk6.Star; + CHK_Diamond.Checked = pk6.Diamond; + TB_PID.Text = pk6.PID.ToString("X8"); + CB_Species.SelectedValue = pk6.Species; + CB_HeldItem.SelectedValue = pk6.HeldItem; + setAbilityList(TB_AbilityNumber, pk6.Species, CB_Ability, CB_Form); + TB_AbilityNumber.Text = pk6.AbilityNumber.ToString(); + CB_Ability.SelectedIndex = (pk6.AbilityNumber < 6) ? pk6.AbilityNumber >> 1 : 0; // with some simple error handling + CB_Nature.SelectedValue = pk6.Nature; + TB_TID.Text = pk6.TID.ToString("00000"); + TB_SID.Text = pk6.SID.ToString("00000"); + TB_Nickname.Text = pk6.Nickname; + TB_OT.Text = pk6.OT_Name; + TB_OTt2.Text = pk6.HT_Name; + if (pk6.CurrentHandler == 1) // HT { - nicknamestr = nicknamestr.Replace("\uE08F", "\u2640"); - nicknamestr = nicknamestr.Replace("\uE08E", "\u2642"); - } - - // Set Markings - CHK_Circle.Checked = ((markings >> 0) & 1) == 1; - CHK_Triangle.Checked = ((markings >> 1) & 1) == 1; - CHK_Square.Checked = ((markings >> 2) & 1) == 1; - CHK_Heart.Checked = ((markings >> 3) & 1) == 1; - CHK_Star.Checked = ((markings >> 4) & 1) == 1; - CHK_Diamond.Checked = ((markings >> 5) & 1) == 1; - - // Set Generic Identification Data - TB_PID.Text = PID.ToString("X8"); - CB_Species.SelectedValue = species; - CB_HeldItem.SelectedValue = helditem; - setAbilityList(TB_AbilityNumber, species, CB_Ability, CB_Form); - TB_AbilityNumber.Text = abilitynum.ToString(); - CB_Ability.SelectedIndex = (abilitynum < 6) ? abilitynum >> 1 : 0; // with some simple error handling - CB_Nature.SelectedValue = nature; - - TB_EXP.Text = exp.ToString(); - TB_TID.Text = TID.ToString("00000"); - TB_SID.Text = SID.ToString("00000"); - - TB_OT.Text = ot; - TB_Nickname.Text = nicknamestr; - TB_OTt2.Text = notOT; - - if (buff[0x93] == 1) // = 1 - { - TB_Friendship.Text = buff[0xA2].ToString(); + TB_Friendship.Text = pk6.HT_Friendship.ToString(); GB_nOT.BackgroundImage = mixedHighlight; GB_OT.BackgroundImage = null; } else // = 0 { - TB_Friendship.Text = OTfriendship.ToString(); + TB_Friendship.Text = pk6.OT_Friendship.ToString(); GB_OT.BackgroundImage = mixedHighlight; GB_nOT.BackgroundImage = null; } + CB_Language.SelectedValue = pk6.Language; + CB_Country.SelectedValue = pk6.Country; + CB_SubRegion.SelectedValue = pk6.Region; + CB_3DSReg.SelectedValue = pk6.ConsoleRegion; + CB_GameOrigin.SelectedValue = pk6.Version; + CB_EncounterType.SelectedValue = pk6.EncounterType; + CB_Ball.SelectedValue = pk6.Ball; - CB_Language.SelectedValue = otlang; - CB_Country.SelectedValue = countryID; - CB_SubRegion.SelectedValue = regionID; - CB_3DSReg.SelectedValue = dsregID; - CB_GameOrigin.SelectedValue = gamevers; - CB_EncounterType.SelectedValue = encountertype; - CB_Ball.SelectedValue = ball; - - if (met_month == 0) { met_month = 1; } - if (met_day == 0) { met_day = 1; } - try { CAL_MetDate.Value = new DateTime(met_year + 2000, met_month, met_day); } + if (pk6.Met_Month == 0) { pk6.Met_Month = 1; } + if (pk6.Met_Day == 0) { pk6.Met_Day = 1; } + try { CAL_MetDate.Value = new DateTime(pk6.Met_Year + 2000, pk6.Met_Month, pk6.Met_Day); } catch { CAL_MetDate.Value = new DateTime(2000, 1, 1); } - if (eggloc != 0) + if (pk6.Egg_Location != 0) { // Was obtained initially as an egg. CHK_AsEgg.Checked = true; GB_EggConditions.Enabled = true; - CB_EggLocation.SelectedValue = eggloc; - try { CAL_EggDate.Value = new DateTime(egg_year + 2000, egg_month, egg_day); } + CB_EggLocation.SelectedValue = pk6.Egg_Location; + try { CAL_EggDate.Value = new DateTime(pk6.Egg_Year + 2000, pk6.Egg_Month, pk6.Egg_Day); } catch { CAL_MetDate.Value = new DateTime(2000, 1, 1); } } else { CHK_AsEgg.Checked = GB_EggConditions.Enabled = false; CB_EggLocation.SelectedValue = 0; } - CB_MetLocation.SelectedValue = metloc; + CB_MetLocation.SelectedValue = pk6.Met_Location; // Set CT Gender to None if no CT, else set to gender symbol. - Label_CTGender.Text = ((TB_OTt2.Text == "") || (notOT == "")) ? "" : (notOTG) ? gendersymbols[1] : gendersymbols[0]; - Label_CTGender.ForeColor = ((notOTG) ? Color.Red : Color.Blue); + Label_CTGender.Text = ((TB_OTt2.Text == "") || (pk6.HT_Name == "")) ? "" : gendersymbols[pk6.HT_Gender]; + Label_CTGender.ForeColor = ((pk6.HT_Gender == 1) ? Color.Red : Color.Blue); - TB_MetLevel.Text = metlevel.ToString(); + TB_MetLevel.Text = pk6.Met_Level.ToString(); // Reset Label and ComboBox visibility, as well as non-data checked status. - Label_PKRS.Visible = CB_PKRSStrain.Visible = CHK_Infected.Checked = PKRS_Strain != 0; - Label_PKRSdays.Visible = CB_PKRSDays.Visible = PKRS_Duration != 0; + Label_PKRS.Visible = CB_PKRSStrain.Visible = CHK_Infected.Checked = pk6.PKRS_Strain != 0; + Label_PKRSdays.Visible = CB_PKRSDays.Visible = pk6.PKRS_Days != 0; // Set SelectedIndexes for PKRS - CB_PKRSStrain.SelectedIndex = PKRS_Strain; - CHK_Cured.Checked = (PKRS_Strain > 0 && PKRS_Duration == 0); - CB_PKRSDays.SelectedIndex = Math.Min(CB_PKRSDays.Items.Count - 1, PKRS_Duration); // to strip out bad hacked 'rus + CB_PKRSStrain.SelectedIndex = pk6.PKRS_Strain; + CHK_Cured.Checked = (pk6.PKRS_Strain > 0 && pk6.PKRS_Days == 0); + CB_PKRSDays.SelectedIndex = Math.Min(CB_PKRSDays.Items.Count - 1, pk6.PKRS_Days); // to strip out bad hacked 'rus - TB_Cool.Text = cnt_cool.ToString(); - TB_Beauty.Text = cnt_beauty.ToString(); - TB_Cute.Text = cnt_cute.ToString(); - TB_Smart.Text = cnt_smart.ToString(); - TB_Tough.Text = cnt_tough.ToString(); - TB_Sheen.Text = cnt_sheen.ToString(); + TB_Cool.Text = pk6.CNT_Cool.ToString(); + TB_Beauty.Text = pk6.CNT_Beauty.ToString(); + TB_Cute.Text = pk6.CNT_Cute.ToString(); + TB_Smart.Text = pk6.CNT_Smart.ToString(); + TB_Tough.Text = pk6.CNT_Tough.ToString(); + TB_Sheen.Text = pk6.CNT_Sheen.ToString(); - TB_HPIV.Text = HP_IV.ToString(); - TB_ATKIV.Text = ATK_IV.ToString(); - TB_DEFIV.Text = DEF_IV.ToString(); - TB_SPAIV.Text = SPA_IV.ToString(); - TB_SPDIV.Text = SPD_IV.ToString(); - TB_SPEIV.Text = SPE_IV.ToString(); + TB_HPIV.Text = pk6.IV_HP.ToString(); + TB_ATKIV.Text = pk6.IV_ATK.ToString(); + TB_DEFIV.Text = pk6.IV_DEF.ToString(); + TB_SPEIV.Text = pk6.IV_SPE.ToString(); + TB_SPAIV.Text = pk6.IV_SPA.ToString(); + TB_SPDIV.Text = pk6.IV_SPD.ToString(); - TB_HPEV.Text = HP_EV.ToString(); - TB_ATKEV.Text = ATK_EV.ToString(); - TB_DEFEV.Text = DEF_EV.ToString(); - TB_SPAEV.Text = SPA_EV.ToString(); - TB_SPDEV.Text = SPD_EV.ToString(); - TB_SPEEV.Text = SPE_EV.ToString(); + TB_HPEV.Text = pk6.EV_HP.ToString(); + TB_ATKEV.Text = pk6.EV_ATK.ToString(); + TB_DEFEV.Text = pk6.EV_DEF.ToString(); + TB_SPEEV.Text = pk6.EV_SPE.ToString(); + TB_SPAEV.Text = pk6.EV_SPA.ToString(); + TB_SPDEV.Text = pk6.EV_SPD.ToString(); - CB_Move1.SelectedValue = move1; - CB_Move2.SelectedValue = move2; - CB_Move3.SelectedValue = move3; - CB_Move4.SelectedValue = move4; - CB_RelearnMove1.SelectedValue = eggmove1; - CB_RelearnMove2.SelectedValue = eggmove2; - CB_RelearnMove3.SelectedValue = eggmove3; - CB_RelearnMove4.SelectedValue = eggmove4; - CB_PPu1.SelectedIndex = move1_ppu; - CB_PPu2.SelectedIndex = move2_ppu; - CB_PPu3.SelectedIndex = move3_ppu; - CB_PPu4.SelectedIndex = move4_ppu; - TB_PP1.Text = move1_pp.ToString(); - TB_PP2.Text = move2_pp.ToString(); - TB_PP3.Text = move3_pp.ToString(); - TB_PP4.Text = move4_pp.ToString(); + CB_Move1.SelectedValue = pk6.Move1; + CB_Move2.SelectedValue = pk6.Move2; + CB_Move3.SelectedValue = pk6.Move3; + CB_Move4.SelectedValue = pk6.Move4; + CB_RelearnMove1.SelectedValue = pk6.RelearnMove1; + CB_RelearnMove2.SelectedValue = pk6.RelearnMove2; + CB_RelearnMove3.SelectedValue = pk6.RelearnMove3; + CB_RelearnMove4.SelectedValue = pk6.RelearnMove4; + CB_PPu1.SelectedIndex = pk6.Move1_PPUps; + CB_PPu2.SelectedIndex = pk6.Move2_PPUps; + CB_PPu3.SelectedIndex = pk6.Move3_PPUps; + CB_PPu4.SelectedIndex = pk6.Move4_PPUps; + TB_PP1.Text = pk6.Move1_PP.ToString(); + TB_PP2.Text = pk6.Move2_PP.ToString(); + TB_PP3.Text = pk6.Move3_PP.ToString(); + TB_PP4.Text = pk6.Move4_PP.ToString(); - int level = PKX.getLevel(species, ref exp); - TB_Level.Text = level.ToString(); + pk6.Stat_Level = PKX.getLevel(pk6.Species, pk6.EXP); + if (pk6.Stat_Level == 100) + pk6.EXP = PKX.getEXP(pk6.Stat_Level, pk6.Species); + + TB_EXP.Text = pk6.EXP.ToString(); + TB_Level.Text = pk6.Stat_Level.ToString(); // Set Form if count is enough, else if count is more than 1 set equal to max else zero. - CB_Form.SelectedIndex = (CB_Form.Items.Count > altforms) ? altforms : (CB_Form.Items.Count > 1) ? CB_Form.Items.Count - 1 : 0; + CB_Form.SelectedIndex = (CB_Form.Items.Count > pk6.AltForm) ? pk6.AltForm : (CB_Form.Items.Count > 1) ? CB_Form.Items.Count - 1 : 0; // Load Extrabyte Value - TB_ExtraByte.Text = buff[Convert.ToInt32(CB_ExtraBytes.Text, 16)].ToString(); + TB_ExtraByte.Text = pk6.Data[Convert.ToInt32(CB_ExtraBytes.Text, 16)].ToString(); // Load Gender Flag - Label_Gender.Text = gendersymbols[genderflag]; - Label_Gender.ForeColor = (genderflag == 2) ? Label_Species.ForeColor : ((genderflag == 1) ? Color.Red : Color.Blue); + Label_Gender.Text = gendersymbols[pk6.Gender]; + Label_Gender.ForeColor = (pk6.Gender == 2) ? Label_Species.ForeColor : ((pk6.Gender == 1) ? Color.Red : Color.Blue); updateStats(); setIsShiny(); - CB_EncounterType.Visible = Label_EncounterType.Visible = !(gamevers > 12 || gamevers < 7); - if (gamevers > 12 || gamevers < 7) + CB_EncounterType.Visible = Label_EncounterType.Visible = !(pk6.Version > 12 || pk6.Version < 7); + if (pk6.Version > 12 || pk6.Version < 7) CB_EncounterType.SelectedValue = 0; init = true; @@ -1230,19 +1114,16 @@ private void populateFields(byte[] data) if (HaX) // DEV Illegality { - DEV_Ability.SelectedValue = ability; - MT_Level.Text = level.ToString(); - MT_Form.Text = altforms.ToString(); + DEV_Ability.SelectedValue = pk6.Ability; + MT_Level.Text = pk6.Stat_Level.ToString(); + MT_Form.Text = pk6.AltForm.ToString(); } // Set the Preview Box getQuickFiller(dragout); // Highlight the Current Handler - clickGT((buff[0x93] == 1) ? GB_nOT : GB_OT, null); - - if (!PKX.verifychk(buff)) - Util.Alert("PKX File has an invalid checksum."); + clickGT((pk6.CurrentHandler == 1) ? GB_nOT : GB_OT, null); } // General Use Functions shared by other Forms // internal static void setCountrySubRegion(ComboBox CB, string type) @@ -1292,7 +1173,7 @@ internal static void setAbilityList(MaskedTextBox tb_abil, int species, ComboBox // PKX Data Calculation Functions // private void setIsShiny() { - bool isShiny = PKX.getIsShiny(Util.getHEXval(TB_PID), Util.ToUInt32(TB_TID.Text), Util.ToUInt32(TB_SID.Text)); + bool isShiny = pk6.IsShiny; // Set the Controls BTN_Shinytize.Visible = BTN_Shinytize.Enabled = !isShiny; @@ -1306,12 +1187,13 @@ private void setMarkings() PictureBox[] pba = { PB_Mark1, PB_Mark2, PB_Mark3, PB_Mark4, PB_Mark5, PB_Mark6 }; CheckBox[] cba = { CHK_Circle, CHK_Triangle, CHK_Square, CHK_Heart, CHK_Star, CHK_Diamond }; for (int i = 0; i < 6; i++) - pba[i].Image = Util.ChangeOpacity(pba[i].InitialImage, (Convert.ToUInt16(cba[i].Checked)) * 0.9 + 0.1); + pba[i].Image = Util.ChangeOpacity(pba[i].InitialImage, (cba[i].Checked ? 1 : 0) * 0.9 + 0.1); - PB_MarkShiny.Image = Util.ChangeOpacity(PB_MarkShiny.InitialImage, (Convert.ToUInt16(!BTN_Shinytize.Enabled)) * 0.9 + 0.1); - PB_MarkCured.Image = Util.ChangeOpacity(PB_MarkCured.InitialImage, (Convert.ToUInt16(CHK_Cured.Checked)) * 0.9 + 0.1); - int gameindex = Util.getIndex(CB_GameOrigin); - PB_MarkPentagon.Image = Util.ChangeOpacity(PB_MarkPentagon.InitialImage, (Convert.ToUInt16(gameindex == 24 || gameindex == 25 || gameindex == 26 || gameindex == 27)) * 0.9 + 0.1); + PB_MarkShiny.Image = Util.ChangeOpacity(PB_MarkShiny.InitialImage, (!BTN_Shinytize.Enabled ? 1 : 0) * 0.9 + 0.1); + PB_MarkCured.Image = Util.ChangeOpacity(PB_MarkCured.InitialImage, (CHK_Cured.Checked ? 1 : 0) * 0.9 + 0.1); + + pk6.Version = Util.getIndex(CB_GameOrigin); + PB_MarkPentagon.Image = Util.ChangeOpacity(PB_MarkPentagon.InitialImage, ((pk6.Version == 24 || pk6.Version == 25 || pk6.Version == 26 || pk6.Version == 27) ? 1 : 0) * 0.9 + 0.1); } // Clicked Label Shortcuts // private void clickQR(object sender, EventArgs e) @@ -1327,7 +1209,7 @@ private void clickQR(object sender, EventArgs e) else try { byte[] pkx = PKX.decryptArray(ekx); - if (PKX.verifychk(pkx)) { Array.Copy(pkx, buff, 0xE8); populateFields(buff); } + if (PKX.verifychk(pkx)) { populateFields(pkx); } else Util.Alert("Invalid checksum in QR data."); } catch { Util.Alert("Error loading decrypted data."); } @@ -1344,22 +1226,22 @@ private void clickQR(object sender, EventArgs e) if (qr == null) return; - PKX data = new PKX(pkx, "Tabs"); - string[] r = PKX.getPKXSummary(data); + PK6 data = new PK6(pkx, "Tabs"); + string[] r = data.Summarize(specieslist[data.Species]); new QR(qr, dragout.Image, r[0], r[1], r[2], "PKHeX @ ProjectPokemon.org").ShowDialog(); } } private void clickFriendship(object sender, EventArgs e) { if (ModifierKeys == Keys.Control) // prompt to reset - TB_Friendship.Text = buff[0x93] == 0 ? buff[0xCA].ToString() : buff[0xA2].ToString(); + TB_Friendship.Text = pk6.CurrentHandler == 0 ? pk6.OT_Friendship.ToString() : pk6.HT_Friendship.ToString(); else - TB_Friendship.Text = TB_Friendship.Text == "255" ? PKX.getBaseFriendship(Util.getIndex(CB_Species)).ToString() : "255"; + TB_Friendship.Text = TB_Friendship.Text == "255" ? PKX.getBaseFriendship(pk6.Species).ToString() : "255"; } private void clickGender(object sender, EventArgs e) { // Get Gender Threshold - PKX.PersonalParser.Personal MonData = PKX.PersonalGetter.GetPersonal(Util.getIndex(CB_Species)); + PKX.PersonalParser.Personal MonData = PKX.PersonalGetter.GetPersonal(pk6.Species); int gt = MonData.GenderRatio; if (gt == 255 || gt == 0 || gt == 254) // Single gender/genderless @@ -1368,9 +1250,9 @@ private void clickGender(object sender, EventArgs e) if (gt >= 255) return; // If not a single gender(less) species: (should be <254 but whatever, 255 never happens) - int gender = PKX.getGender(Label_Gender.Text) ^ 1; - Label_Gender.Text = gendersymbols[gender]; - Label_Gender.ForeColor = (gender == 2) ? Label_Species.ForeColor : ((gender == 1) ? Color.Red : Color.Blue); + pk6.Gender = PKX.getGender(Label_Gender.Text) ^ 1; + Label_Gender.Text = gendersymbols[pk6.Gender]; + Label_Gender.ForeColor = (pk6.Gender == 2) ? Label_Species.ForeColor : ((pk6.Gender == 1) ? Color.Red : Color.Blue); if (PKX.getGender(CB_Form.Text) < 2) // Gendered Forms CB_Form.SelectedIndex = PKX.getGender(Label_Gender.Text); @@ -1430,15 +1312,15 @@ private void clickGT(object sender, EventArgs e) { if (sender as GroupBox == GB_OT) { - buff[0x93] = 0; - TB_Friendship.Text = buff[0xCA].ToString(); + pk6.CurrentHandler = 0; + TB_Friendship.Text = pk6.OT_Friendship.ToString(); GB_OT.BackgroundImage = mixedHighlight; GB_nOT.BackgroundImage = null; } else if (TB_OTt2.Text.Length > 0) { - buff[0x93] = 1; - TB_Friendship.Text = buff[0xA2].ToString(); + pk6.CurrentHandler = 1; + TB_Friendship.Text = pk6.HT_Friendship.ToString(); GB_OT.BackgroundImage = null; GB_nOT.BackgroundImage = mixedHighlight; } @@ -1473,49 +1355,47 @@ private void updateEXPLevel(object sender, EventArgs e) { changingFields = true; // Change the Level - uint exp = Util.ToUInt32(TB_EXP); - int level = (Util.ToInt32(TB_EXP.Text) == 0) ? 1 : PKX.getLevel(Util.getIndex(CB_Species), ref exp); + pk6.EXP = Util.ToUInt32(TB_EXP); + pk6.Stat_Level = (pk6.EXP == 0) ? 1 : PKX.getLevel(pk6.Species, pk6.EXP); + if (pk6.Stat_Level == 100) + pk6.EXP = PKX.getEXP(pk6.Stat_Level, pk6.Species); - TB_Level.Text = level.ToString(); + TB_Level.Text = pk6.Stat_Level.ToString(); if (!MT_Level.Visible) - TB_EXP.Text = exp.ToString(); + TB_EXP.Text = pk6.EXP.ToString(); else - MT_Level.Text = level.ToString(); + MT_Level.Text = pk6.Stat_Level.ToString(); } else { changingFields = true; // Change the XP - int level = Util.ToInt32((MT_Level.Focused ? MT_Level : TB_Level).Text); - if (level > 100) TB_Level.Text = "100"; - if (level > 255) MT_Level.Text = "255"; + pk6.Stat_Level = Util.ToInt32((MT_Level.Focused ? MT_Level : TB_Level).Text); + if (pk6.Stat_Level > 100) TB_Level.Text = "100"; + if (pk6.Stat_Level > 255) MT_Level.Text = "255"; - TB_EXP.Text = PKX.getEXP(level, Util.getIndex(CB_Species)).ToString(); + TB_EXP.Text = PKX.getEXP(pk6.Stat_Level, pk6.Species).ToString(); } changingFields = false; updateStats(); } private void updateHPType(object sender, EventArgs e) { - if (changingFields) return; + if (changingFields || init) return; changingFields = true; - int[] ivs = - { - Util.ToInt32(TB_HPIV.Text), Util.ToInt32(TB_ATKIV.Text), Util.ToInt32(TB_DEFIV.Text), - Util.ToInt32(TB_SPAIV.Text), Util.ToInt32(TB_SPDIV.Text), Util.ToInt32(TB_SPEIV.Text) - }; - // Change IVs to match the new Hidden Power - int[] newIVs = PKX.setHPIVs(Util.getIndex(CB_HPType), ivs); - TB_HPIV.Text = newIVs[0].ToString(); - TB_ATKIV.Text = newIVs[1].ToString(); - TB_DEFIV.Text = newIVs[2].ToString(); + // Store current IVs + pk6.IV_HP = Util.ToInt32(TB_HPIV.Text); + pk6.IV_ATK = Util.ToInt32(TB_ATKIV.Text); + pk6.IV_DEF = Util.ToInt32(TB_DEFIV.Text); + pk6.IV_SPE = Util.ToInt32(TB_SPEIV.Text); + pk6.IV_SPA = Util.ToInt32(TB_SPAIV.Text); + pk6.IV_SPD = Util.ToInt32(TB_SPDIV.Text); - TB_SPAIV.Text = newIVs[3].ToString(); - TB_SPDIV.Text = newIVs[4].ToString(); - TB_SPEIV.Text = newIVs[5].ToString(); - - // Refresh View + // Update HP type, object will change IVs + pk6.HPType = Util.getIndex(CB_HPType); + + // Refresh IVs changingFields = false; updateIVs(null, null); } @@ -1526,56 +1406,29 @@ private void updateIVs(object sender, EventArgs e) if (Util.ToInt32((sender as MaskedTextBox).Text) > 31) (sender as MaskedTextBox).Text = "31"; - int[] ivs = - { - Util.ToInt32(TB_HPIV.Text), Util.ToInt32(TB_ATKIV.Text), Util.ToInt32(TB_DEFIV.Text), - Util.ToInt32(TB_SPEIV.Text), Util.ToInt32(TB_SPAIV.Text), Util.ToInt32(TB_SPDIV.Text) - }; - changingFields = true; - CB_HPType.SelectedValue = PKX.getHPType(ivs); + + // Update IVs + TB_HPIV.Text = pk6.IV_HP.ToString(); + TB_ATKIV.Text = pk6.IV_ATK.ToString(); + TB_DEFIV.Text = pk6.IV_DEF.ToString(); + + TB_SPEIV.Text = pk6.IV_SPE.ToString(); + TB_SPAIV.Text = pk6.IV_SPA.ToString(); + TB_SPDIV.Text = pk6.IV_SPD.ToString(); + + CB_HPType.SelectedValue = pk6.HPType; changingFields = false; - int ivtotal = ivs.Sum(); - TB_IVTotal.Text = ivtotal.ToString(); - // Potential Reading - if (!unicode) - { - if (ivtotal <= 90) - L_Potential.Text = "★☆☆☆"; - else if (ivtotal <= 120) - L_Potential.Text = "★★☆☆"; - else if (ivtotal <= 150) - L_Potential.Text = "★★★☆"; - else - L_Potential.Text = "★★★★"; - } - else - { - if (ivtotal <= 90) - L_Potential.Text = "+"; - else if (ivtotal <= 120) - L_Potential.Text = "++"; - else if (ivtotal <= 150) - L_Potential.Text = "+++"; - else - L_Potential.Text = "++++"; - } + L_Potential.Text = ((!unicode) + ? new[] {"★☆☆☆", "★★☆☆", "★★★☆", "★★★★"} + : new[] {"+", "++", "+++", "++++"} + )[pk6.PotentialRating]; - // Characteristic with EC%6 - int pm6 = (int)(Util.getHEXval(TB_EC) % 6); // EC MOD 6 - int maxIV = ivs.Max(); - int pm6stat = 0; + TB_IVTotal.Text = pk6.IVs.Sum().ToString(); - for (int i = 0; i < 6; i++) - { - pm6stat = (pm6 + i) % 6; - if (ivs[pm6stat] == maxIV) - break; // P%6 is this stat - } - - L_Characteristic.Text = characteristics[pm6stat * 5 + maxIV % 5]; + L_Characteristic.Text = characteristics[pk6.Characteristic]; updateStats(); } private void updateEVs(object sender, EventArgs e) @@ -1584,26 +1437,31 @@ private void updateEVs(object sender, EventArgs e) if (Util.ToInt32((sender as MaskedTextBox).Text) > 252) (sender as MaskedTextBox).Text = "252"; - int HP_EV = Util.ToInt32(TB_HPEV.Text); - int ATK_EV = Util.ToInt32(TB_ATKEV.Text); - int DEF_EV = Util.ToInt32(TB_DEFEV.Text); - int SPA_EV = Util.ToInt32(TB_SPAEV.Text); - int SPD_EV = Util.ToInt32(TB_SPDEV.Text); - int SPE_EV = Util.ToInt32(TB_SPEEV.Text); + changingFields = true; + pk6.EV_HP = Util.ToInt32(TB_HPEV.Text); + pk6.EV_ATK = Util.ToInt32(TB_ATKEV.Text); + pk6.EV_DEF = Util.ToInt32(TB_DEFEV.Text); + pk6.EV_SPA = Util.ToInt32(TB_SPAEV.Text); + pk6.EV_SPD = Util.ToInt32(TB_SPDEV.Text); + pk6.EV_SPE = Util.ToInt32(TB_SPEEV.Text); - int evtotal = HP_EV + ATK_EV + DEF_EV + SPA_EV + SPD_EV + SPE_EV; + int evtotal = pk6.EVs.Sum(); if (evtotal > 510) // Background turns Red TB_EVTotal.BackColor = Color.Red; else if (evtotal == 510) // Maximum EVs TB_EVTotal.BackColor = Color.Honeydew; + else if (evtotal == 508) // Fishy EVs + TB_EVTotal.BackColor = Color.LightYellow; else TB_EVTotal.BackColor = Color.WhiteSmoke; TB_EVTotal.Text = evtotal.ToString(); + changingFields = false; updateStats(); } private void updateRandomIVs(object sender, EventArgs e) { + changingFields = true; if (ModifierKeys == Keys.Control || ModifierKeys == Keys.Shift) { // Max IVs @@ -1623,6 +1481,8 @@ private void updateRandomIVs(object sender, EventArgs e) TB_SPDIV.Text = (Util.rnd32() & 0x1F).ToString(); TB_SPEIV.Text = (Util.rnd32() & 0x1F).ToString(); } + changingFields = false; + updateStats(); } private void updateRandomEVs(object sender, EventArgs e) { @@ -1649,7 +1509,7 @@ private void updateRandomEVs(object sender, EventArgs e) } private void updateRandomPID(object sender, EventArgs e) { - TB_PID.Text = PKX.getRandomPID(Util.getIndex(CB_Species), PKX.getGender(Label_Gender.Text)).ToString("X8"); + TB_PID.Text = PKX.getRandomPID(pk6.Species, PKX.getGender(Label_Gender.Text)).ToString("X8"); getQuickFiller(dragout); } private void updateRandomEC(object sender, EventArgs e) @@ -1788,21 +1648,20 @@ private void updateCountry(object sender, EventArgs e) private void updateSpecies(object sender, EventArgs e) { // Change Species Prompted - int species = Util.getIndex(CB_Species); - int level = Util.ToInt32(TB_Level.Text); - if (MT_Level.Visible) level = Util.ToInt32(MT_Level.Text); + pk6.Species = Util.getIndex(CB_Species); + pk6.Stat_Level = Util.ToInt32(TB_Level.Text); + if (MT_Level.Visible) pk6.Stat_Level = Util.ToInt32(MT_Level.Text); // Get Forms for Given Species - setForms(species, CB_Form, Label_Form); + setForms(pk6.Species, CB_Form, Label_Form); // Recalculate EXP for Given Level - uint exp = PKX.getEXP(level, species); - TB_EXP.Text = exp.ToString(); + pk6.EXP = PKX.getEXP(pk6.Stat_Level, pk6.Species); + TB_EXP.Text = pk6.EXP.ToString(); // Check for Gender Changes // Get Gender Threshold - species = Util.getIndex(CB_Species); - PKX.PersonalParser.Personal MonData = PKX.PersonalGetter.GetPersonal(species); + PKX.PersonalParser.Personal MonData = PKX.PersonalGetter.GetPersonal(pk6.Species); int gt = MonData.GenderRatio; int genderflag; @@ -1815,9 +1674,10 @@ private void updateSpecies(object sender, EventArgs e) else // get gender from old PID correlation genderflag = ((Util.getHEXval(TB_PID) & 0xFF) <= gt) ? 1 : 0; - Label_Gender.Text = gendersymbols[genderflag]; - Label_Gender.ForeColor = (genderflag == 2) ? Label_Species.ForeColor : ((genderflag == 1) ? Color.Red : Color.Blue); - setAbilityList(TB_AbilityNumber, Util.getIndex(CB_Species), CB_Ability, CB_Form); + pk6.Gender = genderflag; + Label_Gender.Text = gendersymbols[pk6.Gender]; + Label_Gender.ForeColor = (pk6.Gender == 2) ? Label_Species.ForeColor : ((pk6.Gender == 1) ? Color.Red : Color.Blue); + setAbilityList(TB_AbilityNumber, pk6.Species, CB_Ability, CB_Form); updateForm(null, null); // If species changes and no nickname, set the new name == speciesName. @@ -1826,9 +1686,9 @@ private void updateSpecies(object sender, EventArgs e) } private void updateOriginGame(object sender, EventArgs e) { - int gameorigin = Util.getIndex(CB_GameOrigin); + pk6.Version = Util.getIndex(CB_GameOrigin); - if (gameorigin < 24 && origintrack != "Past") + if (pk6.Version < 24 && origintrack != "Past") { // Load Past Gen Locations #region B2W2 Met Locations @@ -1848,12 +1708,12 @@ private void updateOriginGame(object sender, EventArgs e) CB_EggLocation.ValueMember = "Value"; CB_EggLocation.DataSource = new BindingSource(met_list, null); CB_EggLocation.SelectedValue = 0; - CB_MetLocation.SelectedValue = gameorigin < 20 ? 30001 : 60001; + CB_MetLocation.SelectedValue = pk6.Version < 20 ? 30001 : 60001; origintrack = "Past"; } #endregion } - else if (gameorigin > 23 && (origintrack != "XY")) + else if (pk6.Version > 23 && (origintrack != "XY")) { // Load X/Y/OR/AS locations #region ORAS Met Locations @@ -1878,7 +1738,7 @@ private void updateOriginGame(object sender, EventArgs e) } #endregion } - if (gameorigin < 0x10 && origintrack != "Gen4") + if (pk6.Version < 0x10 && origintrack != "Gen4") { // Load Gen 4 egg locations if Gen 4 Origin. #region HGSS Met Locations @@ -1899,9 +1759,9 @@ private void updateOriginGame(object sender, EventArgs e) } // Visibility logic for Gen 4 encounter type; only show for Gen 4 Pokemon. - CB_EncounterType.Visible = Label_EncounterType.Visible = !(gameorigin > 12 || gameorigin < 7); + CB_EncounterType.Visible = Label_EncounterType.Visible = !(pk6.Version > 12 || pk6.Version < 7); // If not Gen 4, set Encounter Type to 0 after it set !visible. - if (gameorigin > 12 || gameorigin < 7) + if (pk6.Version > 12 || pk6.Version < 7) CB_EncounterType.SelectedValue = 0; setMarkings(); // Set/Remove KB marking @@ -1914,12 +1774,12 @@ private void updateExtraByteValue(object sender, EventArgs e) int value = Util.ToInt32(TB_ExtraByte.Text); int offset = Convert.ToInt32(CB_ExtraBytes.Text, 16); - buff[offset] = (byte)value; + pk6.Data[offset] = (byte)value; } private void updateExtraByteIndex(object sender, EventArgs e) { // Byte changed, need to refresh the Text box for the byte's value. - TB_ExtraByte.Text = buff[Convert.ToInt32(CB_ExtraBytes.Text, 16)].ToString(); + TB_ExtraByte.Text = pk6.Data[Convert.ToInt32(CB_ExtraBytes.Text, 16)].ToString(); } private void updateNatureModification(object sender, EventArgs e) { @@ -1982,7 +1842,7 @@ private void updateNotOT(object sender, EventArgs e) { clickGT(GB_OT, null); // Switch CT over to OT. Label_CTGender.Text = ""; - TB_Friendship.Text = buff[0xCA].ToString(); + TB_Friendship.Text = pk6.OT_Friendship.ToString(); } else if (Label_CTGender.Text == "") Label_CTGender.Text = gendersymbols[0]; @@ -2056,12 +1916,13 @@ private void updateShinyPID(object sender, EventArgs e) } private void updateTSV(object sender, EventArgs e) { - uint tsv = PKX.getTSV(Util.ToUInt32(TB_TID.Text), Util.ToUInt32(TB_SID.Text)); - Tip1.SetToolTip(TB_TID, "TSV: " + tsv.ToString("0000")); - Tip2.SetToolTip(TB_SID, "TSV: " + tsv.ToString("0000")); + pk6.TID = (ushort)Util.ToUInt32(TB_TID.Text); + pk6.SID = (ushort)Util.ToUInt32(TB_SID.Text); + Tip1.SetToolTip(TB_TID, "TSV: " + pk6.TSV.ToString("0000")); + Tip2.SetToolTip(TB_SID, "TSV: " + pk6.TSV.ToString("0000")); - uint psv = PKX.getPSV(Util.getHEXval(TB_PID)); - Tip3.SetToolTip(TB_PID, "PSV: " + psv.ToString("0000")); + pk6.PID = Util.getHEXval(TB_PID); + Tip3.SetToolTip(TB_PID, "PSV: " + pk6.PSV.ToString("0000")); } private void update_ID(object sender, EventArgs e) { @@ -2108,42 +1969,26 @@ private void removedropCB(object sender, KeyEventArgs e) private void updateStats() { // Gather the needed information. - int species = Util.getIndex(CB_Species); - int level = Util.ToInt32((MT_Level.Enabled) ? MT_Level.Text : TB_Level.Text); - if (level == 0) { level = 1; } - int form = CB_Form.SelectedIndex; - int HP_IV = Util.ToInt32(TB_HPIV.Text); - int ATK_IV = Util.ToInt32(TB_ATKIV.Text); - int DEF_IV = Util.ToInt32(TB_DEFIV.Text); - int SPA_IV = Util.ToInt32(TB_SPAIV.Text); - int SPD_IV = Util.ToInt32(TB_SPDIV.Text); - int SPE_IV = Util.ToInt32(TB_SPEIV.Text); + pk6.Stat_Level = Util.ToInt32((MT_Level.Enabled) ? MT_Level.Text : TB_Level.Text); + if (pk6.Stat_Level == 0) { pk6.Stat_Level = 1; } + pk6.AltForm = CB_Form.SelectedIndex; - int HP_EV = Util.ToInt32(TB_HPEV.Text); - int ATK_EV = Util.ToInt32(TB_ATKEV.Text); - int DEF_EV = Util.ToInt32(TB_DEFEV.Text); - int SPA_EV = Util.ToInt32(TB_SPAEV.Text); - int SPD_EV = Util.ToInt32(TB_SPDEV.Text); - int SPE_EV = Util.ToInt32(TB_SPEEV.Text); - - int nature = Util.getIndex(CB_Nature); + pk6.Nature = Util.getIndex(CB_Nature); // Generate the stats. - ushort[] stats = PKX.getStats(species, level, nature, form, - HP_EV, ATK_EV, DEF_EV, SPA_EV, SPD_EV, SPE_EV, - HP_IV, ATK_IV, DEF_IV, SPA_IV, SPD_IV, SPE_IV); + pk6.CalculateStats(); - Stat_HP.Text = stats[0].ToString(); - Stat_ATK.Text = stats[1].ToString(); - Stat_DEF.Text = stats[2].ToString(); - Stat_SPA.Text = stats[4].ToString(); - Stat_SPD.Text = stats[5].ToString(); - Stat_SPE.Text = stats[3].ToString(); + Stat_HP.Text = pk6.Stat_HPCurrent.ToString(); + Stat_ATK.Text = pk6.Stat_ATK.ToString(); + Stat_DEF.Text = pk6.Stat_DEF.ToString(); + Stat_SPE.Text = pk6.Stat_SPE.ToString(); + Stat_SPA.Text = pk6.Stat_SPA.ToString(); + Stat_SPD.Text = pk6.Stat_SPD.ToString(); // Recolor the Stat Labels based on boosted stats. { - int incr = nature / 5; - int decr = nature % 5; + int incr = pk6.Nature / 5; + int decr = pk6.Nature % 5; Label[] labarray = { Label_ATK, Label_DEF, Label_SPE, Label_SPA, Label_SPD }; // Reset Label Colors @@ -2177,8 +2022,12 @@ private void getShowdownSet() CHK_Nicknamed.Checked = (Set.Nickname != null); if (Set.Nickname != null) TB_Nickname.Text = Set.Nickname; - if (Set.Gender != null && PKX.getGender(Label_Gender.Text) != 2 && PKX.getGender(Set.Gender) != 2) - Label_Gender.Text = Set.Gender; + if (Set.Gender != null && PKX.getGender(Set.Gender) != 2 && PKX.getGender(Set.Gender) != 2) + { + int Gender = PKX.getGender(Set.Gender); + Label_Gender.Text = gendersymbols[Gender]; + Label_Gender.ForeColor = (Gender == 2) ? Label_Species.ForeColor : ((Gender == 1) ? Color.Red : Color.Blue); + } // Set Form string[] formStrings = PKX.getFormList(Set.Species, @@ -2281,9 +2130,9 @@ private byte[] preparepkx(bool click = true) tabMain.Select(); // hack to make sure comboboxes are set (users scrolling through and immediately setting causes this) // Stuff the global byte array with our PKX form data // Create a new storage so we don't muck up things with the original - if (buff.Length == 232) Array.Resize(ref buff, 260); + if (pk6.Data.Length == 232) Array.Resize(ref pk6.Data, 260); byte[] pkx = new byte[0x104]; - Array.Copy(buff, pkx, 0x104); + Array.Copy(pk6.Data, pkx, 0x104); // Repopulate PKX with Edited Stuff if (Util.getIndex(CB_GameOrigin) < 24) { @@ -2309,48 +2158,46 @@ private byte[] preparepkx(bool click = true) TB_EC.Text = PID.ToString("X8"); } - Array.Copy(BitConverter.GetBytes(Util.getHEXval(TB_EC)), 0, pkx, 0, 4); // EC - Array.Copy(BitConverter.GetBytes(0), 0, pkx, 0x4, 4); // 0 CHK for now + pk6.EncryptionConstant = Util.getHEXval(TB_EC); + pk6.Checksum = 0; // 0 CHK for now // Block A - int species = Util.getIndex(CB_Species); - Array.Copy(BitConverter.GetBytes(species), 0, pkx, 0x08, 2); // Species - Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_HeldItem)), 0, pkx, 0x0A, 2); // Held Item - Array.Copy(BitConverter.GetBytes(Util.ToUInt32(TB_TID.Text)), 0, pkx, 0x0C, 2); // TID - Array.Copy(BitConverter.GetBytes(Util.ToUInt32(TB_SID.Text)), 0, pkx, 0x0E, 2); // SID - Array.Copy(BitConverter.GetBytes(Convert.ToUInt32(TB_EXP.Text)), 0, pkx, 0x10, 4); // EXP - pkx[0x14] = (byte)Array.IndexOf(abilitylist, (CB_Ability.Text).Remove((CB_Ability.Text).Length - 4)); // Ability - pkx[0x15] = (byte)(Util.ToInt32((TB_AbilityNumber.Text))); // Number + pk6.Species = Util.getIndex(CB_Species); + pk6.HeldItem = Util.getIndex(CB_HeldItem); + pk6.TID = Util.ToInt32(TB_TID.Text); + pk6.SID = Util.ToInt32(TB_SID.Text); + pk6.EXP = Util.ToUInt32(TB_EXP.Text); + pk6.Ability = (byte)Array.IndexOf(abilitylist, (CB_Ability.Text).Remove((CB_Ability.Text).Length - 4)); + pk6.AbilityNumber = Util.ToInt32(TB_AbilityNumber.Text); // Number // pkx[0x16], pkx[0x17] are handled by the Medals UI (Hits & Training Bag) - Array.Copy(BitConverter.GetBytes(Util.getHEXval(TB_PID)), 0, pkx, 0x18, 4); // PID - pkx[0x1C] = (byte)((Util.getIndex(CB_Nature))); // Nature - int fegform = Convert.ToInt32(CHK_Fateful.Checked); // Fateful - fegform |= (PKX.getGender(Label_Gender.Text) << 1); // Gender - fegform |= (Math.Min((MT_Form.Enabled) ? Convert.ToInt32(MT_Form.Text) : CB_Form.SelectedIndex, 32) << 3); // Form - pkx[0x1D] = (byte)fegform; - pkx[0x1E] = (byte)Util.ToInt32(TB_HPEV.Text); // EVs - pkx[0x1F] = (byte)Util.ToInt32(TB_ATKEV.Text); - pkx[0x20] = (byte)Util.ToInt32(TB_DEFEV.Text); - pkx[0x21] = (byte)Util.ToInt32(TB_SPEEV.Text); - pkx[0x22] = (byte)Util.ToInt32(TB_SPAEV.Text); - pkx[0x23] = (byte)Util.ToInt32(TB_SPDEV.Text); + pk6.PID = Util.getHEXval(TB_PID); + pk6.Nature = (byte)(Util.getIndex(CB_Nature)); + pk6.FatefulEncounter = CHK_Fateful.Checked; + pk6.Gender = PKX.getGender(Label_Gender.Text); + pk6.AltForm = Math.Min((MT_Form.Enabled) ? Convert.ToInt32(MT_Form.Text) : CB_Form.SelectedIndex, 32); // Form + pk6.EV_HP = Util.ToInt32(TB_HPEV.Text); // EVs + pk6.EV_ATK = Util.ToInt32(TB_ATKEV.Text); + pk6.EV_DEF = Util.ToInt32(TB_DEFEV.Text); + pk6.EV_SPE = Util.ToInt32(TB_SPEEV.Text); + pk6.EV_SPA = Util.ToInt32(TB_SPAEV.Text); + pk6.EV_SPD = Util.ToInt32(TB_SPDEV.Text); - pkx[0x24] = (byte)Util.ToInt32(TB_Cool.Text); // CNT - pkx[0x25] = (byte)Util.ToInt32(TB_Beauty.Text); - pkx[0x26] = (byte)Util.ToInt32(TB_Cute.Text); - pkx[0x27] = (byte)Util.ToInt32(TB_Smart.Text); - pkx[0x28] = (byte)Util.ToInt32(TB_Tough.Text); - pkx[0x29] = (byte)Util.ToInt32(TB_Sheen.Text); + pk6.CNT_Cool = Util.ToInt32(TB_Cool.Text); // CNT + pk6.CNT_Beauty = Util.ToInt32(TB_Beauty.Text); + pk6.CNT_Cute = Util.ToInt32(TB_Cute.Text); + pk6.CNT_Smart = Util.ToInt32(TB_Smart.Text); + pk6.CNT_Tough = Util.ToInt32(TB_Tough.Text); + pk6.CNT_Sheen = Util.ToInt32(TB_Sheen.Text); - int markings = CHK_Circle.Checked ? (1 << 0) : 0; - markings |= CHK_Triangle.Checked ? (1 << 1) : 0; - markings |= CHK_Square.Checked ? (1 << 2) : 0; - markings |= CHK_Heart.Checked ? (1 << 3) : 0; - markings |= CHK_Star.Checked ? (1 << 4) : 0; - markings |= CHK_Diamond.Checked ? (1 << 5) : 0; - pkx[0x2A] = (byte)markings; - pkx[0x2B] = (byte)(CB_PKRSStrain.SelectedIndex << 4 | CB_PKRSDays.SelectedIndex); + pk6.Circle = CHK_Circle.Checked; + pk6.Triangle = CHK_Triangle.Checked; + pk6.Square = CHK_Square.Checked; + pk6.Heart = CHK_Heart.Checked; + pk6.Star = CHK_Star.Checked; + pk6.Diamond = CHK_Diamond.Checked; + pk6.PKRS_Days = CB_PKRSDays.SelectedIndex; + pk6.PKRS_Strain = CB_PKRSStrain.SelectedIndex; // Already in buff (then transferred to new pkx) // 0x2C, 0x2D, 0x2E, 0x2F // 0x30, 0x31, 0x32, 0x33 @@ -2363,71 +2210,51 @@ private byte[] preparepkx(bool click = true) // Block B // Convert Nickname field back to bytes - string nicknamestr = TB_Nickname.Text; - { - nicknamestr = nicknamestr.Replace("\u2640", "\uE08F"); - nicknamestr = nicknamestr.Replace("\u2642", "\uE08E"); - nicknamestr = nicknamestr.Replace("\u0027", "\u2019"); // ' to ’ - } - byte[] nicknamebytes = Encoding.Unicode.GetBytes(nicknamestr); - Array.Resize(ref nicknamebytes, nicknamebytes.Length + 2); // pad with zero byte terminator - Array.Copy(nicknamebytes, 0, pkx, 0x40, nicknamebytes.Length); - + pk6.Nickname = TB_Nickname.Text; // 0x58, 0x59 unused - Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_Move1)), 0, pkx, 0x5A, 2); // Move 1 - Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_Move2)), 0, pkx, 0x5C, 2); // Move 2 - Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_Move3)), 0, pkx, 0x5E, 2); // Move 3 - Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_Move4)), 0, pkx, 0x60, 2); // Move 4 - - pkx[0x62] = (byte)(Util.getIndex(CB_Move1) > 0 ? Util.ToInt32(TB_PP1.Text) : 0); // Max PP - pkx[0x63] = (byte)(Util.getIndex(CB_Move2) > 0 ? Util.ToInt32(TB_PP2.Text) : 0); - pkx[0x64] = (byte)(Util.getIndex(CB_Move3) > 0 ? Util.ToInt32(TB_PP3.Text) : 0); - pkx[0x65] = (byte)(Util.getIndex(CB_Move4) > 0 ? Util.ToInt32(TB_PP4.Text) : 0); - - pkx[0x66] = (byte)(Util.getIndex(CB_Move1) > 0 ? CB_PPu1.SelectedIndex : 0); // PP Ups - pkx[0x67] = (byte)(Util.getIndex(CB_Move2) > 0 ? CB_PPu2.SelectedIndex : 0); - pkx[0x68] = (byte)(Util.getIndex(CB_Move3) > 0 ? CB_PPu3.SelectedIndex : 0); - pkx[0x69] = (byte)(Util.getIndex(CB_Move4) > 0 ? CB_PPu4.SelectedIndex : 0); - - Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_RelearnMove1)), 0, pkx, 0x6A, 2); // EggMove 1 - Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_RelearnMove2)), 0, pkx, 0x6C, 2); // EggMove 2 - Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_RelearnMove3)), 0, pkx, 0x6E, 2); // EggMove 3 - Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_RelearnMove4)), 0, pkx, 0x70, 2); // EggMove 4 - + pk6.Move1 = Util.getIndex(CB_Move1); + pk6.Move2 = Util.getIndex(CB_Move2); + pk6.Move3 = Util.getIndex(CB_Move3); + pk6.Move4 = Util.getIndex(CB_Move4); + pk6.Move1_PP = (Util.getIndex(CB_Move1) > 0 ? Util.ToInt32(TB_PP1.Text) : 0); + pk6.Move2_PP = (Util.getIndex(CB_Move2) > 0 ? Util.ToInt32(TB_PP2.Text) : 0); + pk6.Move3_PP = (Util.getIndex(CB_Move3) > 0 ? Util.ToInt32(TB_PP3.Text) : 0); + pk6.Move4_PP = (Util.getIndex(CB_Move4) > 0 ? Util.ToInt32(TB_PP4.Text) : 0); + pk6.Move1_PPUps = (Util.getIndex(CB_Move1) > 0 ? CB_PPu1.SelectedIndex : 0); + pk6.Move2_PPUps = (Util.getIndex(CB_Move2) > 0 ? CB_PPu2.SelectedIndex : 0); + pk6.Move3_PPUps = (Util.getIndex(CB_Move3) > 0 ? CB_PPu3.SelectedIndex : 0); + pk6.Move4_PPUps = (Util.getIndex(CB_Move4) > 0 ? CB_PPu4.SelectedIndex : 0); + pk6.RelearnMove1 = Util.getIndex(CB_RelearnMove1); + pk6.RelearnMove2 = Util.getIndex(CB_RelearnMove2); + pk6.RelearnMove3 = Util.getIndex(CB_RelearnMove3); + pk6.RelearnMove4 = Util.getIndex(CB_RelearnMove4); // 0x72 - Ribbon editor sets this flag (Secret Super Training) // 0x73 - - uint IV32 = Util.ToUInt32(TB_HPIV.Text) & 0x1F; - IV32 |= ((Util.ToUInt32(TB_ATKIV.Text) & 0x1F) << 5); - IV32 |= ((Util.ToUInt32(TB_DEFIV.Text) & 0x1F) << 10); - IV32 |= ((Util.ToUInt32(TB_SPEIV.Text) & 0x1F) << 15); - IV32 |= ((Util.ToUInt32(TB_SPAIV.Text) & 0x1F) << 20); - IV32 |= ((Util.ToUInt32(TB_SPDIV.Text) & 0x1F) << 25); - IV32 |= (Convert.ToUInt32(CHK_IsEgg.Checked) << 30); - IV32 |= (Convert.ToUInt32(CHK_Nicknamed.Checked) << 31); - - Array.Copy(BitConverter.GetBytes(IV32), 0, pkx, 0x74, 4); // Copy in IVs + pk6.IV_HP = Util.ToInt32(TB_HPIV.Text); + pk6.IV_ATK = Util.ToInt32(TB_ATKIV.Text); + pk6.IV_DEF = Util.ToInt32(TB_DEFIV.Text); + pk6.IV_SPE = Util.ToInt32(TB_SPEIV.Text); + pk6.IV_SPA = Util.ToInt32(TB_SPAIV.Text); + pk6.IV_SPD = Util.ToInt32(TB_SPDIV.Text); + pk6.IsEgg = CHK_IsEgg.Checked; + pk6.IsNicknamed = CHK_Nicknamed.Checked; // Block C // Convert Latest OT field back to bytes - byte[] OT2 = Encoding.Unicode.GetBytes(Util.TrimFromZero(TB_OTt2.Text).Replace("\u0027", "\u2019")); - Array.Resize(ref OT2, OT2.Length + 2); // Allow Trash - Array.Copy(OT2, 0, pkx, 0x78, OT2.Length); + pk6.HT_Name = TB_OTt2.Text; // 0x90-0xAF - pkx[0x92] = Convert.ToByte(PKX.getGender(Label_CTGender.Text) == 1); + pk6.HT_Gender = PKX.getGender(Label_CTGender.Text); // Plus more, set by MemoryAmie (already in buff) // Block D // Convert OT field back to bytes - byte[] OT = Encoding.Unicode.GetBytes(TB_OT.Text.Replace("\u0027", "\u2019")); - Array.Resize(ref OT, OT.Length + 2); // Pad with \0000 to terminate - Array.Copy(OT, 0, pkx, 0xB0, OT.Length); + pk6.OT_Name = TB_OT.Text; - if (pkx[0x93] == 0) - pkx[0xCA] = (byte)(Util.ToInt32(TB_Friendship.Text) & 0xFF); + if (pk6.CurrentHandler == 0) + pk6.OT_Friendship = Util.ToInt32(TB_Friendship.Text); else // 1 - pkx[0xA2] = (byte)(Util.ToInt32(TB_Friendship.Text) & 0xFF); + pk6.HT_Friendship = Util.ToInt32(TB_Friendship.Text); int egg_year = 2000; // Dates int egg_month = 0; @@ -2441,34 +2268,30 @@ private byte[] preparepkx(bool click = true) egg_location = Util.getIndex(CB_EggLocation); } // Egg Met Data - pkx[0xD1] = (byte)(egg_year - 2000); - pkx[0xD2] = (byte)egg_month; - pkx[0xD3] = (byte)egg_day; + pk6.Egg_Year = egg_year - 2000; + pk6.Egg_Month = egg_month; + pk6.Egg_Day = egg_day; + pk6.Egg_Location = egg_location; // Met Data - pkx[0xD4] = (byte)(CAL_MetDate.Value.Year - 2000); - pkx[0xD5] = (byte)CAL_MetDate.Value.Month; - pkx[0xD6] = (byte)CAL_MetDate.Value.Day; + pk6.Met_Year = CAL_MetDate.Value.Year - 2000; + pk6.Met_Month = CAL_MetDate.Value.Month; + pk6.Met_Day = CAL_MetDate.Value.Day; + pk6.Met_Location = Util.getIndex(CB_MetLocation); // Locations - if (CHK_IsEgg.Checked && CB_MetLocation.SelectedIndex == 0) // If still an egg, it has no hatch location/date. Zero it! - { - pkx[0xD4] = 0; - pkx[0xD5] = 0; - pkx[0xD6] = 0; - } + if (pk6.IsEgg && pk6.Met_Location == 0) // If still an egg, it has no hatch location/date. Zero it! + pk6.Egg_Year = pk6.Egg_Month = pk6.Egg_Day = 0; // 0xD7 Unknown - int met_location = Util.getIndex(CB_MetLocation); // Locations - Array.Copy(BitConverter.GetBytes(egg_location), 0, pkx, 0xD8, 2); // Egg Location - Array.Copy(BitConverter.GetBytes(met_location), 0, pkx, 0xDA, 2); // Met Location - pkx[0xDC] = (byte)Util.getIndex(CB_Ball); - pkx[0xDD] = (byte)(((Util.ToInt32(TB_MetLevel.Text) & 0x7F) | (Convert.ToInt32(PKX.getGender(Label_OTGender.Text) == 1) << 7))); - pkx[0xDE] = (byte)(Util.ToInt32(CB_EncounterType.SelectedValue.ToString())); - pkx[0xDF] = (byte)Util.getIndex(CB_GameOrigin); - pkx[0xE0] = (byte)Util.getIndex(CB_Country); - pkx[0xE1] = (byte)Util.getIndex(CB_SubRegion); - pkx[0xE2] = (byte)Util.getIndex(CB_3DSReg); - pkx[0xE3] = (byte)Util.getIndex(CB_Language); + pk6.Ball = Util.getIndex(CB_Ball); + pk6.Met_Level = Util.ToInt32(TB_MetLevel.Text); + pk6.OT_Gender = PKX.getGender(Label_OTGender.Text); + pk6.EncounterType = Util.ToInt32(CB_EncounterType.SelectedValue.ToString()); + pk6.Version = Util.getIndex(CB_GameOrigin); + pk6.Country = Util.getIndex(CB_Country); + pk6.Region = Util.getIndex(CB_SubRegion); + pk6.ConsoleRegion = Util.getIndex(CB_3DSReg); + pk6.Language = Util.getIndex(CB_Language); // 0xE4-0xE7 Array.Resize(ref pkx, 260); @@ -2522,16 +2345,8 @@ private byte[] preparepkx(bool click = true) pkx[0xA4] = pkx[0xA5] = pkx[0xA6] = 0; // No Memory Types } - // Now we fix the checksum! - ushort chk = 0; - for (int i = 8; i < 232; i += 2) // Loop through the entire PKX - chk += BitConverter.ToUInt16(pkx, i); - - // Apply New Checksum - Array.Copy(BitConverter.GetBytes(chk), 0, pkx, 6, 2); - // PKX is now filled - return pkx; + return pk6.Write(); } // Drag & Drop Events private void tabMain_DragEnter(object sender, DragEventArgs e) @@ -2555,9 +2370,9 @@ private void dragout_MouseDown(object sender, MouseEventArgs e) // Make a new file name byte[] dragdata = preparepkx(); - PKX pkx = new PKX(dragdata, "Tabs"); + var pkx = new PK6(dragdata, "Tabs"); string filename = pkx.Nickname; - if (filename != pkx.Species) + if (filename != specieslist[pkx.Species]) filename += " (" + pkx.Species + ")"; filename += " - " + pkx.PID; @@ -2764,8 +2579,8 @@ private void clickView(object sender, EventArgs e) } try { - Array.Copy(pkxdata, buff, 0xE8); - populateFields(buff); + Array.Resize(ref pkxdata, 0xE8); + populateFields(pkxdata); } catch // If it fails, try XORing encrypted zeroes { @@ -2774,12 +2589,12 @@ private void clickView(object sender, EventArgs e) byte[] blank = PKX.encryptArray(new byte[0xE8]); for (int i = 0; i < 0xE8; i++) - blank[i] = (byte)(buff[i] ^ blank[i]); + blank[i] = (byte)(pk6.Data[i] ^ blank[i]); populateFields(blank); } catch // Still fails, just let the original errors occur. - { populateFields(buff); } + { populateFields(pk6.Data); } } // Visual to display what slot is currently loaded. getSlotColor(slot, Properties.Resources.slotView); @@ -3695,9 +3510,9 @@ private void pbBoxSlot_MouseDown(object sender, MouseEventArgs e) // Make a new file name based off the PID byte[] dragdata = PKX.decryptArray(pkm_from); Array.Resize(ref dragdata, 0xE8); - PKX pkx = new PKX(dragdata, "Boxes"); + var pkx = new PK6(dragdata, "Boxes"); string filename = pkx.Nickname; - if (filename != pkx.Species) + if (filename != specieslist[pkx.Species]) filename += " (" + pkx.Species + ")"; filename += " - " + pkx.PID + ".pk6"; diff --git a/PKX/f3-MemoryAmie.cs b/PKX/f3-MemoryAmie.cs index eadab76fc..d561e5ea7 100644 --- a/PKX/f3-MemoryAmie.cs +++ b/PKX/f3-MemoryAmie.cs @@ -46,7 +46,7 @@ public partial class MemoryAmie : Form past = "Past Gen"; withOT = "Memories with"; } - h = Main.buff; + h = Main.pk6.Data; getCountries(); getLangStrings(); @@ -85,9 +85,9 @@ private void loadFields() if (Util.TrimFromZero(m_parent.TB_OTt2.Text) != "") CB_Handler.Items.AddRange(new object[] { m_parent.TB_OTt2.Text }); else - Main.buff[0x93] = 0; + Main.pk6.CurrentHandler = 0; - tabControl1.SelectedIndex = CB_Handler.SelectedIndex = Main.buff[0x93]; + tabControl1.SelectedIndex = CB_Handler.SelectedIndex = Main.pk6.CurrentHandler; if (m_parent.CHK_IsEgg.Checked) { @@ -167,8 +167,8 @@ private void saveFields() cb1v(CB_CTMemory, 0xA5); if (!CB_CTVar.Enabled) { - Main.buff[0xA8] = 0; - Main.buff[0xA9] = 0; + Main.pk6.Data[0xA8] = 0; + Main.pk6.Data[0xA9] = 0; } else cb2v(CB_CTVar, 0xA8); @@ -176,21 +176,21 @@ private void saveFields() // If memory doesn't contain a feeling/quality if (!CB_CTFeel.Enabled) { - Main.buff[0xA4] = 0; - Main.buff[0xA6] = 0; + Main.pk6.Data[0xA4] = 0; + Main.pk6.Data[0xA6] = 0; } else { cb1i(CB_CTFeel, 0xA6); - Main.buff[0xA4] = (byte)(CB_CTQual.SelectedIndex + 1); + Main.pk6.Data[0xA4] = (byte)(CB_CTQual.SelectedIndex + 1); } #endregion #region // OT MEMORIES cb1v(CB_OTMemory, 0xCD); if (!CB_OTVar.Enabled) { - Main.buff[0xCE] = 0; - Main.buff[0xCF] = 0; + Main.pk6.Data[0xCE] = 0; + Main.pk6.Data[0xCF] = 0; } else cb2v(CB_OTVar, 0xCE); @@ -198,13 +198,13 @@ private void saveFields() // If memory doesn't contain a feeling/quality if (!CB_OTFeel.Enabled) { - Main.buff[0xCC] = 0; - Main.buff[0xD0] = 0; + Main.pk6.Data[0xCC] = 0; + Main.pk6.Data[0xD0] = 0; } else { cb1i(CB_OTFeel, 0xD0); - Main.buff[0xCC] = (byte)(CB_OTQual.SelectedIndex + 1); + Main.pk6.Data[0xCC] = (byte)(CB_OTQual.SelectedIndex + 1); } #endregion } diff --git a/PKX/f4-RibbMedal.Designer.cs b/PKX/f4-RibbMedal.Designer.cs index ad88f6703..a02cce095 100644 --- a/PKX/f4-RibbMedal.Designer.cs +++ b/PKX/f4-RibbMedal.Designer.cs @@ -34,11 +34,18 @@ private void InitializeComponent() this.BTN_None = new System.Windows.Forms.Button(); this.BTN_Cancel = new System.Windows.Forms.Button(); this.Tab_Medals = new System.Windows.Forms.TabPage(); + this.CHK_D5 = new System.Windows.Forms.CheckBox(); + this.CHK_D4 = new System.Windows.Forms.CheckBox(); + this.L_Distro = new System.Windows.Forms.Label(); + this.CHK_D3 = new System.Windows.Forms.CheckBox(); + this.CHK_D0 = new System.Windows.Forms.CheckBox(); + this.CHK_D1 = new System.Windows.Forms.CheckBox(); + this.CHK_D2 = new System.Windows.Forms.CheckBox(); this.CHK_Secret = new System.Windows.Forms.CheckBox(); this.GB_Medals1 = new System.Windows.Forms.GroupBox(); - this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.CB_Bag = new System.Windows.Forms.ComboBox(); this.L_Bag = new System.Windows.Forms.Label(); - this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + this.NUD_BagHits = new System.Windows.Forms.NumericUpDown(); this.L_Hits = new System.Windows.Forms.Label(); this.L_SuperTraining = new System.Windows.Forms.Label(); this.L_Rank3 = new System.Windows.Forms.Label(); @@ -236,16 +243,9 @@ private void InitializeComponent() this.Hoenn1b_5 = new System.Windows.Forms.CheckBox(); this.Hoenn1b_6 = new System.Windows.Forms.CheckBox(); this.Hoenn1b_7 = new System.Windows.Forms.CheckBox(); - this.CHK_D5 = new System.Windows.Forms.CheckBox(); - this.CHK_D4 = new System.Windows.Forms.CheckBox(); - this.L_Distro = new System.Windows.Forms.Label(); - this.CHK_D3 = new System.Windows.Forms.CheckBox(); - this.CHK_D0 = new System.Windows.Forms.CheckBox(); - this.CHK_D1 = new System.Windows.Forms.CheckBox(); - this.CHK_D2 = new System.Windows.Forms.CheckBox(); this.Tab_Medals.SuspendLayout(); this.GB_Medals1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_BagHits)).BeginInit(); this.GB_Medals2.SuspendLayout(); this.Tab_Extra.SuspendLayout(); this.GB_Extra2.SuspendLayout(); @@ -362,6 +362,75 @@ private void InitializeComponent() this.Tab_Medals.Text = "Training Medals"; this.Tab_Medals.UseVisualStyleBackColor = true; // + // CHK_D5 + // + this.CHK_D5.AutoSize = true; + this.CHK_D5.Location = new System.Drawing.Point(447, 16); + this.CHK_D5.Name = "CHK_D5"; + this.CHK_D5.Size = new System.Drawing.Size(32, 17); + this.CHK_D5.TabIndex = 44; + this.CHK_D5.Text = "5"; + this.CHK_D5.UseVisualStyleBackColor = true; + // + // CHK_D4 + // + this.CHK_D4.AutoSize = true; + this.CHK_D4.Location = new System.Drawing.Point(415, 16); + this.CHK_D4.Name = "CHK_D4"; + this.CHK_D4.Size = new System.Drawing.Size(32, 17); + this.CHK_D4.TabIndex = 43; + this.CHK_D4.Text = "4"; + this.CHK_D4.UseVisualStyleBackColor = true; + // + // L_Distro + // + this.L_Distro.AutoSize = true; + this.L_Distro.Location = new System.Drawing.Point(318, 3); + this.L_Distro.Name = "L_Distro"; + this.L_Distro.Size = new System.Drawing.Size(62, 13); + this.L_Distro.TabIndex = 38; + this.L_Distro.Text = "Distribution:"; + // + // CHK_D3 + // + this.CHK_D3.AutoSize = true; + this.CHK_D3.Location = new System.Drawing.Point(382, 16); + this.CHK_D3.Name = "CHK_D3"; + this.CHK_D3.Size = new System.Drawing.Size(32, 17); + this.CHK_D3.TabIndex = 42; + this.CHK_D3.Text = "3"; + this.CHK_D3.UseVisualStyleBackColor = true; + // + // CHK_D0 + // + this.CHK_D0.AutoSize = true; + this.CHK_D0.Location = new System.Drawing.Point(382, 2); + this.CHK_D0.Name = "CHK_D0"; + this.CHK_D0.Size = new System.Drawing.Size(32, 17); + this.CHK_D0.TabIndex = 39; + this.CHK_D0.Text = "0"; + this.CHK_D0.UseVisualStyleBackColor = true; + // + // CHK_D1 + // + this.CHK_D1.AutoSize = true; + this.CHK_D1.Location = new System.Drawing.Point(415, 2); + this.CHK_D1.Name = "CHK_D1"; + this.CHK_D1.Size = new System.Drawing.Size(32, 17); + this.CHK_D1.TabIndex = 40; + this.CHK_D1.Text = "1"; + this.CHK_D1.UseVisualStyleBackColor = true; + // + // CHK_D2 + // + this.CHK_D2.AutoSize = true; + this.CHK_D2.Location = new System.Drawing.Point(447, 2); + this.CHK_D2.Name = "CHK_D2"; + this.CHK_D2.Size = new System.Drawing.Size(32, 17); + this.CHK_D2.TabIndex = 41; + this.CHK_D2.Text = "2"; + this.CHK_D2.UseVisualStyleBackColor = true; + // // CHK_Secret // this.CHK_Secret.AutoSize = true; @@ -375,9 +444,9 @@ private void InitializeComponent() // // GB_Medals1 // - this.GB_Medals1.Controls.Add(this.comboBox1); + this.GB_Medals1.Controls.Add(this.CB_Bag); this.GB_Medals1.Controls.Add(this.L_Bag); - this.GB_Medals1.Controls.Add(this.numericUpDown1); + this.GB_Medals1.Controls.Add(this.NUD_BagHits); this.GB_Medals1.Controls.Add(this.L_Hits); this.GB_Medals1.Controls.Add(this.L_SuperTraining); this.GB_Medals1.Controls.Add(this.L_Rank3); @@ -407,14 +476,14 @@ private void InitializeComponent() this.GB_Medals1.TabIndex = 5; this.GB_Medals1.TabStop = false; // - // comboBox1 + // CB_Bag // - this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBox1.FormattingEnabled = true; - this.comboBox1.Location = new System.Drawing.Point(105, 166); - this.comboBox1.Name = "comboBox1"; - this.comboBox1.Size = new System.Drawing.Size(110, 21); - this.comboBox1.TabIndex = 23; + this.CB_Bag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.CB_Bag.FormattingEnabled = true; + this.CB_Bag.Location = new System.Drawing.Point(105, 166); + this.CB_Bag.Name = "CB_Bag"; + this.CB_Bag.Size = new System.Drawing.Size(110, 21); + this.CB_Bag.TabIndex = 23; // // L_Bag // @@ -425,19 +494,19 @@ private void InitializeComponent() this.L_Bag.Text = "Last Used Bag:"; this.L_Bag.TextAlign = System.Drawing.ContentAlignment.TopRight; // - // numericUpDown1 + // NUD_BagHits // - this.numericUpDown1.Location = new System.Drawing.Point(105, 187); - this.numericUpDown1.Maximum = new decimal(new int[] { + this.NUD_BagHits.Location = new System.Drawing.Point(105, 187); + this.NUD_BagHits.Maximum = new decimal(new int[] { 255, 0, 0, 0}); - this.numericUpDown1.Name = "numericUpDown1"; - this.numericUpDown1.Size = new System.Drawing.Size(50, 20); - this.numericUpDown1.TabIndex = 21; - this.numericUpDown1.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; - this.numericUpDown1.Value = new decimal(new int[] { + this.NUD_BagHits.Name = "NUD_BagHits"; + this.NUD_BagHits.Size = new System.Drawing.Size(50, 20); + this.NUD_BagHits.TabIndex = 21; + this.NUD_BagHits.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.NUD_BagHits.Value = new decimal(new int[] { 255, 0, 0, @@ -2609,75 +2678,6 @@ private void InitializeComponent() this.Hoenn1b_7.Text = "Smart Master"; this.Hoenn1b_7.UseVisualStyleBackColor = true; // - // CHK_D5 - // - this.CHK_D5.AutoSize = true; - this.CHK_D5.Location = new System.Drawing.Point(447, 16); - this.CHK_D5.Name = "CHK_D5"; - this.CHK_D5.Size = new System.Drawing.Size(32, 17); - this.CHK_D5.TabIndex = 44; - this.CHK_D5.Text = "5"; - this.CHK_D5.UseVisualStyleBackColor = true; - // - // CHK_D4 - // - this.CHK_D4.AutoSize = true; - this.CHK_D4.Location = new System.Drawing.Point(415, 16); - this.CHK_D4.Name = "CHK_D4"; - this.CHK_D4.Size = new System.Drawing.Size(32, 17); - this.CHK_D4.TabIndex = 43; - this.CHK_D4.Text = "4"; - this.CHK_D4.UseVisualStyleBackColor = true; - // - // L_Distro - // - this.L_Distro.AutoSize = true; - this.L_Distro.Location = new System.Drawing.Point(318, 3); - this.L_Distro.Name = "L_Distro"; - this.L_Distro.Size = new System.Drawing.Size(62, 13); - this.L_Distro.TabIndex = 38; - this.L_Distro.Text = "Distribution:"; - // - // CHK_D3 - // - this.CHK_D3.AutoSize = true; - this.CHK_D3.Location = new System.Drawing.Point(382, 16); - this.CHK_D3.Name = "CHK_D3"; - this.CHK_D3.Size = new System.Drawing.Size(32, 17); - this.CHK_D3.TabIndex = 42; - this.CHK_D3.Text = "3"; - this.CHK_D3.UseVisualStyleBackColor = true; - // - // CHK_D0 - // - this.CHK_D0.AutoSize = true; - this.CHK_D0.Location = new System.Drawing.Point(382, 2); - this.CHK_D0.Name = "CHK_D0"; - this.CHK_D0.Size = new System.Drawing.Size(32, 17); - this.CHK_D0.TabIndex = 39; - this.CHK_D0.Text = "0"; - this.CHK_D0.UseVisualStyleBackColor = true; - // - // CHK_D1 - // - this.CHK_D1.AutoSize = true; - this.CHK_D1.Location = new System.Drawing.Point(415, 2); - this.CHK_D1.Name = "CHK_D1"; - this.CHK_D1.Size = new System.Drawing.Size(32, 17); - this.CHK_D1.TabIndex = 40; - this.CHK_D1.Text = "1"; - this.CHK_D1.UseVisualStyleBackColor = true; - // - // CHK_D2 - // - this.CHK_D2.AutoSize = true; - this.CHK_D2.Location = new System.Drawing.Point(447, 2); - this.CHK_D2.Name = "CHK_D2"; - this.CHK_D2.Size = new System.Drawing.Size(32, 17); - this.CHK_D2.TabIndex = 41; - this.CHK_D2.Text = "2"; - this.CHK_D2.UseVisualStyleBackColor = true; - // // RibbMedal // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -2699,7 +2699,7 @@ private void InitializeComponent() this.Tab_Medals.PerformLayout(); this.GB_Medals1.ResumeLayout(false); this.GB_Medals1.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.NUD_BagHits)).EndInit(); this.GB_Medals2.ResumeLayout(false); this.GB_Medals2.PerformLayout(); this.Tab_Extra.ResumeLayout(false); @@ -2954,9 +2954,9 @@ private void InitializeComponent() private System.Windows.Forms.PictureBox PB_53; private System.Windows.Forms.PictureBox PB_52; private System.Windows.Forms.PictureBox PB_51; - private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.ComboBox CB_Bag; private System.Windows.Forms.Label L_Bag; - private System.Windows.Forms.NumericUpDown numericUpDown1; + private System.Windows.Forms.NumericUpDown NUD_BagHits; private System.Windows.Forms.Label L_Hits; private System.Windows.Forms.CheckBox ORAS_5; private System.Windows.Forms.CheckBox ORAS_4; diff --git a/PKX/f4-RibbMedal.cs b/PKX/f4-RibbMedal.cs index 0ac095a31..909b0fc1c 100644 --- a/PKX/f4-RibbMedal.cs +++ b/PKX/f4-RibbMedal.cs @@ -13,12 +13,12 @@ public RibbMedal() Util.TranslateInterface(this, Main.curlanguage); // Set up Training Bag Data - comboBox1.Items.Clear(); - comboBox1.Items.Add("---"); + CB_Bag.Items.Clear(); + CB_Bag.Items.Add("---"); for (int i = 1; i < Main.trainingbags.Length - 1; i++) - comboBox1.Items.Add(Main.trainingbags[i]); - comboBox1.SelectedIndex = Main.buff[0x17]; - numericUpDown1.Value = Main.buff[0x16]; + CB_Bag.Items.Add(Main.trainingbags[i]); + CB_Bag.SelectedIndex = Main.pk6.TrainingBag; + NUD_BagHits.Value = Main.pk6.TrainingBagHits; getRibbons(); } private void getRibbons() @@ -66,7 +66,7 @@ private void getRibbons() pba[i].Image = Util.ChangeOpacity(bma[i], 0.1); // Populate Medals (what a mess) - int rv = Main.buff[0x2C]; + int rv = Main.pk6.Data[0x2C]; updateRibbon(TMedal1_0, rv, 0); updateRibbon(TMedal1_1, rv, 1); updateRibbon(TMedal1_2, rv, 2); @@ -75,7 +75,7 @@ private void getRibbons() updateRibbon(TMedal1_5, rv, 5); updateRibbon(TMedal1_6, rv, 6); updateRibbon(TMedal1_7, rv, 7); - rv = Main.buff[0x2D]; + rv = Main.pk6.Data[0x2D]; updateRibbon(TMedal2_0, rv, 0); updateRibbon(TMedal2_1, rv, 1); updateRibbon(TMedal2_2, rv, 2); @@ -84,7 +84,7 @@ private void getRibbons() updateRibbon(TMedal2_5, rv, 5); updateRibbon(TMedal2_6, rv, 6); updateRibbon(TMedal2_7, rv, 7); - rv = Main.buff[0x2E]; + rv = Main.pk6.Data[0x2E]; updateRibbon(TMedal3_0, rv, 0); updateRibbon(TMedal3_1, rv, 1); updateRibbon(TMedal3_2, rv, 2); @@ -93,7 +93,7 @@ private void getRibbons() updateRibbon(TMedal3_5, rv, 5); updateRibbon(TMedal3_6, rv, 6); updateRibbon(TMedal3_7, rv, 7); - rv = Main.buff[0x2F]; + rv = Main.pk6.Data[0x2F]; updateRibbon(TMedal4_0, rv, 0); updateRibbon(TMedal4_1, rv, 1); updateRibbon(TMedal4_2, rv, 2); @@ -104,7 +104,7 @@ private void getRibbons() updateRibbon(TMedal4_7, rv, 7); // Populate Kalos Ribbons - rv = Main.buff[0x30]; + rv = Main.pk6.Data[0x30]; updateRibbon(Kalos1a_0, rv, 0); updateRibbon(Kalos1a_1, rv, 1); updateRibbon(Kalos1a_2, rv, 2); @@ -113,7 +113,7 @@ private void getRibbons() updateRibbon(Kalos1a_5, rv, 5); updateRibbon(Kalos1a_6, rv, 6); updateRibbon(Kalos1a_7, rv, 7); - rv = Main.buff[0x31]; + rv = Main.pk6.Data[0x31]; updateRibbon(Kalos1b_0, rv, 0); updateRibbon(Kalos1b_1, rv, 1); updateRibbon(Kalos1b_2, rv, 2); @@ -122,7 +122,7 @@ private void getRibbons() updateRibbon(Kalos1b_5, rv, 5); updateRibbon(Kalos1b_6, rv, 6); updateRibbon(Kalos1b_7, rv, 7); - rv = Main.buff[0x32]; + rv = Main.pk6.Data[0x32]; updateRibbon(Kalos2a_0, rv, 0); updateRibbon(Kalos2a_1, rv, 1); updateRibbon(Kalos2a_2, rv, 2); @@ -131,7 +131,7 @@ private void getRibbons() updateRibbon(Kalos2a_5, rv, 5); updateRibbon(Kalos2a_6, rv, 6); updateRibbon(Kalos2a_7, rv, 7); - rv = Main.buff[0x33]; + rv = Main.pk6.Data[0x33]; updateRibbon(Kalos2b_0, rv, 0); updateRibbon(Kalos2b_1, rv, 1); updateRibbon(Kalos2b_2, rv, 2); @@ -142,7 +142,7 @@ private void getRibbons() updateRibbon(Kalos2b_7, rv, 7); // Populate Extra Ribbons - rv = Main.buff[0x34]; + rv = Main.pk6.Data[0x34]; updateRibbon(Extra1_0, rv, 0); updateRibbon(Extra1_1, rv, 1); updateRibbon(Extra1_2, rv, 2); @@ -151,7 +151,7 @@ private void getRibbons() // oras updateRibbon(Extra1_7, rv, 7); - rv = Main.buff[0x35]; + rv = Main.pk6.Data[0x35]; updateRibbon(ORAS_0, rv, 0); updateRibbon(ORAS_1, rv, 1); updateRibbon(ORAS_2, rv, 2); @@ -159,10 +159,10 @@ private void getRibbons() updateRibbon(ORAS_4, rv, 4); updateRibbon(ORAS_5, rv, 5); - TB_PastContest.Text = Main.buff[0x38].ToString(); - TB_PastBattle.Text = Main.buff[0x39].ToString(); + TB_PastContest.Text = Main.pk6.Data[0x38].ToString(); + TB_PastBattle.Text = Main.pk6.Data[0x39].ToString(); - rv = Main.buff[0x3A]; + rv = Main.pk6.Data[0x3A]; updateRibbon(CHK_D0, rv, 0); updateRibbon(CHK_D1, rv, 1); updateRibbon(CHK_D2, rv, 2); @@ -170,7 +170,7 @@ private void getRibbons() updateRibbon(CHK_D4, rv, 4); updateRibbon(CHK_D5, rv, 5); - CHK_Secret.Checked = Convert.ToBoolean(Main.buff[0x72]); + CHK_Secret.Checked = Convert.ToBoolean(Main.pk6.Data[0x72]); } // Populate Ribbons prompted private void setRibbons() { @@ -208,10 +208,10 @@ private void setRibbons() kalos2b |= addRibbon(Kalos2b_5); kalos2b |= addRibbon(Kalos2b_6); kalos2b |= addRibbon(Kalos2b_7);//// - Main.buff[0x30] = (byte)kalos1a; - Main.buff[0x31] = (byte)kalos1b; - Main.buff[0x32] = (byte)kalos2a; - Main.buff[0x33] = (byte)kalos2b; + Main.pk6.Data[0x30] = (byte)kalos1a; + Main.pk6.Data[0x31] = (byte)kalos1b; + Main.pk6.Data[0x32] = (byte)kalos2a; + Main.pk6.Data[0x33] = (byte)kalos2b; // Pass Extra Ribbon int extra1 = 0; @@ -223,7 +223,7 @@ private void setRibbons() // ORAS extra1 |= addRibbon(Extra1_7); // Hoenn Champ - Main.buff[0x34] = (byte)extra1; + Main.pk6.Data[0x34] = (byte)extra1; int oras = 0; oras |= addRibbon(ORAS_0); @@ -232,7 +232,7 @@ private void setRibbons() oras |= addRibbon(ORAS_3); oras |= addRibbon(ORAS_4); oras |= addRibbon(ORAS_5); - Main.buff[0x35] = (byte)oras; + Main.pk6.Data[0x35] = (byte)oras; // Gather Super Training Medals int medals1 = 0, medals2 = 0, medals3 = 0, medals4 = 0; @@ -268,13 +268,13 @@ private void setRibbons() medals4 |= addRibbon(TMedal4_5); medals4 |= addRibbon(TMedal4_6); medals4 |= addRibbon(TMedal4_7);//// - Main.buff[0x2C] = (byte)medals1; - Main.buff[0x2D] = (byte)medals2; - Main.buff[0x2E] = (byte)medals3; - Main.buff[0x2F] = (byte)medals4; + Main.pk6.Data[0x2C] = (byte)medals1; + Main.pk6.Data[0x2D] = (byte)medals2; + Main.pk6.Data[0x2E] = (byte)medals3; + Main.pk6.Data[0x2F] = (byte)medals4; - Main.buff[0x38] = (byte)Util.ToUInt32(TB_PastContest.Text); - Main.buff[0x39] = (byte)Util.ToUInt32(TB_PastBattle.Text); + Main.pk6.Data[0x38] = (byte)Util.ToUInt32(TB_PastContest.Text); + Main.pk6.Data[0x39] = (byte)Util.ToUInt32(TB_PastBattle.Text); int dis = 0; dis |= addRibbon(CHK_D0); @@ -283,9 +283,9 @@ private void setRibbons() dis |= addRibbon(CHK_D3); dis |= addRibbon(CHK_D4); dis |= addRibbon(CHK_D5); - Main.buff[0x3A] = (byte)dis; + Main.pk6.Data[0x3A] = (byte)dis; - Main.buff[0x72] = Convert.ToByte(CHK_Secret.Checked); + Main.pk6.Data[0x72] = Convert.ToByte(CHK_Secret.Checked); } // Saving Ribbons prompted private void updateRibbon(CheckBox chk, int rv, int sh) { @@ -328,7 +328,7 @@ private void buttonFlag(bool b) TB_PastContest.Text = (Convert.ToInt32(b) * 40).ToString(); TB_PastBattle.Text = (Convert.ToInt32(b) * 8).ToString(); - if (Main.buff[0xDF] <= 0x10) return; // gen3 + if (Main.pk6.Data[0xDF] <= 0x10) return; // gen3 TB_PastContest.Text = 0.ToString(); // no past gen ribbons 4-5 TB_PastBattle.Text = 0.ToString(); } @@ -360,8 +360,8 @@ private void buttonFlag(bool b) private void BTN_Save_Click(object sender, EventArgs e) { - Main.buff[0x17] = (byte)comboBox1.SelectedIndex; - Main.buff[0x16] = (byte)numericUpDown1.Value; + Main.pk6.Data[0x17] = (byte)CB_Bag.SelectedIndex; + Main.pk6.Data[0x16] = (byte)NUD_BagHits.Value; setRibbons(); Close(); } // Save Button diff --git a/SAV/frmReport.cs b/SAV/frmReport.cs index b42397618..3209da2d2 100644 --- a/SAV/frmReport.cs +++ b/SAV/frmReport.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.ComponentModel; +using System.Drawing; using System.IO; using System.Linq; using System.Reflection; @@ -13,6 +14,102 @@ namespace PKHeX public partial class frmReport : Form { private byte[] SaveData; + + public class Preview + { + private PK6 pk6; + public string Position { get { return pk6.Identifier; } } + public Image Sprite { get { return pk6.Sprite; } } + public string Nickname { get { return pk6.Nickname; } } + public string Species { get { return Main.specieslist[pk6.Species]; } } + public string Nature { get { return Main.natures[pk6.Nature]; } } + public string Gender { get { return Main.gendersymbols[pk6.Gender]; } } + public string ESV { get { return pk6.PSV.ToString("0000"); } } + public string HP_Type { get { return Main.types[pk6.HPType]; } } + public string Ability { get { return Main.abilitylist[pk6.Ability]; } } + public string Move1 { get { return Main.movelist[pk6.Move1]; } } + public string Move2 { get { return Main.movelist[pk6.Move2]; } } + public string Move3 { get { return Main.movelist[pk6.Move3]; } } + public string Move4 { get { return Main.movelist[pk6.Move4]; } } + public string HeldItem { get { return Main.itemlist[pk6.HeldItem]; } } + public string MetLoc { get { return PKX.getLocation(false, pk6.Version, pk6.Met_Location); } } + public string EggLoc { get { return PKX.getLocation(false, pk6.Version, pk6.Egg_Location); } } + public string Ball { get { return Main.balllist[pk6.Ball]; } } + public string OT { get { return pk6.OT_Name; } } + public string Version { get { return Main.gamelist[pk6.Version]; } } + public string OTLang { get { return Main.gamelanguages[pk6.Language] ?? String.Format("UNK {0}", pk6.Language); } } + public string CountryID { get { return pk6.Country.ToString(); } } + public string RegionID { get { return pk6.Region.ToString(); } } + public string DSRegionID { get { return pk6.ConsoleRegion.ToString(); } } + + #region Extraneous + public string EC { get { return pk6.EncryptionConstant.ToString("X8"); } } + public string PID { get { return pk6.PID.ToString("X8"); } } + public int HP_IV { get { return pk6.IV_HP; } } + public int ATK_IV { get { return pk6.IV_ATK; } } + public int DEF_IV { get { return pk6.IV_DEF; } } + public int SPA_IV { get { return pk6.IV_SPA; } } + public int SPD_IV { get { return pk6.IV_SPD; } } + public int SPE_IV { get { return pk6.IV_SPE; } } + public uint EXP { get { return pk6.EXP; } } + public int Level { get { return pk6.Stat_Level; } } + public int HP_EV { get { return pk6.EV_HP; } } + public int ATK_EV { get { return pk6.EV_ATK; } } + public int DEF_EV { get { return pk6.EV_DEF; } } + public int SPA_EV { get { return pk6.EV_SPA; } } + public int SPD_EV { get { return pk6.EV_SPD; } } + public int SPE_EV { get { return pk6.EV_SPE; } } + public int Cool { get { return pk6.CNT_Cool; } } + public int Beauty { get { return pk6.CNT_Beauty; } } + public int Cute { get { return pk6.CNT_Cute; } } + public int Smart { get { return pk6.CNT_Smart; } } + public int Tough { get { return pk6.CNT_Tough; } } + public int Sheen { get { return pk6.CNT_Sheen; } } + public int Markings { get { return pk6.Markings; } } + + public string NotOT { get { return pk6.HT_Name; } } + + public int AbilityNum { get { return pk6.AbilityNumber; } } + public int GenderFlag { get { return pk6.Gender; } } + public int AltForms { get { return pk6.AltForm; } } + public int PKRS_Strain { get { return pk6.PKRS_Strain; } } + public int PKRS_Days { get { return pk6.PKRS_Days; } } + public int MetLevel { get { return pk6.Met_Level; } } + public int OT_Gender { get { return pk6.OT_Gender; } } + + public bool FatefulFlag { get { return pk6.FatefulEncounter; } } + public bool IsEgg { get { return pk6.IsEgg; } } + public bool IsNicknamed { get { return pk6.IsNicknamed; } } + public bool IsShiny { get { return pk6.IsShiny; } } + + public int TID { get { return pk6.TID; } } + public int SID { get { return pk6.SID; } } + public int TSV { get { return pk6.TSV; } } + public int Move1_PP { get { return pk6.Move1_PP; } } + public int Move2_PP { get { return pk6.Move2_PP; } } + public int Move3_PP { get { return pk6.Move3_PP; } } + public int Move4_PP { get { return pk6.Move4_PP; } } + public int Move1_PPUp { get { return pk6.Move1_PPUps; } } + public int Move2_PPUp { get { return pk6.Move2_PPUps; } } + public int Move3_PPUp { get { return pk6.Move3_PPUps; } } + public int Move4_PPUp { get { return pk6.Move4_PPUps; } } + public string Relearn1 { get { return Main.movelist[pk6.RelearnMove1]; } } + public string Relearn2 { get { return Main.movelist[pk6.RelearnMove2]; } } + public string Relearn3 { get { return Main.movelist[pk6.RelearnMove3]; } } + public string Relearn4 { get { return Main.movelist[pk6.RelearnMove4]; } } + public ushort Checksum { get { return pk6.Checksum; } } + public int mFriendship { get { return pk6.OT_Friendship; } } + public int OT_Affection { get { return pk6.OT_Affection; } } + public int Egg_Year { get { return pk6.Egg_Year; } } + public int Egg_Month { get { return pk6.Egg_Month; } } + public int Egg_Day { get { return pk6.Egg_Day; } } + public int Met_Year { get { return pk6.Met_Year; } } + public int Met_Month { get { return pk6.Met_Month; } } + public int Met_Day { get { return pk6.Met_Day; } } + public int Encounter { get { return pk6.EncounterType; } } + #endregion + public Preview(PK6 p) { pk6 = p; } + } public frmReport() { InitializeComponent(); @@ -36,9 +133,9 @@ public void PopulateData(byte[] InputData, int BoxDataOffset) byte[] dslotdata = PKX.decryptArray(slotdata); if (BitConverter.ToUInt16(dslotdata, 0x8) == 0) continue; string Identifier = String.Format("B{0}:{1}",BoxNum.ToString("00"),SlotNum.ToString("00")); - PKX pkm = new PKX(dslotdata, Identifier); - if ((pkm.EC == "00000000") && (pkm.Species == "---")) continue; - PL.Add(pkm); + PK6 pkm = new PK6(dslotdata, Identifier); + if ((pkm.EncryptionConstant == 0) && (pkm.Species == 0)) continue; + PL.Add(new Preview(pkm)); } } dgData.DataSource = PL; @@ -80,7 +177,7 @@ private void Export_CSV(string path) File.WriteAllText(path, sb.ToString(), Encoding.UTF8); } - public class PokemonList : SortableBindingList { } + public class PokemonList : SortableBindingList { } } public static class ExtensionMethods // Speed up scrolling {