From cd468e8a23bbef70c1574830419d9183c50f595d Mon Sep 17 00:00:00 2001 From: Jonko <69772986+jonko0493@users.noreply.github.com> Date: Thu, 18 Jul 2024 13:38:59 -0700 Subject: [PATCH] Fixup systex replacement (#357) --- .../Defaults/DefaultNames.en-US.json | 2 +- .../Items/SystemTextureItem.cs | 27 ++++++++++++++++--- .../Editors/SystemTextureEditor.cs | 8 ++++-- src/SerialLoops/Strings.Designer.cs | 10 +++++++ src/SerialLoops/Strings.resx | 3 +++ 5 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/SerialLoops.Lib/Defaults/DefaultNames.en-US.json b/src/SerialLoops.Lib/Defaults/DefaultNames.en-US.json index b2fb3a52..0b064d39 100644 --- a/src/SerialLoops.Lib/Defaults/DefaultNames.en-US.json +++ b/src/SerialLoops.Lib/Defaults/DefaultNames.en-US.json @@ -440,7 +440,7 @@ "SYSTEX_SYS_CMN_B17": "SYSTEX_DIALOGUE_ARROW", "SYSTEX_SYS_CMN_B18": "SYSTEX_INFORMATION", "SYSTEX_SYS_CMN_B22": "SYSTEX_CHESS_STUFF", - "SYSTEX_SYS_CMN_B24": "SYSTEX_PUZZLE_TEXT", + "SYSTEX_SYS_CMN_B24": "SYSTEX_COMMON_TEXT", "SYSTEX_SYS_CMN_B25": "SYSTEX_TOPIC_BROWSER", "SYSTEX_SYS_CMN_B27": "SYSTEX_FORWARD", "SYSTEX_SYS_CMN_B30": "SYSTEX_COMPANION_SELECT", diff --git a/src/SerialLoops.Lib/Items/SystemTextureItem.cs b/src/SerialLoops.Lib/Items/SystemTextureItem.cs index 81f3fc8a..078b9935 100644 --- a/src/SerialLoops.Lib/Items/SystemTextureItem.cs +++ b/src/SerialLoops.Lib/Items/SystemTextureItem.cs @@ -3,6 +3,8 @@ using HaruhiChokuretsuLib.Util; using SerialLoops.Lib.Util; using SkiaSharp; +using System; +using System.Collections.Generic; using System.IO; using System.Linq; @@ -15,6 +17,9 @@ public class SystemTextureItem : Item public int Width { get; set; } public int Height { get; set; } + private const string COMMON_PALETTE = "#ff00f800,#fff00080,#ff80f000,#ff00f080,#ff00f800,#ff00f800,#ff00f800,#ff482828,#ff684038,#ff905850,#ffb88070,#ffc8a080,#ffd8b090,#ffe8c8a0,#fff8d8b0,#fff8e8c0,#fff00000,#fff02800,#fff04000,#fff05000,#fff06000,#fff07000,#fff08000,#fff09000,#fff0a000,#fff0b000,#fff0c000,#fff0d000,#fff0e000,#fff0f000,#ffe0f000,#ffd0f000,#ffc0f000,#ffb0f000,#ffa0f000,#ff90f000,#ff80f000,#ff68f000,#ff50f000,#ff30f000,#ff00f000,#ff00f040,#ff00f068,#ff00f090,#ff00f0b0,#ff00f0d0,#ff00f0f0,#ff00e0f0,#ff00d0f0,#ff00c0f0,#ff00b0f0,#ff00a0f0,#ff0090f0,#ff0080f0,#ff0070f0,#ff0060f0,#ff0050f0,#ff0040f0,#ff0030f0,#ff0020f0,#ff0000f0,#ff2000f0,#ff3000f0,#ff4000f0,#ff5000f0,#ff6000f0,#ff7000f0,#ff8000f0,#ff9000f0,#ffa000f0,#ffb000f0,#ffc000f0,#ffd000f0,#ffe000f0,#fff000f0,#fff000d0,#fff000b0,#fff00090,#fff00068,#fff00040,#fff8f8f8,#fff0f0f0,#ffe8e8e8,#ffe0e0e0,#ffd8d8d8,#ffd0d0d0,#ffc8c8c8,#ffc0c0c0,#ffb8b8b8,#ffb0b0b0,#ffa8a8a8,#ffa0a0a0,#ff989898,#ff909090,#ff888888,#ff808080,#ff787878,#ff707070,#ff686868,#ff606060,#ff585858,#ff505050,#ff484848,#ff404040,#ff383838,#ff303030,#ff282828,#ff202020,#ff181818,#ff101010,#ff080808,#ff000000,#ff281010,#ff502020,#ff783838,#ffa05050,#ffc86868,#fff08080,#fff8a0a0,#fff8c0c0,#fff8e0e0,#ff282810,#ff505020,#ff787838,#ffa0a050,#ffc8c868,#fff0f080,#fff8f8a0,#fff8f8c0,#fff8f8e0,#ff102810,#ff285028,#ff407840,#ff50a050,#ff68c868,#ff80f080,#ffa0f8a0,#ffc0f8c0,#ffe0f8e0,#ff102828,#ff205050,#ff387878,#ff50a0a0,#ff68c8c8,#ff80f0f0,#ffa0f8f8,#ffc0f8f8,#ffe0f8f8,#ff101028,#ff202050,#ff383878,#ff5050a0,#ff6868c8,#ff8080f0,#ffa0a0f8,#ffc0c0f8,#ffe0e0f8,#ff281028,#ff502050,#ff783878,#ffa050a0,#ffc868c8,#fff080f0,#fff8a0f8,#fff8c0f8,#fff8e0f8,#ff280010,#ff500020,#ff780038,#ffa00050,#ffc80068,#fff03898,#fff868b0,#fff898c8,#fff8c8e0,#ff281000,#ff502000,#ff783800,#ffa05000,#ffc86800,#fff09838,#fff8b068,#fff8c898,#fff8e0c8,#ff102800,#ff205000,#ff387800,#ff50a000,#ff68c800,#ff98f030,#ffb0f860,#ffc8f898,#ffe0f8c8,#ff002810,#ff005020,#ff007838,#ff00a050,#ff00c868,#ff30f098,#ff60f8b0,#ff98f8c8,#ffc8f8e0,#ff001028,#ff002050,#ff003878,#ff0050a0,#ff0068c8,#ff3098f0,#ff60b0f8,#ff98c8f8,#ffc8e0f8,#ff100028,#ff200050,#ff380078,#ff5000a0,#ff6800c8,#ff9830f0,#ffb060f8,#ffc898f8,#ffe0c8f8,#ff300000,#ff600000,#ff900000,#ffc00000,#fff03030,#fff86060,#ff303000,#ff606000,#ff909000,#ffc0c000,#fff0f030,#fff8f860,#ff003000,#ff006000,#ff009000,#ff00c000,#ff30f030,#ff60f860,#ff003030,#ff006060,#ff009090,#ff00c0c0,#ff30f0f0,#ff60f8f8,#ff000030,#ff000060,#ff000090,#ff0000c0,#ff3030f0,#ff6060f8,#ff300030,#ff600060,#ff900090,#ffc000c0,#fff030f0,#fff860f8"; + private static SKColor TRANSPARENT = new(0, 248, 0); + public SystemTextureItem(SystemTexture sysTex, Project project, string name, int width = -1, int height = -1) : base(name, ItemType.System_Texture) { SysTex = sysTex; @@ -63,15 +68,23 @@ public SKBitmap GetTexture() } } - public void SetTexture(SKBitmap bitmap, bool replacePalette) + public void SetTexture(SKBitmap bitmap, bool replacePalette, ILogger log) { - if (replacePalette == false) + List replacedPalette = []; + if (replacePalette) + { + replacedPalette = Helpers.GetPaletteFromImage(bitmap, 255, log); + replacedPalette.Insert(0, SKColors.Transparent); + Grp.SetPalette(replacedPalette); + } + else if (Grp.Palette[0] == TRANSPARENT) { Grp.Palette[0] = SKColors.Transparent; } + if (SysTex.Screen == SysTexScreen.BOTTOM_SCREEN) { - Grp.SetImage(bitmap, replacePalette, transparentIndex: replacePalette ? 0 : -1); + Grp.SetImage(bitmap); } else { @@ -91,8 +104,9 @@ public void SetTexture(SKBitmap bitmap, bool replacePalette) } tileCanvas.Flush(); - Grp.SetImage(tileBitmap, replacePalette, transparentIndex: replacePalette ? 0 : -1); + Grp.SetImage(tileBitmap); } + Grp.Palette[0] = TRANSPARENT; } public void Write(Project project, ILogger log) @@ -102,5 +116,10 @@ public void Write(Project project, ILogger log) IO.WriteBinaryFile(Path.Combine("assets", "graphics", $"{Grp.Index:X3}.png"), grpStream.ToArray(), project, log); IO.WriteStringFile(Path.Combine("assets", "graphics", $"{Grp.Index:X3}.gi"), Grp.GetGraphicInfoFile(), project, log); } + + public bool UsesCommonPalette() + { + return COMMON_PALETTE.Equals(string.Join(',', Grp.Palette.Select(c => c.ToString())), StringComparison.OrdinalIgnoreCase); + } } } diff --git a/src/SerialLoops/Editors/SystemTextureEditor.cs b/src/SerialLoops/Editors/SystemTextureEditor.cs index 4462fcaa..187567ea 100644 --- a/src/SerialLoops/Editors/SystemTextureEditor.cs +++ b/src/SerialLoops/Editors/SystemTextureEditor.cs @@ -24,9 +24,12 @@ public override Container GetEditorPanel() Button replaceButton = new() { Text = Application.Instance.Localize(this, "Replace") }; replaceButton.Click += ReplaceButton_Click; - Button replaceWithPaletteButton = new() { Text = Application.Instance.Localize(this, "Replace with Palette") }; + // If the common palette is used, we don't want to allow users to replace it + Button replaceWithPaletteButton = new() { Text = Application.Instance.Localize(this, "Replace with Palette"), Enabled = !_systemTexture.UsesCommonPalette() }; replaceWithPaletteButton.Click += ReplaceWithPaletteButton_Click; + Label usesCommonPaletteLabel = new() { Text = _systemTexture.UsesCommonPalette() ? Application.Instance.Localize(this, "This system texture uses a common palette, so palette replacement has been disabled") : string.Empty }; + return new StackLayout { Orientation = Orientation.Vertical, @@ -34,6 +37,7 @@ public override Container GetEditorPanel() Items = { new SKGuiImage(_systemTexture.GetTexture()), + usesCommonPaletteLabel, new StackLayout { Orientation = Orientation.Horizontal, @@ -97,7 +101,7 @@ private void ReplaceImage(bool replacePalette) try { LoopyProgressTracker tracker = new(s => Application.Instance.Localize(null, s)); - _ = new ProgressDialog(() => _systemTexture.SetTexture(systemTextureResizeDialog.FinalImage, replacePalette), + _ = new ProgressDialog(() => _systemTexture.SetTexture(systemTextureResizeDialog.FinalImage, replacePalette, _log), () => Content = GetEditorPanel(), tracker, string.Format(Application.Instance.Localize(this, $"Replacing {0}..."), _systemTexture.DisplayName)); UpdateTabTitle(false); } diff --git a/src/SerialLoops/Strings.Designer.cs b/src/SerialLoops/Strings.Designer.cs index 5d4af3cb..78a0346b 100644 --- a/src/SerialLoops/Strings.Designer.cs +++ b/src/SerialLoops/Strings.Designer.cs @@ -5891,6 +5891,16 @@ public static string The_changes_made_will_require_Serial_Loops_to_be_restarted_ } } + /// + /// Looks up a localized string similar to This system texture uses a common palette, so palette replacement has been disabled. + /// + public static string This_system_texture_uses_a_common_palette__so_palette_replacement_has_been_disabled { + get { + return ResourceManager.GetString("This system texture uses a common palette, so palette replacement has been disabl" + + "ed", resourceCulture); + } + } + /// /// Looks up a localized string similar to Time (Frames). /// diff --git a/src/SerialLoops/Strings.resx b/src/SerialLoops/Strings.resx index b7de9d04..31264c83 100644 --- a/src/SerialLoops/Strings.resx +++ b/src/SerialLoops/Strings.resx @@ -2070,6 +2070,9 @@ The changes made will require Serial Loops to be restarted. Is that okay? + + This system texture uses a common palette, so palette replacement has been disabled + Time (Frames)