From d29b8515edf0773b33bdc0633905b697dfee57c1 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Tue, 3 Jul 2018 02:19:43 -0400 Subject: [PATCH] Add ability to set the ROM Save File Icon The icon must be a 32x32 PNG file to be supported. --- ACNESCreator.Core/ACNESCreator.Core.csproj | 8 +- ACNESCreator.Core/EndianExtensions.cs | 52 --------- ACNESCreator.Core/GCI.cs | 40 +++---- ACNESCreator.Core/GCNToolKit.dll | Bin 0 -> 33280 bytes ACNESCreator.Core/NES.cs | 12 ++- .../ACNESCreator.FrontEnd.csproj | 3 + ACNESCreator.FrontEnd/MainWindow.xaml | 16 ++- ACNESCreator.FrontEnd/MainWindow.xaml.cs | 102 +++++++++++++++++- 8 files changed, 153 insertions(+), 80 deletions(-) delete mode 100644 ACNESCreator.Core/EndianExtensions.cs create mode 100644 ACNESCreator.Core/GCNToolKit.dll diff --git a/ACNESCreator.Core/ACNESCreator.Core.csproj b/ACNESCreator.Core/ACNESCreator.Core.csproj index 1d30903..76e2cd6 100644 --- a/ACNESCreator.Core/ACNESCreator.Core.csproj +++ b/ACNESCreator.Core/ACNESCreator.Core.csproj @@ -1,7 +1,13 @@ - netstandard1.3;net46 + net461 + + + GCNToolKit.dll + + + diff --git a/ACNESCreator.Core/EndianExtensions.cs b/ACNESCreator.Core/EndianExtensions.cs deleted file mode 100644 index 014ee95..0000000 --- a/ACNESCreator.Core/EndianExtensions.cs +++ /dev/null @@ -1,52 +0,0 @@ -namespace System -{ - public static class UInt16Extension - { - public static UInt16 Reverse(this UInt16 Value) - { - return (ushort)((Value << 8) | (Value >> 8)); - } - } - - public static class Int16Extension - { - public static Int16 Reverse(this Int16 Value) - { - return (short)((Value << 8) | (Value >> 8)); - } - } - - public static class UInt32Extension - { - public static UInt32 Reverse(this UInt32 Value) - { - return ((Value << 24) | ((Value >> 24) & 0xFF) | ((Value & 0xFF00) << 8) | ((Value >> 8) & 0xFF00)); - } - } - - public static class Int32Extension - { - public static Int32 Reverse(this Int32 Value) - { - return ((Value << 24) | ((Value >> 24) & 0xFF) | ((Value & 0xFF00) << 8) | ((Value >> 8) & 0xFF00)); - } - } - - public static class UInt64Extension - { - public static UInt64 Reverse(this UInt64 Value) - { - return (((Value & 0xFF00000000000000) >> 56) | ((Value & 0xFF000000000000) >> 40) | ((Value & 0xFF0000000000) >> 24) | ((Value & 0xFF00000000) >> 8) - | ((Value & 0xFF000000) << 8) | ((Value & 0xFF0000) << 24) | ((Value & 0xFF00) << 40) | ((Value & 0xFF) << 56)); - } - } - - public static class Int64Extension - { - public static Int64 Reverse(this Int64 Value) - { - return (((Value >> 56) & 0xFF) | ((Value & 0xFF000000000000) >> 40) | ((Value & 0xFF0000000000) >> 24) | ((Value & 0xFF00000000) >> 8) - | ((Value & 0xFF000000) << 8) | ((Value & 0xFF0000) << 24) | ((Value & 0xFF00) << 40) | ((Value & 0xFF) << 56)); - } - } -} \ No newline at end of file diff --git a/ACNESCreator.Core/GCI.cs b/ACNESCreator.Core/GCI.cs index 39ec49f..04bce4f 100644 --- a/ACNESCreator.Core/GCI.cs +++ b/ACNESCreator.Core/GCI.cs @@ -36,7 +36,7 @@ public enum Permissions NoMove = 0b1000 // 8 } - class GCI + public class GCI { #region DEFAULT ICON IMAGE DATA public static readonly byte[] DefaultIconData = new byte[] @@ -132,7 +132,11 @@ class GCI 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; #endregion @@ -163,7 +167,7 @@ public byte[] Data private byte[] _data; - internal class GCIHeader + public sealed class GCIHeader { public string GameCode; public string MakerCode; @@ -242,28 +246,28 @@ public byte[] GetData() } } - public GCI(byte[] Data) - { - Header = new GCIHeader(Data); - Comment1 = Encoding.GetEncoding("shift-jis").GetString(Data, Header.CommentOffset + GCIHeaderSize, 32); - Comment2 = Encoding.GetEncoding("shift-jis").GetString(Data, Header.CommentOffset + GCIHeaderSize + 0x20, 32); - if ((IconFormats)Header.IconFormat == IconFormats.Shared_CI8) - { - ImageData = Data.Skip(Header.ImageOffset + GCIHeaderSize).Take(0x5C0).ToArray(); - } - - this.Data = Data.Skip(0x640).ToArray(); - } - - public GCI() + public GCI(byte[] IconData = null) { Header = new GCIHeader(); Comment1 = "Animal Crossing"; Comment2 = "NES Game"; - ImageData = DefaultIconData; + ImageData = IconData ?? DefaultIconData; Data = new byte[0]; } + public GCI(byte[] HeaderData, byte[] CommentData, byte[] BannerData, byte[] IconData) + { + Header = new GCIHeader(HeaderData); + Comment1 = Encoding.GetEncoding("shift-jis").GetString(CommentData, 0, 32); + Comment2 = Encoding.GetEncoding("shift-jis").GetString(CommentData, 0x20, 32); + if ((IconFormats)Header.IconFormat == IconFormats.Shared_CI8) + { + ImageData = IconData.Skip(Header.ImageOffset + GCIHeaderSize).Take(0x600).ToArray(); + } + + Data = Data.Skip(0x640).ToArray(); + } + public byte[] GetData() { List Data = new List(); diff --git a/ACNESCreator.Core/GCNToolKit.dll b/ACNESCreator.Core/GCNToolKit.dll new file mode 100644 index 0000000000000000000000000000000000000000..66cc827c8fd941c701f2a420d71b04f28974c3fa GIT binary patch literal 33280 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 literal 0 HcmV?d00001 diff --git a/ACNESCreator.Core/NES.cs b/ACNESCreator.Core/NES.cs index 1e2c809..b8fb40d 100644 --- a/ACNESCreator.Core/NES.cs +++ b/ACNESCreator.Core/NES.cs @@ -96,9 +96,13 @@ public ushort GetSize() public readonly Region GameRegion; public readonly bool IsDnMe; + public readonly byte[] SaveIconData; - public NES(string ROMName, byte[] ROMData, Region ACRegion, bool Compress, bool IsGameDnMe) + public NES(string ROMName, byte[] ROMData, Region ACRegion, bool Compress, bool IsGameDnMe, byte[] IconData = null) { + // Set the icon + SaveIconData = IconData ?? GCI.DefaultIconData; + // Is game Doubutsu no Mori e+? IsDnMe = IsGameDnMe; @@ -157,8 +161,8 @@ public NES(string ROMName, byte[] ROMData, Region ACRegion, bool Compress, bool GameRegion = ACRegion; } - public NES(string ROMName, byte[] ROMData, bool CanSave, Region ACRegion, bool Compress, bool IsDnMe) - : this(ROMName, ROMData, ACRegion, Compress, IsDnMe) + public NES(string ROMName, byte[] ROMData, bool CanSave, Region ACRegion, bool Compress, bool IsDnMe, byte[] IconData = null) + : this(ROMName, ROMData, ACRegion, Compress, IsDnMe, IconData) { if (!CanSave) { @@ -193,7 +197,7 @@ public byte[] GenerateGCIFile() } Data.AddRange(ROM); - var BlankGCIFile = new GCI + var BlankGCIFile = new GCI(SaveIconData) { Data = Data.ToArray(), Comment1 = IsDnMe ? "Animal Forest e+" : "Animal Crossing", diff --git a/ACNESCreator.FrontEnd/ACNESCreator.FrontEnd.csproj b/ACNESCreator.FrontEnd/ACNESCreator.FrontEnd.csproj index 2b7f7ee..9f82a19 100644 --- a/ACNESCreator.FrontEnd/ACNESCreator.FrontEnd.csproj +++ b/ACNESCreator.FrontEnd/ACNESCreator.FrontEnd.csproj @@ -42,6 +42,9 @@ ..\packages\Costura.Fody.3.1.0\lib\net46\Costura.dll + + ..\ACNESCreator.Core\GCNToolKit.dll + diff --git a/ACNESCreator.FrontEnd/MainWindow.xaml b/ACNESCreator.FrontEnd/MainWindow.xaml index 19b622e..3ae6312 100644 --- a/ACNESCreator.FrontEnd/MainWindow.xaml +++ b/ACNESCreator.FrontEnd/MainWindow.xaml @@ -10,7 +10,7 @@