Fix Load All Patterns Ownership (#756)

Added Personal for IVillagerOrigin in place of current pattern index for Load All.

Moved ContainsTransparentPixels to ImageUtil.
This commit is contained in:
Josh (vector_cmdr) 2026-02-20 22:55:55 +11:00 committed by GitHub
parent dc7292a5d3
commit 4426404f2d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 42 additions and 22 deletions

View File

@ -181,7 +181,7 @@ private static void Dump(this DesignPattern dp, string path, int index, bool ind
/// <param name="patterns">Patterns to load</param>
/// <param name="path">Path to load from</param>
/// <param name="changeOrigins">Change origins of Patterns</param>
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<DesignPatternPRO> patterns, string pa
/// <param name="path">Path to load from</param>
/// <param name="changeOrigins">Change origins of Patterns</param>
/// <param name="sortAlpha">Sort the files by file name instead of depending on the Operating System's return order</param>
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;

View File

@ -65,6 +65,21 @@ public void SetBitmapData(Span<int> 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<int> data, int width, int height, PixelFormat format = PixelFormat.Format32bppArgb)
{
var span = MemoryMarshal.Cast<int, byte>(data);

View File

@ -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);

View File

@ -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;