diff --git a/PKHeX.Core/Saves/Substructures/Gen8/Daycare8.cs b/PKHeX.Core/Saves/Substructures/Gen8/Daycare8.cs new file mode 100644 index 000000000..f6f009593 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen8/Daycare8.cs @@ -0,0 +1,98 @@ +using System; + +namespace PKHeX.Core +{ + /// + /// Storage for the two in-game daycare structures. + /// + public sealed class Daycare8 : SaveBlock + { + public Daycare8(SaveFile sav, SCBlock block) : base(sav, block.Data) { } + + // BLOCK STRUCTURE: + // bool8 present + // pk8 entry1 + // bool8 present + // pk8 entry2 + // daycare metadata (0x26) + // bool1 present + // pk8 entry1 + // bool1 present + // pk8 entry2 + // daycare metadata (0x26) + + // daycare metadata: + // u16 ?? + // u32 ?step count since last update? + // u64 RNG seed + // 0x18 unk + + /// + /// Size of each PKM data stored (bool, pk8) + /// + private const int STRUCT_SIZE = 1 + PKX.SIZE_8STORED; + + /// + /// Size of each daycare (both entries & metadata) + /// + private const int DAYCARE_SIZE = (2 * STRUCT_SIZE) + 0x26; + + private const int META_1 = (2 * STRUCT_SIZE); + private const int META_2 = DAYCARE_SIZE + META_1; + + public bool GetDaycare1SlotOccupied(int slot) + { + if ((uint) slot >= 2) + throw new IndexOutOfRangeException(nameof(slot)); + + return Data[GetDaycare1StructOffset(slot)] == 1; + } + + public bool GetDaycare2SlotOccupied(int slot) + { + if ((uint)slot >= 2) + throw new IndexOutOfRangeException(nameof(slot)); + + return Data[GetDaycare2StructOffset(slot)] == 1; + } + + public static int GetDaycare1StructOffset(int slot) + { + if ((uint)slot >= 2) + throw new IndexOutOfRangeException(nameof(slot)); + + return 0 + (slot * STRUCT_SIZE); + } + + public static int GetDaycare2StructOffset(int slot) + { + if ((uint)slot >= 2) + throw new IndexOutOfRangeException(nameof(slot)); + + return DAYCARE_SIZE + (slot * STRUCT_SIZE); + } + + public static int GetDaycareSlotOffset(int daycare, int slot) + { + return daycare switch + { + 0 => (1 + GetDaycare1StructOffset(slot)), + 1 => (1 + GetDaycare2StructOffset(slot)), + _ => throw new IndexOutOfRangeException(nameof(daycare)) + }; + } + + public static int GetDaycareMetadataOffset(int daycare) + { + return daycare switch + { + 0 => META_1, + 1 => META_2, + _ => throw new IndexOutOfRangeException(nameof(daycare)) + }; + } + + public ulong GetDaycareSeed(int daycare) => BitConverter.ToUInt64(Data, GetDaycareMetadataOffset(daycare) + 6); + public void SetDaycareSeed(int daycare, ulong value) => SAV.SetData(Data, BitConverter.GetBytes(value), GetDaycareMetadataOffset(daycare) + 6); + } +} \ No newline at end of file diff --git a/PKHeX.Core/Saves/Substructures/Gen8/Fused8.cs b/PKHeX.Core/Saves/Substructures/Gen8/Fused8.cs index 5a923e74f..74162628b 100644 --- a/PKHeX.Core/Saves/Substructures/Gen8/Fused8.cs +++ b/PKHeX.Core/Saves/Substructures/Gen8/Fused8.cs @@ -1,7 +1,8 @@ -using System; - -namespace PKHeX.Core +namespace PKHeX.Core { + /// + /// Storage for the Fused species, , , + /// public sealed class Fused8 : SaveBlock { public Fused8(SaveFile sav, SCBlock block) : base(sav, block.Data) { } @@ -13,54 +14,4 @@ public static int GetFusedSlotOffset(int slot) return PKX.SIZE_8PARTY * slot; } } - - public sealed class Daycare8 : SaveBlock - { - public Daycare8(SaveFile sav, SCBlock block) : base(sav, block.Data) { } - - private const int STRUCT_SIZE = 4 + PKX.SIZE_8STORED; - private const int DAYCARE_SIZE = (2 * STRUCT_SIZE) + 0x26; - - public bool GetDaycare1SlotOccupied(int slot) - { - if ((uint) slot >= 2) - throw new IndexOutOfRangeException(nameof(slot)); - - return Data[GetDaycare1StructOffset(slot)] == 1; - } - - public bool GetDaycare2SlotOccupied(int slot) - { - if ((uint)slot >= 2) - throw new IndexOutOfRangeException(nameof(slot)); - - return Data[GetDaycare2StructOffset(slot)] == 1; - } - - public static int GetDaycare1StructOffset(int slot) - { - if ((uint)slot >= 2) - throw new IndexOutOfRangeException(nameof(slot)); - - return 0 + (slot * STRUCT_SIZE); - } - - public static int GetDaycare2StructOffset(int slot) - { - if ((uint)slot >= 2) - throw new IndexOutOfRangeException(nameof(slot)); - - return DAYCARE_SIZE + (slot * STRUCT_SIZE); - } - - public static int GetDaycareSlotOffset(int daycare, int slot) - { - return daycare switch - { - 0 => (4 + GetDaycare1StructOffset(slot)), - 1 => (4 + GetDaycare2StructOffset(slot)), - _ => throw new IndexOutOfRangeException(nameof(daycare)) - }; - } - } } \ No newline at end of file