diff --git a/PKHeX/Legality/Checks.cs b/PKHeX/Legality/Checks.cs
index 5d9878e22..2903566c0 100644
--- a/PKHeX/Legality/Checks.cs
+++ b/PKHeX/Legality/Checks.cs
@@ -594,9 +594,9 @@ namespace PKHeX
if (!pk6.WasEvent && !(pk6.WasLink && (EncounterMatch as EncounterLink)?.OT == false) && (pk6.HT_Name.Length == 0 || pk6.Geo1_Country == 0)) // Is not Traded
{
if (pk6.HT_Name.Length != 0)
- return new LegalityCheck(Severity.Invalid, "GeoLocation -- HT Name present but has no previous Country.");
+ return new LegalityCheck(Severity.Invalid, "GeoLocation Memory -- HT Name present but has no previous Country.");
if (pk6.Geo1_Country != 0)
- return new LegalityCheck(Severity.Invalid, "GeoLocation -- Previous country of residence but no Handling Trainer.");
+ return new LegalityCheck(Severity.Invalid, "GeoLocation Memory -- Previous country of residence but no Handling Trainer.");
if (pk6.HT_Memory != 0)
return new LegalityCheck(Severity.Invalid, "Memory -- Handling Trainer memory present but no Handling Trainer.");
if (pk6.CurrentHandler != 0) // Badly edited; PKHeX doesn't trip this.
diff --git a/PKHeX/MainWindow/Main.Designer.cs b/PKHeX/MainWindow/Main.Designer.cs
index 4c8015464..51e1d7dc1 100644
--- a/PKHeX/MainWindow/Main.Designer.cs
+++ b/PKHeX/MainWindow/Main.Designer.cs
@@ -341,14 +341,10 @@
this.B_VerifyCHK = new System.Windows.Forms.Button();
this.GB_SAVtools = new System.Windows.Forms.GroupBox();
this.FLP_SAVtools = new System.Windows.Forms.FlowLayoutPanel();
- this.B_OpenPokepuffs = new System.Windows.Forms.Button();
- this.B_OpenItemPouch = new System.Windows.Forms.Button();
this.B_OpenTrainerInfo = new System.Windows.Forms.Button();
- this.B_OUTPasserby = new System.Windows.Forms.Button();
+ this.B_OpenItemPouch = new System.Windows.Forms.Button();
this.B_OpenBoxLayout = new System.Windows.Forms.Button();
this.B_OpenWondercards = new System.Windows.Forms.Button();
- this.B_OpenSuperTraining = new System.Windows.Forms.Button();
- this.B_OpenHallofFame = new System.Windows.Forms.Button();
this.B_OpenOPowers = new System.Windows.Forms.Button();
this.B_OpenEventFlags = new System.Windows.Forms.Button();
this.B_OpenPokedex = new System.Windows.Forms.Button();
@@ -356,6 +352,10 @@
this.B_OpenSecretBase = new System.Windows.Forms.Button();
this.B_Pokeblocks = new System.Windows.Forms.Button();
this.B_LinkInfo = new System.Windows.Forms.Button();
+ this.B_OpenPokepuffs = new System.Windows.Forms.Button();
+ this.B_OpenSuperTraining = new System.Windows.Forms.Button();
+ this.B_OpenHallofFame = new System.Windows.Forms.Button();
+ this.B_OUTPasserby = new System.Windows.Forms.Button();
this.B_CGearSkin = new System.Windows.Forms.Button();
this.dragout = new System.Windows.Forms.PictureBox();
this.mnuL = new System.Windows.Forms.ContextMenuStrip(this.components);
@@ -4363,36 +4363,36 @@
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.FLP_SAVtools.AutoScroll = true;
- this.FLP_SAVtools.Controls.Add(this.B_OpenPokepuffs);
- this.FLP_SAVtools.Controls.Add(this.B_OpenItemPouch);
this.FLP_SAVtools.Controls.Add(this.B_OpenTrainerInfo);
- this.FLP_SAVtools.Controls.Add(this.B_OUTPasserby);
+ this.FLP_SAVtools.Controls.Add(this.B_OpenItemPouch);
this.FLP_SAVtools.Controls.Add(this.B_OpenBoxLayout);
this.FLP_SAVtools.Controls.Add(this.B_OpenWondercards);
- this.FLP_SAVtools.Controls.Add(this.B_OpenSuperTraining);
- this.FLP_SAVtools.Controls.Add(this.B_OpenHallofFame);
this.FLP_SAVtools.Controls.Add(this.B_OpenOPowers);
this.FLP_SAVtools.Controls.Add(this.B_OpenEventFlags);
this.FLP_SAVtools.Controls.Add(this.B_OpenPokedex);
- this.FLP_SAVtools.Controls.Add(this.B_OpenBerryField);
- this.FLP_SAVtools.Controls.Add(this.B_OpenSecretBase);
- this.FLP_SAVtools.Controls.Add(this.B_Pokeblocks);
this.FLP_SAVtools.Controls.Add(this.B_LinkInfo);
+ this.FLP_SAVtools.Controls.Add(this.B_OpenBerryField);
+ this.FLP_SAVtools.Controls.Add(this.B_Pokeblocks);
+ this.FLP_SAVtools.Controls.Add(this.B_OpenSecretBase);
+ this.FLP_SAVtools.Controls.Add(this.B_OpenPokepuffs);
+ this.FLP_SAVtools.Controls.Add(this.B_OpenSuperTraining);
+ this.FLP_SAVtools.Controls.Add(this.B_OpenHallofFame);
+ this.FLP_SAVtools.Controls.Add(this.B_OUTPasserby);
this.FLP_SAVtools.Controls.Add(this.B_CGearSkin);
this.FLP_SAVtools.Location = new System.Drawing.Point(6, 10);
this.FLP_SAVtools.Name = "FLP_SAVtools";
this.FLP_SAVtools.Size = new System.Drawing.Size(297, 87);
this.FLP_SAVtools.TabIndex = 101;
//
- // B_OpenPokepuffs
+ // B_OpenTrainerInfo
//
- this.B_OpenPokepuffs.Location = new System.Drawing.Point(3, 3);
- this.B_OpenPokepuffs.Name = "B_OpenPokepuffs";
- this.B_OpenPokepuffs.Size = new System.Drawing.Size(87, 23);
- this.B_OpenPokepuffs.TabIndex = 1;
- this.B_OpenPokepuffs.Text = "Poké Puffs";
- this.B_OpenPokepuffs.UseVisualStyleBackColor = true;
- this.B_OpenPokepuffs.Click += new System.EventHandler(this.B_OpenPokepuffs_Click);
+ this.B_OpenTrainerInfo.Location = new System.Drawing.Point(3, 3);
+ this.B_OpenTrainerInfo.Name = "B_OpenTrainerInfo";
+ this.B_OpenTrainerInfo.Size = new System.Drawing.Size(87, 23);
+ this.B_OpenTrainerInfo.TabIndex = 3;
+ this.B_OpenTrainerInfo.Text = "Trainer Info";
+ this.B_OpenTrainerInfo.UseVisualStyleBackColor = true;
+ this.B_OpenTrainerInfo.Click += new System.EventHandler(this.B_OpenTrainerInfo_Click);
//
// B_OpenItemPouch
//
@@ -4404,29 +4404,9 @@
this.B_OpenItemPouch.UseVisualStyleBackColor = true;
this.B_OpenItemPouch.Click += new System.EventHandler(this.B_OpenItemPouch_Click);
//
- // B_OpenTrainerInfo
- //
- this.B_OpenTrainerInfo.Location = new System.Drawing.Point(189, 3);
- this.B_OpenTrainerInfo.Name = "B_OpenTrainerInfo";
- this.B_OpenTrainerInfo.Size = new System.Drawing.Size(87, 23);
- this.B_OpenTrainerInfo.TabIndex = 3;
- this.B_OpenTrainerInfo.Text = "Trainer Info";
- this.B_OpenTrainerInfo.UseVisualStyleBackColor = true;
- this.B_OpenTrainerInfo.Click += new System.EventHandler(this.B_OpenTrainerInfo_Click);
- //
- // B_OUTPasserby
- //
- this.B_OUTPasserby.Location = new System.Drawing.Point(3, 32);
- this.B_OUTPasserby.Name = "B_OUTPasserby";
- this.B_OUTPasserby.Size = new System.Drawing.Size(87, 23);
- this.B_OUTPasserby.TabIndex = 4;
- this.B_OUTPasserby.Text = "Passerby";
- this.B_OUTPasserby.UseVisualStyleBackColor = true;
- this.B_OUTPasserby.Click += new System.EventHandler(this.B_OUTPasserby_Click);
- //
// B_OpenBoxLayout
//
- this.B_OpenBoxLayout.Location = new System.Drawing.Point(96, 32);
+ this.B_OpenBoxLayout.Location = new System.Drawing.Point(189, 3);
this.B_OpenBoxLayout.Name = "B_OpenBoxLayout";
this.B_OpenBoxLayout.Size = new System.Drawing.Size(87, 23);
this.B_OpenBoxLayout.TabIndex = 5;
@@ -4436,7 +4416,7 @@
//
// B_OpenWondercards
//
- this.B_OpenWondercards.Location = new System.Drawing.Point(189, 32);
+ this.B_OpenWondercards.Location = new System.Drawing.Point(3, 32);
this.B_OpenWondercards.Name = "B_OpenWondercards";
this.B_OpenWondercards.Size = new System.Drawing.Size(87, 23);
this.B_OpenWondercards.TabIndex = 6;
@@ -4444,30 +4424,9 @@
this.B_OpenWondercards.UseVisualStyleBackColor = true;
this.B_OpenWondercards.Click += new System.EventHandler(this.B_OpenWondercards_Click);
//
- // B_OpenSuperTraining
- //
- this.B_OpenSuperTraining.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.B_OpenSuperTraining.Location = new System.Drawing.Point(3, 61);
- this.B_OpenSuperTraining.Name = "B_OpenSuperTraining";
- this.B_OpenSuperTraining.Size = new System.Drawing.Size(87, 23);
- this.B_OpenSuperTraining.TabIndex = 7;
- this.B_OpenSuperTraining.Text = "Super Train";
- this.B_OpenSuperTraining.UseVisualStyleBackColor = true;
- this.B_OpenSuperTraining.Click += new System.EventHandler(this.B_OpenSuperTraining_Click);
- //
- // B_OpenHallofFame
- //
- this.B_OpenHallofFame.Location = new System.Drawing.Point(96, 61);
- this.B_OpenHallofFame.Name = "B_OpenHallofFame";
- this.B_OpenHallofFame.Size = new System.Drawing.Size(87, 23);
- this.B_OpenHallofFame.TabIndex = 8;
- this.B_OpenHallofFame.Text = "Hall of Fame";
- this.B_OpenHallofFame.UseVisualStyleBackColor = true;
- this.B_OpenHallofFame.Click += new System.EventHandler(this.B_OUTHallofFame_Click);
- //
// B_OpenOPowers
//
- this.B_OpenOPowers.Location = new System.Drawing.Point(189, 61);
+ this.B_OpenOPowers.Location = new System.Drawing.Point(96, 32);
this.B_OpenOPowers.Name = "B_OpenOPowers";
this.B_OpenOPowers.Size = new System.Drawing.Size(87, 23);
this.B_OpenOPowers.TabIndex = 9;
@@ -4477,7 +4436,7 @@
//
// B_OpenEventFlags
//
- this.B_OpenEventFlags.Location = new System.Drawing.Point(3, 90);
+ this.B_OpenEventFlags.Location = new System.Drawing.Point(189, 32);
this.B_OpenEventFlags.Name = "B_OpenEventFlags";
this.B_OpenEventFlags.Size = new System.Drawing.Size(87, 23);
this.B_OpenEventFlags.TabIndex = 10;
@@ -4487,7 +4446,7 @@
//
// B_OpenPokedex
//
- this.B_OpenPokedex.Location = new System.Drawing.Point(96, 90);
+ this.B_OpenPokedex.Location = new System.Drawing.Point(3, 61);
this.B_OpenPokedex.Name = "B_OpenPokedex";
this.B_OpenPokedex.Size = new System.Drawing.Size(87, 23);
this.B_OpenPokedex.TabIndex = 11;
@@ -4497,7 +4456,7 @@
//
// B_OpenBerryField
//
- this.B_OpenBerryField.Location = new System.Drawing.Point(189, 90);
+ this.B_OpenBerryField.Location = new System.Drawing.Point(189, 61);
this.B_OpenBerryField.Name = "B_OpenBerryField";
this.B_OpenBerryField.Size = new System.Drawing.Size(87, 23);
this.B_OpenBerryField.TabIndex = 12;
@@ -4507,7 +4466,7 @@
//
// B_OpenSecretBase
//
- this.B_OpenSecretBase.Location = new System.Drawing.Point(3, 119);
+ this.B_OpenSecretBase.Location = new System.Drawing.Point(96, 90);
this.B_OpenSecretBase.Name = "B_OpenSecretBase";
this.B_OpenSecretBase.Size = new System.Drawing.Size(87, 23);
this.B_OpenSecretBase.TabIndex = 21;
@@ -4518,7 +4477,7 @@
//
// B_Pokeblocks
//
- this.B_Pokeblocks.Location = new System.Drawing.Point(96, 119);
+ this.B_Pokeblocks.Location = new System.Drawing.Point(3, 90);
this.B_Pokeblocks.Name = "B_Pokeblocks";
this.B_Pokeblocks.Size = new System.Drawing.Size(87, 23);
this.B_Pokeblocks.TabIndex = 22;
@@ -4529,7 +4488,7 @@
//
// B_LinkInfo
//
- this.B_LinkInfo.Location = new System.Drawing.Point(189, 119);
+ this.B_LinkInfo.Location = new System.Drawing.Point(96, 61);
this.B_LinkInfo.Name = "B_LinkInfo";
this.B_LinkInfo.Size = new System.Drawing.Size(87, 23);
this.B_LinkInfo.TabIndex = 23;
@@ -4537,6 +4496,47 @@
this.B_LinkInfo.UseVisualStyleBackColor = true;
this.B_LinkInfo.Click += new System.EventHandler(this.B_LinkInfo_Click);
//
+ // B_OpenPokepuffs
+ //
+ this.B_OpenPokepuffs.Location = new System.Drawing.Point(189, 90);
+ this.B_OpenPokepuffs.Name = "B_OpenPokepuffs";
+ this.B_OpenPokepuffs.Size = new System.Drawing.Size(87, 23);
+ this.B_OpenPokepuffs.TabIndex = 1;
+ this.B_OpenPokepuffs.Text = "Poké Puffs";
+ this.B_OpenPokepuffs.UseVisualStyleBackColor = true;
+ this.B_OpenPokepuffs.Click += new System.EventHandler(this.B_OpenPokepuffs_Click);
+ //
+ // B_OpenSuperTraining
+ //
+ this.B_OpenSuperTraining.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.B_OpenSuperTraining.Location = new System.Drawing.Point(3, 119);
+ this.B_OpenSuperTraining.Name = "B_OpenSuperTraining";
+ this.B_OpenSuperTraining.Size = new System.Drawing.Size(87, 23);
+ this.B_OpenSuperTraining.TabIndex = 7;
+ this.B_OpenSuperTraining.Text = "Super Train";
+ this.B_OpenSuperTraining.UseVisualStyleBackColor = true;
+ this.B_OpenSuperTraining.Click += new System.EventHandler(this.B_OpenSuperTraining_Click);
+ //
+ // B_OpenHallofFame
+ //
+ this.B_OpenHallofFame.Location = new System.Drawing.Point(96, 119);
+ this.B_OpenHallofFame.Name = "B_OpenHallofFame";
+ this.B_OpenHallofFame.Size = new System.Drawing.Size(87, 23);
+ this.B_OpenHallofFame.TabIndex = 8;
+ this.B_OpenHallofFame.Text = "Hall of Fame";
+ this.B_OpenHallofFame.UseVisualStyleBackColor = true;
+ this.B_OpenHallofFame.Click += new System.EventHandler(this.B_OUTHallofFame_Click);
+ //
+ // B_OUTPasserby
+ //
+ this.B_OUTPasserby.Location = new System.Drawing.Point(189, 119);
+ this.B_OUTPasserby.Name = "B_OUTPasserby";
+ this.B_OUTPasserby.Size = new System.Drawing.Size(87, 23);
+ this.B_OUTPasserby.TabIndex = 4;
+ this.B_OUTPasserby.Text = "Passerby";
+ this.B_OUTPasserby.UseVisualStyleBackColor = true;
+ this.B_OUTPasserby.Click += new System.EventHandler(this.B_OUTPasserby_Click);
+ //
// B_CGearSkin
//
this.B_CGearSkin.Location = new System.Drawing.Point(3, 148);
diff --git a/PKHeX/MainWindow/Main.cs b/PKHeX/MainWindow/Main.cs
index c3f70142a..6e413c97c 100644
--- a/PKHeX/MainWindow/Main.cs
+++ b/PKHeX/MainWindow/Main.cs
@@ -787,7 +787,7 @@ namespace PKHeX
PAN_Box.Visible = CB_BoxSelect.Visible = B_BoxLeft.Visible = B_BoxRight.Visible = SAV.HasBox;
Menu_LoadBoxes.Enabled = Menu_DumpBoxes.Enabled = Menu_Report.Enabled = Menu_Modify.Enabled = B_SaveBoxBin.Enabled = SAV.HasBox;
- if (GB_SAVtools.Visible)
+ if (path != null) // Actual save file
{
PAN_BattleBox.Visible = L_BattleBox.Visible = L_ReadOnlyPBB.Visible = SAV.HasBattleBox;
GB_Daycare.Visible = SAV.HasDaycare;
@@ -802,7 +802,7 @@ namespace PKHeX
B_OpenHallofFame.Visible = SAV.HasHoF;
B_OpenOPowers.Visible = SAV.HasOPower;
B_OpenPokedex.Visible = SAV.HasPokeDex;
- B_OpenBerryField.Visible = SAV.HasBerryField;
+ B_OpenBerryField.Visible = SAV.HasBerryField && SAV.XY;
B_Pokeblocks.Visible = SAV.HasPokeBlock;
B_JPEG.Visible = SAV.HasJPEG;
B_OpenEventFlags.Visible = SAV.HasEvents;
@@ -821,7 +821,6 @@ namespace PKHeX
PB_Legal.Visible = PB_WarnMove1.Visible = PB_WarnMove2.Visible = PB_WarnMove3.Visible = PB_WarnMove4.Visible = SAV.Generation >= 6;
PB_MarkPentagon.Visible = SAV.Generation == 6;
- PB_Legal.Visible = PB_WarnMove1.Visible = PB_WarnMove2.Visible = PB_WarnMove3.Visible = PB_WarnMove4.Visible = SAV.Generation == 6;
TB_GameSync.Visible = TB_Secure1.Visible = TB_Secure2.Visible = L_GameSync.Visible = L_Secure1.Visible = L_Secure2.Visible = SAV.Exportable && SAV.Generation == 6;
CB_Form.Visible = Label_Form.Visible = CHK_AsEgg.Visible = GB_EggConditions.Visible =
@@ -876,7 +875,6 @@ namespace PKHeX
// Common HaX Interface
CHK_HackedStats.Enabled = CHK_HackedStats.Visible = MT_Level.Enabled = MT_Level.Visible = MT_Form.Enabled = MT_Form.Visible = HaX;
- PB_Legal.Visible = PB_WarnMove1.Visible = PB_WarnMove2.Visible = PB_WarnMove3.Visible = PB_WarnMove4.Visible &= !HaX;
TB_Level.Visible = !HaX;
// Load Extra Byte List
@@ -2272,13 +2270,13 @@ namespace PKHeX
return;
Legality = la ?? new LegalityAnalysis((PK6) pkm);
PB_Legal.Image = Legality.Valid ? Properties.Resources.valid : Properties.Resources.warn;
- PB_Legal.Visible = pkm.Gen6 /*&& pkm is PK6*/;
+ PB_Legal.Visible = pkm.Gen6 /*&& pkm is PK6*/ && !HaX;
// Refresh Move Legality
for (int i = 0; i < 4; i++)
- movePB[i].Visible = !Legality.vMoves[i].Valid;
+ movePB[i].Visible = !Legality.vMoves[i].Valid && !HaX;
for (int i = 0; i < 4; i++)
- relearnPB[i].Visible = !Legality.vRelearn[i].Valid;
+ relearnPB[i].Visible = !Legality.vRelearn[i].Valid && !HaX;
}
private void updateStats()
{
diff --git a/PKHeX/MainWindow/Main.resx b/PKHeX/MainWindow/Main.resx
index 4916aa9d4..1d654adaa 100644
--- a/PKHeX/MainWindow/Main.resx
+++ b/PKHeX/MainWindow/Main.resx
@@ -1261,16 +1261,10 @@
True
-
- True
-
-
- True
-
True
-
+
True
@@ -1279,12 +1273,6 @@
True
-
- True
-
-
- True
-
True
@@ -1294,16 +1282,28 @@
True
-
+
True
-
+
True
True
-
+
+ True
+
+
+ True
+
+
+ True
+
+
+ True
+
+
True
diff --git a/PKHeX/MainWindow/MainPK5.cs b/PKHeX/MainWindow/MainPK5.cs
index 469fed01d..c48dde3d3 100644
--- a/PKHeX/MainWindow/MainPK5.cs
+++ b/PKHeX/MainWindow/MainPK5.cs
@@ -160,8 +160,6 @@ namespace PKHeX
pk5.SID = Util.ToInt32(TB_SID.Text);
pk5.EXP = Util.ToUInt32(TB_EXP.Text);
pk5.PID = Util.getHEXval(TB_PID.Text);
- pk5.Ability = (byte)Util.getIndex(DEV_Ability);
- pk5.Ability = (byte)Array.IndexOf(abilitylist, CB_Ability.Text.Remove(CB_Ability.Text.Length - 4));
pk5.Nature = (byte)Util.getIndex(CB_Nature);
pk5.FatefulEncounter = CHK_Fateful.Checked;
@@ -250,6 +248,11 @@ namespace PKHeX
pk5.Ability = (byte)Util.getIndex(DEV_Ability);
pk5.Stat_Level = (byte)Math.Min(Convert.ToInt32(MT_Level.Text), byte.MaxValue);
}
+ else
+ {
+ pk5.Ability = (byte)Array.IndexOf(abilitylist, CB_Ability.Text.Remove(CB_Ability.Text.Length - 4));
+ pk5.HiddenAbility = CB_Ability.SelectedIndex > 1; // not 0 or 1
+ }
// Fix Moves if a slot is empty
pk5.FixMoves();
diff --git a/PKHeX/MysteryGifts/MysteryGift.cs b/PKHeX/MysteryGifts/MysteryGift.cs
index e7a82211d..a8e1d07af 100644
--- a/PKHeX/MysteryGifts/MysteryGift.cs
+++ b/PKHeX/MysteryGifts/MysteryGift.cs
@@ -45,6 +45,13 @@ namespace PKHeX
public virtual byte[] Data { get; set; }
public abstract PKM convertToPKM(SaveFile SAV);
+ public MysteryGift Clone()
+ {
+ byte[] data = (byte[])Data.Clone();
+ return getMysteryGift(data);
+ }
+ public string Type => GetType().Name;
+
// Properties
public abstract bool GiftUsed { get; set; }
public abstract string CardTitle { get; set; }
@@ -57,6 +64,6 @@ namespace PKHeX
public virtual int Quantity { get { return 1; } set { } }
public bool Empty => Data.SequenceEqual(new byte[Data.Length]);
- public string getCardHeader() => (CardID > 0 ? $"Card #: {CardID.ToString("0000")}" : "N/A") + $" - {CardTitle.Trim()}" + Environment.NewLine;
+ public string getCardHeader() => (CardID > 0 ? $"Card #: {CardID.ToString("0000")}" : "N/A") + $" - {CardTitle.Replace('\u3000',' ').Trim()}" + Environment.NewLine;
}
}
diff --git a/PKHeX/PKM/PK4.cs b/PKHeX/PKM/PK4.cs
index fb344daa9..60101f790 100644
--- a/PKHeX/PKM/PK4.cs
+++ b/PKHeX/PKM/PK4.cs
@@ -269,7 +269,7 @@ namespace PKHeX
else if (PtHGSS)
{
BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x44);
- BitConverter.GetBytes(0xBBA).CopyTo(Data, 0x7E); // Faraway Place (for DP display)
+ BitConverter.GetBytes((ushort)0xBBA).CopyTo(Data, 0x7E); // Faraway Place (for DP display)
}
else if ((value < 2000 && value > 111) || (value < 3000 && value > 2010))
{
@@ -303,7 +303,7 @@ namespace PKHeX
else if (PtHGSS)
{
BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x46);
- BitConverter.GetBytes(0xBBA).CopyTo(Data, 0x80); // Faraway Place (for DP display)
+ BitConverter.GetBytes((ushort)0xBBA).CopyTo(Data, 0x80); // Faraway Place (for DP display)
}
else if ((value < 2000 && value > 111) || (value < 3000 && value > 2010))
{
diff --git a/PKHeX/PKM/PK5.cs b/PKHeX/PKM/PK5.cs
index 19529937a..33b198389 100644
--- a/PKHeX/PKM/PK5.cs
+++ b/PKHeX/PKM/PK5.cs
@@ -158,8 +158,8 @@ namespace PKHeX
public override int Gender { get { return (Data[0x40] >> 1) & 0x3; } set { Data[0x40] = (byte)(Data[0x40] & ~0x06 | (value << 1)); } }
public override int AltForm { get { return Data[0x40] >> 3; } set { Data[0x40] = (byte)(Data[0x40] & 0x07 | (value << 3)); } }
public override int Nature { get { return Data[0x41]; } set { Data[0x41] = (byte)value; } }
- public bool HiddenAbility { get { return (Data[0x41] & 1) == 1; } set { Data[0x41] = (byte)(Data[0x41] & ~0x01 | (value ? 1 : 0)); } }
- public bool NPokémon { get { return (Data[0x41] & 2) == 2; } set { Data[0x41] = (byte)(Data[0x41] & ~0x02 | (value ? 2 : 0)); } }
+ public bool HiddenAbility { get { return (Data[0x42] & 1) == 1; } set { Data[0x42] = (byte)(Data[0x42] & ~0x01 | (value ? 1 : 0)); } }
+ public bool NPokémon { get { return (Data[0x42] & 2) == 2; } set { Data[0x42] = (byte)(Data[0x42] & ~0x02 | (value ? 2 : 0)); } }
// 0x43-0x47 Unused
#endregion
diff --git a/PKHeX/PKM/PKM.cs b/PKHeX/PKM/PKM.cs
index 3008f6e80..0c39bcbd2 100644
--- a/PKHeX/PKM/PKM.cs
+++ b/PKHeX/PKM/PKM.cs
@@ -426,17 +426,20 @@ namespace PKHeX
public void setShinyPID()
{
do PID = PKX.getRandomPID(Species, Gender, Version, Nature, AltForm, PID); while (!IsShiny);
- EncryptionConstant = PID;
+ if (GenNumber < 6)
+ EncryptionConstant = PID;
}
public void setPIDGender(int gender)
{
do PID = PKX.getRandomPID(Species, gender, Version, Nature, AltForm, PID); while (IsShiny);
- EncryptionConstant = PID;
+ if (GenNumber < 6)
+ EncryptionConstant = PID;
}
public void setPIDNature(int nature)
{
do PID = PKX.getRandomPID(Species, Gender, Version, nature, AltForm, PID); while (IsShiny);
- EncryptionConstant = PID;
+ if (GenNumber < 6)
+ EncryptionConstant = PID;
}
}
}
diff --git a/PKHeX/Saves/SAV6.cs b/PKHeX/Saves/SAV6.cs
index bc9ec6b64..e18a4319d 100644
--- a/PKHeX/Saves/SAV6.cs
+++ b/PKHeX/Saves/SAV6.cs
@@ -98,7 +98,8 @@ namespace PKHeX
// Apply checksums
for (int i = 0; i < Blocks.Length; i++)
{
- byte[] array = Data.Skip(Blocks[i].Offset).Take(Blocks[i].Length).ToArray();
+ byte[] array = new byte[Blocks[i].Length];
+ Array.Copy(Data, Blocks[i].Offset, array, 0, array.Length);
BitConverter.GetBytes(SaveUtil.ccitt16(array)).CopyTo(Data, BlockInfoOffset + 6 + i * 8);
}
}
@@ -108,7 +109,8 @@ namespace PKHeX
{
for (int i = 0; i < Blocks.Length; i++)
{
- byte[] array = Data.Skip(Blocks[i].Offset).Take(Blocks[i].Length).ToArray();
+ byte[] array = new byte[Blocks[i].Length];
+ Array.Copy(Data, Blocks[i].Offset, array, 0, array.Length);
if (SaveUtil.ccitt16(array) != BitConverter.ToUInt16(Data, BlockInfoOffset + 6 + i * 8))
return false;
}
@@ -123,7 +125,8 @@ namespace PKHeX
string rv = "";
for (int i = 0; i < Blocks.Length; i++)
{
- byte[] array = Data.Skip(Blocks[i].Offset).Take(Blocks[i].Length).ToArray();
+ byte[] array = new byte[Blocks[i].Length];
+ Array.Copy(Data, Blocks[i].Offset, array, 0, array.Length);
if (SaveUtil.ccitt16(array) == BitConverter.ToUInt16(Data, BlockInfoOffset + 6 + i * 8))
continue;
diff --git a/PKHeX/Saves/SaveFile.cs b/PKHeX/Saves/SaveFile.cs
index 6775c7716..8db12ea12 100644
--- a/PKHeX/Saves/SaveFile.cs
+++ b/PKHeX/Saves/SaveFile.cs
@@ -48,8 +48,8 @@ namespace PKHeX
public PersonalTable Personal { get; set; }
public bool ORASDEMO => Data.Length == SaveUtil.SIZE_G6ORASDEMO;
- public bool ORAS => Version == GameVersion.OR || Version == GameVersion.AS;
- public bool XY => Version == GameVersion.X || Version == GameVersion.Y;
+ public bool ORAS => Data.Length == SaveUtil.SIZE_G6ORAS;
+ public bool XY => Data.Length == SaveUtil.SIZE_G6XY;
public bool B2W2 => Version == GameVersion.B2W2;
public bool BW => Version == GameVersion.BW;
public bool HGSS => Version == GameVersion.HGSS;
@@ -450,7 +450,10 @@ namespace PKHeX
// split up data to individual pkm
byte[][] pkdata = new byte[data.Length/SIZE_STORED][];
for (int i = 0; i < data.Length; i += SIZE_STORED)
- pkdata[i/SIZE_STORED] = data.Skip(i).Take(SIZE_STORED).ToArray();
+ {
+ pkdata[i/SIZE_STORED] = new byte[SIZE_STORED];
+ Array.Copy(data, i, pkdata[i/SIZE_STORED], 0, SIZE_STORED);
+ }
PKM[] pkms = BoxData;
for (int i = 0; i < pkms.Length; i++)
@@ -465,7 +468,10 @@ namespace PKHeX
byte[][] pkdata = new byte[data.Length / SIZE_STORED][];
for (int i = 0; i < data.Length; i += SIZE_STORED)
- pkdata[i/SIZE_STORED] = data.Skip(i).Take(SIZE_STORED).ToArray();
+ {
+ pkdata[i/SIZE_STORED] = new byte[SIZE_STORED];
+ Array.Copy(data, i, pkdata[i/SIZE_STORED], 0, SIZE_STORED);
+ }
PKM[] pkms = BoxData;
for (int i = 0; i < 30; i++)
@@ -479,7 +485,12 @@ namespace PKHeX
public byte[] getData(int Offset, int Length)
{
- return Data.Skip(Offset).Take(Length).ToArray();
+ if (Offset + Length > Data.Length)
+ return null;
+
+ byte[] data = new byte[Length];
+ Array.Copy(Data, Offset, data, 0, Length);
+ return data;
}
public void setData(byte[] input, int Offset)
{
diff --git a/PKHeX/Subforms/PKM Editors/BatchEditor.cs b/PKHeX/Subforms/PKM Editors/BatchEditor.cs
index 67613c4d5..6e67c5f68 100644
--- a/PKHeX/Subforms/PKM Editors/BatchEditor.cs
+++ b/PKHeX/Subforms/PKM Editors/BatchEditor.cs
@@ -262,11 +262,15 @@ namespace PKHeX
{
try
{
- if (cmd.PropertyValue == CONST_RAND && (cmd.PropertyName == "PID" || cmd.PropertyName == "EncryptionConstant"))
+ if (cmd.PropertyName == "EncryptionConstant" && cmd.PropertyValue == CONST_RAND)
ReflectUtil.SetValue(PKM, cmd.PropertyName, Util.rnd32().ToString());
- else if (cmd.PropertyValue == CONST_SHINY && cmd.PropertyName == "PID")
+ else if(cmd.PropertyName == "PID" && cmd.PropertyValue == CONST_RAND)
+ PKM.setPIDGender(PKM.Gender);
+ else if (cmd.PropertyName == "EncryptionConstant" && cmd.PropertyValue == "PID")
+ PKM.EncryptionConstant = PKM.PID;
+ else if (cmd.PropertyName == "PID" && cmd.PropertyValue == CONST_SHINY)
PKM.setShinyPID();
- else if (cmd.PropertyValue == "0" && cmd.PropertyName == "Species")
+ else if (cmd.PropertyName == "Species" && cmd.PropertyValue == "0")
PKM.Data = new byte[PKM.Data.Length];
else
ReflectUtil.SetValue(PKM, cmd.PropertyName, cmd.PropertyValue);
diff --git a/PKHeX/Subforms/Save Editors/SAV_Wondercard.cs b/PKHeX/Subforms/Save Editors/SAV_Wondercard.cs
index 6dd953b6f..2c72ad174 100644
--- a/PKHeX/Subforms/Save Editors/SAV_Wondercard.cs
+++ b/PKHeX/Subforms/Save Editors/SAV_Wondercard.cs
@@ -123,7 +123,7 @@ namespace PKHeX
LB_Received.SelectedIndex = LB_Received.Items.IndexOf(card);
}
- // Wonder Card IO (.wc6<->window)
+ // Mystery Gift IO (.file<->window)
private string getFilter()
{
switch (SAV.Generation)
@@ -169,7 +169,19 @@ namespace PKHeX
File.WriteAllBytes(path, mg.Data);
}
- // Wonder Card RW (window<->sav)
+ private int getLastUnfilledByType(MysteryGift Gift, MysteryGiftAlbum Album)
+ {
+ for (int i = 0; i < Album.Gifts.Length; i++)
+ {
+ if (!Album.Gifts[i].Empty)
+ continue;
+ if (Album.Gifts[i].Type != Gift.Type)
+ continue;
+ return i;
+ }
+ return -1;
+ }
+ // Mystery Gift RW (window<->sav)
private void clickView(object sender, EventArgs e)
{
sender = ((sender as ToolStripItem)?.Owner as ContextMenuStrip)?.SourceControl ?? sender as PictureBox;
@@ -187,16 +199,16 @@ namespace PKHeX
int index = Array.IndexOf(pba, sender);
// Hijack to the latest unfilled slot if index creates interstitial empty slots.
- int lastUnfilled = Array.FindIndex(pba, p => p.Image == null);
+ int lastUnfilled = getLastUnfilledByType(mg, mga);
if (lastUnfilled > -1 && lastUnfilled < index)
index = lastUnfilled;
- if (mg.Data.Length != mga.Gifts[index].Data.Length)
+ if (mg.Type != mga.Gifts[index].Type)
{
- Util.Alert("Can't set slot here.", $"{mg.GetType()} != {mga.Gifts[index].GetType()}");
+ Util.Alert("Can't set slot here.", $"{mg.Type} != {mga.Gifts[index].Type}");
return;
}
setBackground(index, Properties.Resources.slotSet);
- mga.Gifts[index] = mg;
+ mga.Gifts[index] = mg.Clone();
setGiftBoxes();
setCardID(mg.CardID);
}
@@ -205,8 +217,26 @@ namespace PKHeX
sender = ((sender as ToolStripItem)?.Owner as ContextMenuStrip)?.SourceControl ?? sender as PictureBox;
int index = Array.IndexOf(pba, sender);
- setBackground(index, Properties.Resources.slotDel);
mga.Gifts[index].Data = new byte[mga.Gifts[index].Data.Length];
+
+ // Shuffle blank card down
+ int i = index;
+ while (i < mga.Gifts.Length - 1)
+ {
+ if (mga.Gifts[i+1].Empty)
+ break;
+ if (mga.Gifts[i+1].Type != mga.Gifts[i].Type)
+ break;
+
+ i++;
+
+ var mg1 = mga.Gifts[i];
+ var mg2 = mga.Gifts[i-1];
+
+ mga.Gifts[i-1] = mg1;
+ mga.Gifts[i] = mg2;
+ }
+ setBackground(i, Properties.Resources.slotDel);
setGiftBoxes();
}
@@ -230,7 +260,7 @@ namespace PKHeX
Close();
}
- // Delete WC Flag
+ // Delete Received Flag
private void clearRecievedFlag(object sender, EventArgs e)
{
if (LB_Received.SelectedIndex < 0) return;
@@ -301,14 +331,14 @@ namespace PKHeX
byte[] data = QR.getQRData();
if (data == null) return;
- string[] types = mga.Gifts.Select(g => g.GetType().Name).Distinct().ToArray();
+ string[] types = mga.Gifts.Select(g => g.Type).Distinct().ToArray();
MysteryGift gift = MysteryGift.getMysteryGift(data);
- string giftType = gift.GetType().Name;
+ string giftType = gift.Type;
if (mga.Gifts.All(card => card.Data.Length != data.Length))
Util.Alert("Decoded data not valid for loaded save file.", $"QR Data Size: 0x{data.Length.ToString("X")}");
else if (types.All(type => type != giftType))
- Util.Alert("Gift type is not compatible with the save file.", $"QR Gift Type: {gift.GetType().Name}" + Environment.NewLine + $"Expected Types: {string.Join(", ", types)}");
+ Util.Alert("Gift type is not compatible with the save file.", $"QR Gift Type: {gift.Type}" + Environment.NewLine + $"Expected Types: {string.Join(", ", types)}");
else
try { viewGiftData(gift); }
catch { Util.Alert("Error loading Mystery Gift data."); }
@@ -324,7 +354,7 @@ namespace PKHeX
Image qr = QR.getQRImage(mg.Data, server);
if (qr == null) return;
- string desc = $"({mg.GetType().Name}) {getDescription(mg)}";
+ string desc = $"({mg.Type}) {getDescription(mg)}";
new QR(qr, PB_Preview.Image, desc, "", "", "PKHeX Wonder Card @ ProjectPokemon.org").ShowDialog();
}
@@ -370,8 +400,8 @@ namespace PKHeX
int index = Array.IndexOf(pba, sender);
// Hijack to the latest unfilled slot if index creates interstitial empty slots.
- int lastUnfilled = Array.FindIndex(pba, p => p.Image == null);
- if (lastUnfilled < index)
+ int lastUnfilled = getLastUnfilledByType(mg, mga);
+ if (lastUnfilled > -1 && lastUnfilled < index)
index = lastUnfilled;
if (wc_slot == -1) // dropped
@@ -384,15 +414,11 @@ namespace PKHeX
{ Util.Alert("Data size invalid.", files[0]); return; }
byte[] data = File.ReadAllBytes(files[0]);
- chk:
if (data.Length != mga.Gifts[index].Data.Length)
{
- if (index < 8)
- {
- index = 8;
- goto chk;
- }
- { Util.Alert("Can't set slot here.", $"{data.Length} != {mga.Gifts[index].Data.Length}, {mga.Gifts[index].GetType()}", files[0]); return; }
+ Util.Alert("Can't set slot here.",
+ $"{data.Length} != {mga.Gifts[index].Data.Length}, {mga.Gifts[index].Type}", files[0]);
+ return;
}
mga.Gifts[index].Data = data;
@@ -401,17 +427,34 @@ namespace PKHeX
}
else // Swap Data
{
- // Check to see if they copied beyond blank slots.
- if (index > Math.Max(wc_slot, lastUnfilled - 1))
- index = Math.Max(wc_slot, lastUnfilled - 1);
-
MysteryGift s1 = mga.Gifts[index];
MysteryGift s2 = mga.Gifts[wc_slot];
- if (s1.Data.Length != s2.Data.Length)
- { Util.Alert("Can't swap these two slots."); return; }
+ if (s1.Type != s2.Type)
+ { Util.Alert($"Can't swap {s1.Type} with {s2.Type}."); return; }
mga.Gifts[wc_slot] = s1;
mga.Gifts[index] = s2;
+
+ if (mga.Gifts[wc_slot].Empty) // empty slot created, slide down
+ {
+ int i = wc_slot;
+ while (i < index)
+ {
+ if (mga.Gifts[i + 1].Empty)
+ break;
+ if (mga.Gifts[i + 1].Type != mga.Gifts[i].Type)
+ break;
+
+ i++;
+
+ var mg1 = mga.Gifts[i];
+ var mg2 = mga.Gifts[i - 1];
+
+ mga.Gifts[i - 1] = mg1;
+ mga.Gifts[i] = mg2;
+ }
+ index = i-1;
+ }
}
setBackground(index, Properties.Resources.slotView);
setGiftBoxes();