From 429a3b1a08fc4948d96cbbee70536f53b57a79e6 Mon Sep 17 00:00:00 2001 From: Kurt Date: Tue, 17 Mar 2020 12:14:01 -0700 Subject: [PATCH] Expose decoration list for editing Closes #2785 , not making a GUI for this (someone else can do it) Moves RTC3 to the appropriate folder --- PKHeX.Core/Saves/SAV3.cs | 18 +-- .../Saves/Substructures/Gen3/Decoration3.cs | 127 ++++++++++++++++++ .../Gen3/DecorationInventory3.cs | 27 ++++ PKHeX.Core/Saves/Substructures/Gen3/RTC3.cs | 17 +++ .../Substructures/Gen3/StructConverter.cs | 46 +++++++ 5 files changed, 222 insertions(+), 13 deletions(-) create mode 100644 PKHeX.Core/Saves/Substructures/Gen3/Decoration3.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen3/DecorationInventory3.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen3/RTC3.cs create mode 100644 PKHeX.Core/Saves/Substructures/Gen3/StructConverter.cs diff --git a/PKHeX.Core/Saves/SAV3.cs b/PKHeX.Core/Saves/SAV3.cs index a105de608..bc8ab10e1 100644 --- a/PKHeX.Core/Saves/SAV3.cs +++ b/PKHeX.Core/Saves/SAV3.cs @@ -1025,19 +1025,11 @@ public bool ResetPersonal(GameVersion g) _personal = SaveUtil.GetG3Personal(g); return true; } - } - // RTC - public sealed class RTC3 - { - public readonly byte[] Data; - public const int Size = 8; - - public RTC3(byte[] data) => Data = data; - - public int Day { get => BitConverter.ToUInt16(Data, 0x00); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x00); } - public int Hour { get => Data[2]; set => Data[2] = (byte)value; } - public int Minute { get => Data[3]; set => Data[3] = (byte)value; } - public int Second { get => Data[4]; set => Data[4] = (byte)value; } + public DecorationInventory3 Decorations + { + get => Data.Slice(GetBlockOffset(3) + 0x7A0, DecorationInventory3.SIZE).ToStructure(); + set => SetData(value.ToBytes(), GetBlockOffset(3) + 0x7A0); + } } } diff --git a/PKHeX.Core/Saves/Substructures/Gen3/Decoration3.cs b/PKHeX.Core/Saves/Substructures/Gen3/Decoration3.cs new file mode 100644 index 000000000..145cb77f3 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen3/Decoration3.cs @@ -0,0 +1,127 @@ +namespace PKHeX.Core +{ + public enum Decoration3 : byte + { + NONE, + SMALL_DESK, + POKEMON_DESK, + HEAVY_DESK, + RAGGED_DESK, + COMFORT_DESK, + PRETTY_DESK, + BRICK_DESK, + CAMP_DESK, + HARD_DESK, + SMALL_CHAIR, + POKEMON_CHAIR, + HEAVY_CHAIR, + PRETTY_CHAIR, + COMFORT_CHAIR, + RAGGED_CHAIR, + BRICK_CHAIR, + CAMP_CHAIR, + HARD_CHAIR, + RED_PLANT, + TROPICAL_PLANT, + PRETTY_FLOWERS, + COLORFUL_PLANT, + BIG_PLANT, + GORGEOUS_PLANT, + RED_BRICK, + YELLOW_BRICK, + BLUE_BRICK, + RED_BALLOON, + BLUE_BALLOON, + YELLOW_BALLOON, + RED_TENT, + BLUE_TENT, + SOLID_BOARD, + SLIDE, + FENCE_LENGTH, + FENCE_WIDTH, + TIRE, + STAND, + MUD_BALL, + BREAKABLE_DOOR, + SAND_ORNAMENT, + SILVER_SHIELD, + GOLD_SHIELD, + GLASS_ORNAMENT, + TV, + ROUND_TV, + CUTE_TV, + GLITTER_MAT, + JUMP_MAT, + SPIN_MAT, + C_LOW_NOTE_MAT, + D_NOTE_MAT, + E_NOTE_MAT, + F_NOTE_MAT, + G_NOTE_MAT, + A_NOTE_MAT, + B_NOTE_MAT, + C_HIGH_NOTE_MAT, + SURF_MAT, + THUNDER_MAT, + FIRE_BLAST_MAT, + POWDER_SNOW_MAT, + ATTRACT_MAT, + FISSURE_MAT, + SPIKES_MAT, + BALL_POSTER, + GREEN_POSTER, + RED_POSTER, + BLUE_POSTER, + CUTE_POSTER, + PIKA_POSTER, + LONG_POSTER, + SEA_POSTER, + SKY_POSTER, + KISS_POSTER, + PICHU_DOLL, + PIKACHU_DOLL, + MARILL_DOLL, + TOGEPI_DOLL, + CYNDAQUIL_DOLL, + CHIKORITA_DOLL, + TOTODILE_DOLL, + JIGGLYPUFF_DOLL, + MEOWTH_DOLL, + CLEFAIRY_DOLL, + DITTO_DOLL, + SMOOCHUM_DOLL, + TREECKO_DOLL, + TORCHIC_DOLL, + MUDKIP_DOLL, + DUSKULL_DOLL, + WYNAUT_DOLL, + BALTOY_DOLL, + KECLEON_DOLL, + AZURILL_DOLL, + SKITTY_DOLL, + SWABLU_DOLL, + GULPIN_DOLL, + LOTAD_DOLL, + SEEDOT_DOLL, + PIKA_CUSHION, + ROUND_CUSHION, + KISS_CUSHION, + ZIGZAG_CUSHION, + SPIN_CUSHION, + DIAMOND_CUSHION, + BALL_CUSHION, + GRASS_CUSHION, + FIRE_CUSHION, + WATER_CUSHION, + SNORLAX_DOLL, + RHYDON_DOLL, + LAPRAS_DOLL, + VENUSAUR_DOLL, + CHARIZARD_DOLL, + BLASTOISE_DOLL, + WAILMER_DOLL, + REGIROCK_DOLL, + REGICE_DOLL, + REGISTEEL_DOLL, + } +} \ No newline at end of file diff --git a/PKHeX.Core/Saves/Substructures/Gen3/DecorationInventory3.cs b/PKHeX.Core/Saves/Substructures/Gen3/DecorationInventory3.cs new file mode 100644 index 000000000..a9dce1043 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen3/DecorationInventory3.cs @@ -0,0 +1,27 @@ +using System.Runtime.InteropServices; + +namespace PKHeX.Core +{ + [StructLayout(LayoutKind.Sequential)] + public struct DecorationInventory3 + { + public const int SIZE = 150; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + public readonly Decoration3[] Desk; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + public readonly Decoration3[] Chair; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + public readonly Decoration3[] Plant; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)] + public readonly Decoration3[] Ornament; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)] + public readonly Decoration3[] Mat; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + public readonly Decoration3[] Poster; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)] + public readonly Decoration3[] Doll; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + public readonly Decoration3[] Cushion; + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen3/RTC3.cs b/PKHeX.Core/Saves/Substructures/Gen3/RTC3.cs new file mode 100644 index 000000000..85912ad26 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen3/RTC3.cs @@ -0,0 +1,17 @@ +using System; + +namespace PKHeX.Core +{ + public sealed class RTC3 + { + public readonly byte[] Data; + public const int Size = 8; + + public RTC3(byte[] data) => Data = data; + + public int Day { get => BitConverter.ToUInt16(Data, 0x00); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x00); } + public int Hour { get => Data[2]; set => Data[2] = (byte)value; } + public int Minute { get => Data[3]; set => Data[3] = (byte)value; } + public int Second { get => Data[4]; set => Data[4] = (byte)value; } + } +} \ No newline at end of file diff --git a/PKHeX.Core/Saves/Substructures/Gen3/StructConverter.cs b/PKHeX.Core/Saves/Substructures/Gen3/StructConverter.cs new file mode 100644 index 000000000..35c79bea3 --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen3/StructConverter.cs @@ -0,0 +1,46 @@ +using System; +using System.Runtime.InteropServices; + +namespace PKHeX.Core +{ + internal static class StructConverter + { + public static T ToStructure(this byte[] bytes) where T : struct + { + var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); + try { return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); } + finally { handle.Free(); } + } + + public static T ToClass(this byte[] bytes) where T : class + { + var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); + try { return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); } + finally { handle.Free(); } + } + + public static byte[] ToBytesClass(this T obj) where T : class + { + int size = Marshal.SizeOf(obj); + byte[] arr = new byte[size]; + + IntPtr ptr = Marshal.AllocHGlobal(size); + Marshal.StructureToPtr(obj, ptr, true); + Marshal.Copy(ptr, arr, 0, size); + Marshal.FreeHGlobal(ptr); + return arr; + } + + public static byte[] ToBytes(this T obj) where T : struct + { + int size = Marshal.SizeOf(obj); + byte[] arr = new byte[size]; + + IntPtr ptr = Marshal.AllocHGlobal(size); + Marshal.StructureToPtr(obj, ptr, true); + Marshal.Copy(ptr, arr, 0, size); + Marshal.FreeHGlobal(ptr); + return arr; + } + } +}