diff --git a/PKHeX.Core/Saves/SAV6.cs b/PKHeX.Core/Saves/SAV6.cs
index 1f43d6c4b..51468690d 100644
--- a/PKHeX.Core/Saves/SAV6.cs
+++ b/PKHeX.Core/Saves/SAV6.cs
@@ -58,8 +58,6 @@ namespace PKHeX.Core
// Accessible as SAV6
public int MaisonStats { get; protected set; } = int.MinValue;
public int Accessories { get; protected set; } = int.MinValue;
- public int PokeDexLanguageFlags { get; protected set; } = int.MinValue;
- public int Spinda { get; protected set; } = int.MinValue;
protected internal const int LongStringLength = 0x22; // bytes, not characters
protected internal const int ShortStringLength = 0x1A; // bytes, not characters
@@ -207,26 +205,6 @@ namespace PKHeX.Core
protected set => Data[Party + (6 * SIZE_PARTY)] = (byte)value;
}
- private int LockedFlagOffset => BattleBox + (6 * SIZE_STORED);
-
- public override bool BattleBoxLocked
- {
- get => BattleBoxLockedWiFiTournament || BattleBoxLockedLiveTournament;
- set => BattleBoxLockedWiFiTournament = BattleBoxLockedLiveTournament = value;
- }
-
- public bool BattleBoxLockedWiFiTournament
- {
- get => (Data[LockedFlagOffset] & 1) != 0;
- set => Data[LockedFlagOffset] = (byte)((Data[LockedFlagOffset] & ~1) | (value ? 1 : 0));
- }
-
- public bool BattleBoxLockedLiveTournament
- {
- get => (Data[LockedFlagOffset] & 2) != 0;
- set => Data[LockedFlagOffset] = (byte)((Data[LockedFlagOffset] & ~2) | (value ? 2 : 0));
- }
-
public override string GetString(byte[] data, int offset, int length) => StringConverter.GetString6(data, offset, length);
public override byte[] SetString(string value, int maxLength, int PadToSize = 0, ushort PadWith = 0)
diff --git a/PKHeX.Core/Saves/SAV6AO.cs b/PKHeX.Core/Saves/SAV6AO.cs
index b9ebcfc27..470995c39 100644
--- a/PKHeX.Core/Saves/SAV6AO.cs
+++ b/PKHeX.Core/Saves/SAV6AO.cs
@@ -154,6 +154,7 @@ namespace PKHeX.Core
Situation = new Situation6(this, 0x01400);
Played = new PlayTime6(this, 0x01800);
BoxLayout = new BoxLayout6(this, 0x04400);
+ BattleBoxBlock = new BattleBox6(this, 0x04A00);
Status = new MyStatus6(this, 0x14000);
Zukan = new Zukan6AO(this, 0x15000, 0x400);
OPowerBlock = new OPower6(this, 0x17400);
@@ -162,8 +163,6 @@ namespace PKHeX.Core
Sango = new SangoInfoBlock(this, 0x2B600);
EventFlag = EventConst + 0x2FC;
- PokeDexLanguageFlags = PokeDex + 0x400;
- Spinda = PokeDex + 0x680;
WondercardData = WondercardFlags + 0x100;
Daycare2 = Daycare + 0x1F0;
@@ -171,8 +170,8 @@ namespace PKHeX.Core
Personal = PersonalTable.AO;
}
- public int EonTicket { get; private set; } = int.MinValue;
- public int Contest { get; private set; } = int.MinValue;
+ public int EonTicket { get; private set; }
+ public int Contest { get; private set; }
public Zukan6 Zukan { get; private set; }
public Puff6 PuffBlock { get; private set; }
@@ -180,6 +179,7 @@ namespace PKHeX.Core
public BoxLayout6 BoxLayout { get; private set; }
public MysteryBlock6 MysteryBlock { get; private set; }
public SangoInfoBlock Sango { get; set; }
+ public BattleBox6 BattleBoxBlock { get; private set; }
public override GameVersion Version
{
@@ -338,5 +338,11 @@ namespace PKHeX.Core
protected override int GetBoxWallpaperOffset(int box) => BoxLayout.GetBoxWallpaperOffset(box);
public override int BoxesUnlocked { get => BoxLayout.BoxesUnlocked; set => BoxLayout.BoxesUnlocked = value; }
public override byte[] BoxFlags { get => BoxLayout.BoxFlags; set => BoxLayout.BoxFlags = value; }
+
+ public override bool BattleBoxLocked
+ {
+ get => BattleBoxBlock.Locked;
+ set => BattleBoxBlock.Locked = value;
+ }
}
}
diff --git a/PKHeX.Core/Saves/SAV6XY.cs b/PKHeX.Core/Saves/SAV6XY.cs
index 5a092b698..57504e749 100644
--- a/PKHeX.Core/Saves/SAV6XY.cs
+++ b/PKHeX.Core/Saves/SAV6XY.cs
@@ -147,6 +147,7 @@ namespace PKHeX.Core
Situation = new Situation6(this, 0x01400);
Played = new PlayTime6(this, 0x01800);
BoxLayout = new BoxLayout6(this, 0x4400);
+ BattleBoxBlock = new BattleBox6(this, 0x04A00);
Status = new MyStatus6XY(this, 0x14000);
Zukan = new Zukan6XY(this, 0x15000, 0x3C8);
OPowerBlock = new OPower6(this, 0x16A00);
@@ -154,8 +155,6 @@ namespace PKHeX.Core
Records = new Record6(this, 0x1E400, Core.Records.MaxType_XY);
EventFlag = EventConst + 0x2FC;
- PokeDexLanguageFlags = PokeDex + 0x3C8;
- Spinda = PokeDex + 0x648;
WondercardData = WondercardFlags + 0x100;
HeldItems = Legal.HeldItem_XY;
@@ -167,6 +166,7 @@ namespace PKHeX.Core
public OPower6 OPowerBlock { get; private set; }
public BoxLayout6 BoxLayout { get; private set; }
public MysteryBlock6 MysteryBlock { get; private set; }
+ public BattleBox6 BattleBoxBlock { get; private set; }
protected override void SetDex(PKM pkm) => Zukan.SetDex(pkm);
@@ -307,5 +307,11 @@ namespace PKHeX.Core
protected override int GetBoxWallpaperOffset(int box) => BoxLayout.GetBoxWallpaperOffset(box);
public override int BoxesUnlocked { get => BoxLayout.BoxesUnlocked; set => BoxLayout.BoxesUnlocked = value; }
public override byte[] BoxFlags { get => BoxLayout.BoxFlags; set => BoxLayout.BoxFlags = value; }
+
+ public override bool BattleBoxLocked
+ {
+ get => BattleBoxBlock.Locked;
+ set => BattleBoxBlock.Locked = value;
+ }
}
}
\ No newline at end of file
diff --git a/PKHeX.Core/Saves/Substructures/Gen6/MyStatus6.cs b/PKHeX.Core/Saves/Substructures/Gen6/MyStatus6.cs
index 357dd564c..97a275d24 100644
--- a/PKHeX.Core/Saves/Substructures/Gen6/MyStatus6.cs
+++ b/PKHeX.Core/Saves/Substructures/Gen6/MyStatus6.cs
@@ -1,5 +1,4 @@
using System;
-using System.Linq;
namespace PKHeX.Core
{
@@ -31,7 +30,13 @@ namespace PKHeX.Core
set => Data[Offset + 5] = (byte)value;
}
- public int MultiplayerSpriteID
+ public int MultiplayerSpriteID_1
+ {
+ get => Data[Offset + 6];
+ set => Data[Offset + 6] = (byte)value;
+ }
+
+ public int MultiplayerSpriteID_2
{
get => Data[Offset + 7];
set => Data[Offset + 7] = (byte)value;
@@ -41,22 +46,16 @@ namespace PKHeX.Core
public string GameSyncID
{
- get
- {
- var data = Data.Skip(Offset + 8).Take(GameSyncIDSize / 2).Reverse().ToArray();
- return BitConverter.ToString(data).Replace("-", string.Empty);
- }
+ get => Util.GetHexStringFromBytes(Data, Offset + 0x08, GameSyncIDSize / 2);
set
{
if (value == null)
return;
- if (value.Length > GameSyncIDSize)
+ if (value.Length != GameSyncIDSize)
return;
- Enumerable.Range(0, value.Length)
- .Where(x => x % 2 == 0)
- .Reverse()
- .Select(x => Convert.ToByte(value.Substring(x, 2), 16))
- .ToArray().CopyTo(Data, Offset + 8);
+
+ var data = Util.GetBytesFromHexString(value);
+ SAV.SetData(data, Offset + 0x08);
}
}
@@ -72,6 +71,18 @@ namespace PKHeX.Core
set => Data[Offset + 0x27] = (byte)value;
}
+ public decimal Latitude // don't use the setters
+ {
+ get => (BitConverter.ToInt16(Data, Offset + 0x28) * 180m) / 0x8000;
+ set => SAV.SetData(BitConverter.GetBytes((short)(value * 0x8000) / 180), Offset + 0x28);
+ }
+
+ public decimal Longitude // don't use the setters
+ {
+ get => (BitConverter.ToInt16(Data, Offset + 0x2A) * 180m) / 0x8000;
+ set => SAV.SetData(BitConverter.GetBytes((short)(value * 0x8000) / 180), Offset + 0x2A);
+ }
+
public int ConsoleRegion
{
get => Data[Offset + 0x2C];
diff --git a/PKHeX.Core/Saves/Substructures/Gen6/MyStatus6XY.cs b/PKHeX.Core/Saves/Substructures/Gen6/MyStatus6XY.cs
index 0bf40232e..78a3c084b 100644
--- a/PKHeX.Core/Saves/Substructures/Gen6/MyStatus6XY.cs
+++ b/PKHeX.Core/Saves/Substructures/Gen6/MyStatus6XY.cs
@@ -2,6 +2,10 @@
namespace PKHeX.Core
{
+ ///
+ /// XY specific features for
+ ///
+ /// These properties are technically included in OR/AS but they are unused; assumed backwards compatibility for communications with XY
public sealed class MyStatus6XY : MyStatus6
{
public MyStatus6XY(SaveFile sav, int offset) : base(sav, offset) { }
diff --git a/PKHeX.Core/Saves/Substructures/Gen6/Puff6.cs b/PKHeX.Core/Saves/Substructures/Gen6/Puff6.cs
index 076c12408..63c4b5669 100644
--- a/PKHeX.Core/Saves/Substructures/Gen6/Puff6.cs
+++ b/PKHeX.Core/Saves/Substructures/Gen6/Puff6.cs
@@ -56,4 +56,30 @@ namespace PKHeX.Core
Array.Reverse(Data, Offset, PuffCount);
}
}
+
+
+ public class BattleBox6 : SaveBlock
+ {
+ public BattleBox6(SaveFile SAV, int offset) : base(SAV) => Offset = offset;
+
+ private int LockedFlagOffset => Offset + (6 * PKX.SIZE_6STORED);
+
+ public bool Locked
+ {
+ get => LockedWiFiTournament || LockedLiveTournament;
+ set => LockedWiFiTournament = LockedLiveTournament = value;
+ }
+
+ public bool LockedWiFiTournament
+ {
+ get => (Data[LockedFlagOffset] & 1) != 0;
+ set => Data[LockedFlagOffset] = (byte)((Data[Offset + LockedFlagOffset] & ~1) | (value ? 1 : 0));
+ }
+
+ public bool LockedLiveTournament
+ {
+ get => (Data[LockedFlagOffset] & 2) != 0;
+ set => Data[LockedFlagOffset] = (byte)((Data[Offset + LockedFlagOffset] & ~2) | (value ? 2 : 0));
+ }
+ }
}
\ No newline at end of file
diff --git a/PKHeX.Core/Saves/Substructures/PokeDex/Zukan6.cs b/PKHeX.Core/Saves/Substructures/PokeDex/Zukan6.cs
index 4f2735ba5..77fbcd827 100644
--- a/PKHeX.Core/Saves/Substructures/PokeDex/Zukan6.cs
+++ b/PKHeX.Core/Saves/Substructures/PokeDex/Zukan6.cs
@@ -10,6 +10,7 @@ namespace PKHeX.Core
protected override int BitSeenSize => 0x60;
protected override int DexLangFlagByteCount => 7;
protected override int DexLangIDCount => 7;
+ protected int SpindaOffset { get; set; }
protected Zukan6(SaveFile sav, int dex, int langflag) : base(sav, dex, langflag) { }
@@ -117,6 +118,12 @@ namespace PKHeX.Core
return false;
}
+ public uint SpindaPID
+ {
+ get => BitConverter.ToUInt32(SAV.Data, PokeDex + SpindaOffset);
+ set => SAV.SetData(BitConverter.GetBytes(value), PokeDex + SpindaOffset);
+ }
+
public bool[] GetLanguageBitflags(int species)
{
var result = new bool[DexLangIDCount];
@@ -166,6 +173,7 @@ namespace PKHeX.Core
public Zukan6AO(SaveFile sav, int dex, int langflag) : base(sav, dex, langflag)
{
DexFormIndexFetcher = (spec, form, _) => DexFormUtil.GetDexFormIndexORAS(spec, form);
+ SpindaOffset = 0x680;
}
protected override void SetCaughtFlag(int bit, int origin)
@@ -194,6 +202,7 @@ namespace PKHeX.Core
public Zukan6XY(SaveFile sav, int dex, int langflag) : base(sav, dex, langflag)
{
DexFormIndexFetcher = (spec, form, _) => DexFormUtil.GetDexFormIndexXY(spec, form);
+ SpindaOffset = 0x648;
}
protected override void SetCaughtFlag(int bit, int origin)
diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_PokedexORAS.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_PokedexORAS.cs
index ec66acb15..751ede007 100644
--- a/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_PokedexORAS.cs
+++ b/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_PokedexORAS.cs
@@ -34,7 +34,7 @@ namespace PKHeX.WinForms
editing = false;
LB_Species.SelectedIndex = 0;
- TB_Spinda.Text = BitConverter.ToUInt32(SAV.Data, SAV.Spinda).ToString("X8");
+ TB_Spinda.Text = Zukan.SpindaPID.ToString("X8");
CB_Species.KeyDown += WinFormsUtil.RemoveDropCB;
}
@@ -194,11 +194,7 @@ namespace PKHeX.WinForms
private void B_Save_Click(object sender, EventArgs e)
{
SetEntry();
-
- // Store Spinda Spot
- uint PID = Util.GetHexValue(TB_Spinda.Text);
- BitConverter.GetBytes(PID).CopyTo(SAV.Data, SAV.Spinda);
-
+ Zukan.SpindaPID = Util.GetHexValue(TB_Spinda.Text);
Origin.SetData(SAV.Data, 0);
Close();
}
diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_PokedexXY.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_PokedexXY.cs
index e3538797b..14eff2856 100644
--- a/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_PokedexXY.cs
+++ b/PKHeX.WinForms/Subforms/Save Editors/Gen6/SAV_PokedexXY.cs
@@ -34,7 +34,7 @@ namespace PKHeX.WinForms
editing = false;
LB_Species.SelectedIndex = 0;
- TB_Spinda.Text = BitConverter.ToUInt32(SAV.Data, SAV.Spinda).ToString("X8");
+ TB_Spinda.Text = Zukan.SpindaPID.ToString("X8");
CB_Species.KeyDown += WinFormsUtil.RemoveDropCB;
}
@@ -203,12 +203,7 @@ namespace PKHeX.WinForms
private void B_Save_Click(object sender, EventArgs e)
{
SetEntry();
-
- // Store Spinda Spot
- uint PID = Util.GetHexValue(TB_Spinda.Text);
- BitConverter.GetBytes(PID).CopyTo(SAV.Data, SAV.Spinda);
-
- // Return back to the parent savefile
+ Zukan.SpindaPID = Util.GetHexValue(TB_Spinda.Text);
Origin.SetData(SAV.Data, 0);
Close();
}