From 4426404f2d10c0fa48a1a45163d6e11f3d515c6a Mon Sep 17 00:00:00 2001 From: "Josh (vector_cmdr)" Date: Fri, 20 Feb 2026 22:55:55 +1100 Subject: [PATCH] Fix Load All Patterns Ownership (#756) Added Personal for IVillagerOrigin in place of current pattern index for Load All. Moved ContainsTransparentPixels to ImageUtil. --- NHSE.Core/Structures/GameFileDumper.cs | 8 ++--- NHSE.Sprites/Util/ImageUtil.cs | 15 ++++++++ NHSE.WinForms/Subforms/Map/PatternEditor.cs | 34 +++++++++---------- .../Subforms/Map/PatternEditorPRO.cs | 7 +++- 4 files changed, 42 insertions(+), 22 deletions(-) diff --git a/NHSE.Core/Structures/GameFileDumper.cs b/NHSE.Core/Structures/GameFileDumper.cs index 9481c57..3e1b99a 100644 --- a/NHSE.Core/Structures/GameFileDumper.cs +++ b/NHSE.Core/Structures/GameFileDumper.cs @@ -181,7 +181,7 @@ private static void Dump(this DesignPattern dp, string path, int index, bool ind /// Patterns to load /// Path to load from /// Change origins of Patterns - public static void Load(this DesignPattern[] patterns, string path, bool changeOrigins) + public static void Load(this DesignPattern[] patterns, string path, Personal player, bool changeOrigins) { if (patterns.Length == 0) return; @@ -197,7 +197,7 @@ public static void Load(this DesignPattern[] patterns, string path, bool changeO var data = File.ReadAllBytes(f); var p = new DesignPattern(data); if (changeOrigins) - p.ChangeOrigins(patterns[ctr], data); + p.ChangeOrigins(player, data); patterns[ctr] = p; if (++ctr >= patterns.Length) break; @@ -241,7 +241,7 @@ public static void Dump(this IReadOnlyList patterns, string pa /// Path to load from /// Change origins of Patterns /// Sort the files by file name instead of depending on the Operating System's return order - public static void Load(this DesignPatternPRO[] patterns, string path, bool changeOrigins, bool sortAlpha = true) + public static void Load(this DesignPatternPRO[] patterns, string path, Personal player, bool changeOrigins, bool sortAlpha = true) { if (patterns.Length == 0) return; @@ -259,7 +259,7 @@ public static void Load(this DesignPatternPRO[] patterns, string path, bool chan var data = File.ReadAllBytes(f); var p = new DesignPatternPRO(data); if (changeOrigins) - p.ChangeOrigins(patterns[ctr], data); + p.ChangeOrigins(player, data); patterns[ctr] = p; if (++ctr >= patterns.Length) break; diff --git a/NHSE.Sprites/Util/ImageUtil.cs b/NHSE.Sprites/Util/ImageUtil.cs index 0b019ab..896e9be 100644 --- a/NHSE.Sprites/Util/ImageUtil.cs +++ b/NHSE.Sprites/Util/ImageUtil.cs @@ -65,6 +65,21 @@ public void SetBitmapData(Span data) } } + public static bool ContainsTransparentPixels(Bitmap image) + { + for (int y = 0; y < image.Height; ++y) + { + for (int x = 0; x < image.Width; ++x) + { + if (image.GetPixel(x, y).A < 255) // check alpha + { + return true; + } + } + } + return false; + } + public static Bitmap GetBitmap(ReadOnlySpan data, int width, int height, PixelFormat format = PixelFormat.Format32bppArgb) { var span = MemoryMarshal.Cast(data); diff --git a/NHSE.WinForms/Subforms/Map/PatternEditor.cs b/NHSE.WinForms/Subforms/Map/PatternEditor.cs index 0587f62..872a0ee 100644 --- a/NHSE.WinForms/Subforms/Map/PatternEditor.cs +++ b/NHSE.WinForms/Subforms/Map/PatternEditor.cs @@ -98,7 +98,22 @@ private void B_LoadDesign_Click(object sender, EventArgs e) if (dir == null || !Directory.Exists(dir)) return; var result = WinFormsUtil.Prompt(MessageBoxButtons.YesNoCancel, MessageStrings.MsgAskUpdateValues); - Patterns.Load(fbd.SelectedPath, result == DialogResult.Yes); + Patterns.Load(fbd.SelectedPath, Player.Personal, result == DialogResult.Yes); + foreach(var p in Patterns) + { + if (p.UsageCompatibility is not (0xEE00 or 0xEE02)) // known valid values (00=non-transparent, 02=transparent) + { + using var image = p.GetImage(); + if (ImageUtil.ContainsTransparentPixels(image)) + { + p.UsageCompatibility = 0xEE02; // set to transparent + } + else + { + p.UsageCompatibility = 0xEE00; // reset to default value (non-transparent) + } + } + } LoadPattern(Patterns[Index]); RepopulateList(Index); return; @@ -138,7 +153,7 @@ private void B_LoadDesign_Click(object sender, EventArgs e) if (d.UsageCompatibility is not (0xEE00 or 0xEE02)) // known valid values (00=non-transparent, 02=transparent) { using var image = d.GetImage(); - if (ContainsTransparentPixels(image)) + if (ImageUtil.ContainsTransparentPixels(image)) { d.UsageCompatibility = 0xEE02; // set to transparent } @@ -161,21 +176,6 @@ private void RepopulateList(int index) LB_Items.SelectedIndex = index; } - public bool ContainsTransparentPixels(Bitmap image) - { - for (int y = 0; y < image.Height; ++y) - { - for (int x = 0; x < image.Width; ++x) - { - if (image.GetPixel(x, y).A < 255) // check alpha - { - return true; - } - } - } - return false; - } - private void LoadPattern(DesignPattern designPattern) { PB_Pattern.Image = ImageUtil.ResizeImage(designPattern.GetImage(), DesignPattern.Width * scale, DesignPattern.Height * scale); diff --git a/NHSE.WinForms/Subforms/Map/PatternEditorPRO.cs b/NHSE.WinForms/Subforms/Map/PatternEditorPRO.cs index 74836d4..033d531 100644 --- a/NHSE.WinForms/Subforms/Map/PatternEditorPRO.cs +++ b/NHSE.WinForms/Subforms/Map/PatternEditorPRO.cs @@ -97,7 +97,12 @@ private void B_LoadDesign_Click(object sender, EventArgs e) if (dir == null || !Directory.Exists(dir)) return; var result = WinFormsUtil.Prompt(MessageBoxButtons.YesNoCancel, MessageStrings.MsgAskUpdateValues); - Patterns.Load(fbd.SelectedPath, result == DialogResult.Yes); + Patterns.Load(fbd.SelectedPath, Player.Personal, result == DialogResult.Yes); + foreach(var p in Patterns) + { + if (p.UsageCompatibility is not (0xEE01 or 0xEE05)) // known valid values (01=pro, 05=default_unused) + p.UsageCompatibility = 0xEE01; // reset to default pro design + } LoadPattern(Patterns[Index]); RepopulateList(Index); return;