Update OMI submodule

- Changed pck file property api
- Move LocFile InitializeDefault to extension class
This commit is contained in:
miku-666
2024-03-15 23:08:26 +01:00
parent ab8a42c132
commit b07462b439
10 changed files with 89 additions and 59 deletions

View File

@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OMI.Formats.Languages;
namespace PckStudio.Extensions
{
internal static class LocFileExtensions
{
public static void InitializeDefault(this LOCFile locFile, string packName) => locFile.Initialize("en-EN", ("IDS_DISPLAY_NAME", packName));
public static void Initialize(this LOCFile locFile, string language, params (string, string)[] locKeyValuePairs)
{
locFile.AddLanguage(language);
foreach (var locKeyValue in locKeyValuePairs)
locFile.AddLocKey(locKeyValue.Item1, locKeyValue.Item2);
}
}
}

View File

@@ -237,7 +237,7 @@ namespace PckStudio.Features
currentPCK = reader.FromFile(filepath);
if (currentPCK is null) return string.Empty;
return currentPCK.TryGetFile("0", PckFileType.InfoFile, out var file)
? file.Properties.GetPropertyValue("PACKID")
? file.GetProperty("PACKID")
: string.Empty;
}

View File

@@ -242,32 +242,32 @@ namespace PckStudio.Popups
}
string skinId = _skinId.ToString("d08");
skin.Filename = $"dlcskin{skinId}.png";
skin.Properties.Add("DISPLAYNAME", textSkinName.Text);
skin.AddProperty("DISPLAYNAME", textSkinName.Text);
if (currentLoc is not null)
{
string skinDisplayNameLocKey = $"IDS_dlcskin{skinId}_DISPLAYNAME";
skin.Properties.Add("DISPLAYNAMEID", skinDisplayNameLocKey);
skin.AddProperty("DISPLAYNAMEID", skinDisplayNameLocKey);
currentLoc.AddLocKey(skinDisplayNameLocKey, textSkinName.Text);
}
if (!string.IsNullOrEmpty(textThemeName.Text))
{
skin.Properties.Add("THEMENAME", textThemeName.Text);
skin.AddProperty("THEMENAME", textThemeName.Text);
if (currentLoc is not null)
{
skin.Properties.Add("THEMENAMEID", $"IDS_dlcskin{skinId}_THEMENAME");
skin.AddProperty("THEMENAMEID", $"IDS_dlcskin{skinId}_THEMENAME");
currentLoc.AddLocKey($"IDS_dlcskin{skinId}_THEMENAME", textThemeName.Text);
}
}
skin.Properties.Add("ANIM", anim);
skin.Properties.Add("GAME_FLAGS", "0x18");
skin.Properties.Add("FREE", "1");
skin.AddProperty("ANIM", anim);
skin.AddProperty("GAME_FLAGS", "0x18");
skin.AddProperty("FREE", "1");
if (HasCape)
{
cape.Filename = $"dlccape{skinId}.png";
skin.Properties.Add("CAPEPATH", cape.Filename);
skin.AddProperty("CAPEPATH", cape.Filename);
}
skin.SetData(skinPictureBox.Image, ImageFormat.Png);
DialogResult = DialogResult.OK;

View File

@@ -67,7 +67,7 @@ namespace PckStudio.Popups
if (index == -1 || (Enum.IsDefined(typeof(PckFileType), index) && (int)file.Filetype == index))
{
file.Properties.Add(propertyKeyTextBox.Text, propertyValueTextBox.Text);
file.AddProperty(propertyKeyTextBox.Text, propertyValueTextBox.Text);
}
}

View File

@@ -141,7 +141,7 @@ namespace PckStudio.Forms
}
comboParent.Items.Clear();
comboParent.Items.AddRange(ValidModelBoxTypes);
LoadData(file.Properties);
LoadData(file);
}
private static readonly Regex sWhitespace = new Regex(@"\s+");
public static string ReplaceWhitespace(string input, string replacement)
@@ -149,9 +149,9 @@ namespace PckStudio.Forms
return sWhitespace.Replace(input, replacement);
}
private void LoadData(PckFileProperties properties)
private void LoadData(PckFileData file)
{
comboParent.Enabled = properties.GetProperties("BOX").All(kv => {
comboParent.Enabled = file.GetMultipleProperties("BOX").All(kv => {
var box = SkinBOX.FromString(kv.Value);
if (ValidModelBoxTypes.Contains(box.Type))
{
@@ -160,7 +160,7 @@ namespace PckStudio.Forms
}
return false;
});
properties.GetProperties("OFFSET").All(kv => {
file.GetMultipleProperties("OFFSET").All(kv => {
string[] offset = ReplaceWhitespace(kv.Value, ",").TrimEnd('\n', '\r', ' ').Split(',');
if (offset.Length < 3)
return false;
@@ -176,7 +176,7 @@ namespace PckStudio.Forms
return false;
});
_ANIM = properties.GetPropertyValue("ANIM", SkinANIM.FromString);
_ANIM = file.GetProperty("ANIM", SkinANIM.FromString);
UpdateListView();
Rerender();
}
@@ -1094,7 +1094,7 @@ namespace PckStudio.Forms
{
foreach (var part in modelBoxes)
{
_file.Properties.Add("BOX", part);
_file.AddProperty("BOX", part);
}
//Bitmap bitmap2 = new Bitmap(64, 64);

View File

@@ -182,7 +182,7 @@ namespace PckStudio.Forms
string capePath = "";
bool hasCape = false;
foreach (var entry in newSkin.Properties)
foreach (var entry in newSkin.GetProperties())
{
if (entry.Key == "DISPLAYNAME")
{
@@ -264,7 +264,7 @@ namespace PckStudio.Forms
if (skinPicture.Height == skinPicture.Width)
{
//determines skin type based on image dimensions, existence of BOX tags, and the ANIM value
foreach (var entry in newSkin.Properties)
foreach (var entry in newSkin.GetProperties())
{
if (entry.Key == "BOX")
{

View File

@@ -18,7 +18,7 @@ namespace PckStudio.Helper
internal static void SaveAnimationToFile(PckFileData file, Animation animation)
{
string anim = animation.BuildAnim();
file.Properties.SetProperty("ANIM", anim);
file.SetProperty("ANIM", anim);
var texture = animation.BuildTexture();
file.SetData(texture, ImageFormat.Png);
}
@@ -30,7 +30,7 @@ namespace PckStudio.Helper
{
var texture = file.GetTexture();
var frameTextures = texture.Split(ImageLayoutDirection.Vertical);
var _animation = new Animation(frameTextures, file.Properties.GetPropertyValue("ANIM"));
var _animation = new Animation(frameTextures, file.GetProperty("ANIM"));
_animation.Category = file.Filename.Split('/').Contains("items")
? AnimationCategory.Items
: AnimationCategory.Blocks;

View File

@@ -203,7 +203,7 @@ namespace PckStudio
{
if (currentPCK.TryGetFile("0", PckFileType.InfoFile, out PckFileData file))
{
file.Properties.RemoveAll(t => t.Key.Equals("LOCK"));
file.RemoveProperties("LOCK");
}
}
@@ -428,7 +428,7 @@ namespace PckStudio
public void HandleSkinFile(PckFileData file)
{
if (file.Properties.HasProperty("BOX"))
if (file.HasProperty("BOX"))
{
using generateModel generate = new generateModel(file);
if (generate.ShowDialog() == DialogResult.OK)
@@ -441,7 +441,7 @@ namespace PckStudio
}
var img = file.GetTexture();
using var skinViewer = new SkinPreview(img, file.Properties.GetPropertyValue("ANIM", SkinANIM.FromString));
using var skinViewer = new SkinPreview(img, file.GetProperty("ANIM", SkinANIM.FromString));
skinViewer.ShowDialog(this);
}
@@ -472,13 +472,13 @@ namespace PckStudio
if (e.Node.TryGetTagData(out PckFileData file))
{
viewFileInfoToolStripMenuItem.Visible = true;
if (file.Properties.HasProperty("BOX"))
if (file.HasProperty("BOX"))
{
buttonEdit.Text = "EDIT BOXES";
buttonEdit.Visible = true;
}
else if (file.Properties.HasProperty("ANIM") &&
file.Properties.GetPropertyValue("ANIM", s => SkinANIM.FromString(s) == (SkinAnimMask.RESOLUTION_64x64 | SkinAnimMask.SLIM_MODEL)))
else if (file.HasProperty("ANIM") &&
file.GetProperty("ANIM", s => SkinANIM.FromString(s) == (SkinAnimMask.RESOLUTION_64x64 | SkinAnimMask.SLIM_MODEL)))
{
buttonEdit.Text = "View Skin";
buttonEdit.Visible = true;
@@ -554,10 +554,13 @@ namespace PckStudio
private void extractFile(string outFilePath, PckFileData file)
{
File.WriteAllBytes(outFilePath, file.Data);
if (file.Properties.Count > 0)
if (file.PropertyCount > 0)
{
using var fs = File.CreateText($"{outFilePath}.txt");
file.Properties.ForEach(property => fs.WriteLine($"{property.Key}: {property.Value}"));
foreach (var property in file.GetProperties())
{
fs.WriteLine($"{property.Key}: {property.Value}");
}
}
}
@@ -723,10 +726,10 @@ namespace PckStudio
{
if (TryGetLocFile(out LOCFile locFile))
{
if (file.Properties.HasProperty("THEMENAMEID"))
locFile.RemoveLocKey(file.Properties.GetPropertyValue("THEMENAMEID"));
if (file.Properties.HasProperty("DISPLAYNAMEID"))
locFile.RemoveLocKey(file.Properties.GetPropertyValue("DISPLAYNAMEID"));
if (file.TryGetProperty("THEMENAMEID", out string value))
locFile.RemoveLocKey(value);
if (file.TryGetProperty("DISPLAYNAMEID", out value))
locFile.RemoveLocKey(value);
TrySetLocFile(locFile);
}
}
@@ -978,7 +981,8 @@ namespace PckStudio
if (node.Tag is PckFileData node_file)
{
PckFileData new_file = newPCKFile.CreateNewFile(node_file.Filename.Replace(parent_file.Filename + "/", String.Empty), node_file.Filetype);
foreach (var prop in node_file.Properties) new_file.Properties.Add(prop);
foreach (var prop in node_file.GetProperties())
new_file.AddProperty(prop);
new_file.SetData(node_file.Data);
}
}
@@ -1017,8 +1021,7 @@ namespace PckStudio
if (treeMeta.SelectedNode is TreeNode subnode && subnode.Tag is KeyValuePair<string, string> property &&
treeViewMain.SelectedNode is TreeNode node && node.Tag is PckFileData file)
{
int i = file.Properties.IndexOf(property);
if (i != -1)
if (file.HasProperty(property.Key))
{
switch (property.Key)
{
@@ -1028,7 +1031,7 @@ namespace PckStudio
using ANIMEditor diag = new ANIMEditor(property.Value);
if (diag.ShowDialog(this) == DialogResult.OK)
{
file.Properties[i] = new KeyValuePair<string, string>("ANIM", diag.ResultAnim.ToString());
file.SetProperty(file.GetPropertyIndex(property), new KeyValuePair<string, string>("ANIM", diag.ResultAnim.ToString()));
RebuildSubPCK(treeViewMain.SelectedNode.FullPath);
ReloadMetaTreeView();
wasModified = true;
@@ -1049,7 +1052,7 @@ namespace PckStudio
using BoxEditor diag = new BoxEditor(property.Value, IsSubPCKNode(treeViewMain.SelectedNode.FullPath));
if (diag.ShowDialog(this) == DialogResult.OK)
{
file.Properties[i] = new KeyValuePair<string, string>("BOX", diag.Result.ToString());
file.SetProperty(file.GetPropertyIndex(property), new KeyValuePair<string, string>("BOX", diag.Result.ToString()));
RebuildSubPCK(treeViewMain.SelectedNode.FullPath);
ReloadMetaTreeView();
wasModified = true;
@@ -1073,7 +1076,7 @@ namespace PckStudio
{
if (addProperty.ShowDialog() == DialogResult.OK)
{
file.Properties[i] = addProperty.Property;
file.SetProperty(file.GetPropertyIndex(property), addProperty.Property);
RebuildSubPCK(treeViewMain.SelectedNode.FullPath);
ReloadMetaTreeView();
wasModified = true;
@@ -1100,7 +1103,10 @@ namespace PckStudio
TreeNode newNode = new TreeNode();
newNode.Text = Path.GetFileName(diag.NewText);
var newFile = new PckFileData(diag.NewText, file.Filetype);
file.Properties.ForEach(newFile.Properties.Add);
foreach (var property in file.GetProperties())
{
newFile.AddProperty(property);
}
newFile.SetData(file.Data);
newFile.Filename = diag.NewText;
newNode.Tag = newFile;
@@ -1132,7 +1138,7 @@ namespace PckStudio
{
if (treeMeta.SelectedNode is TreeNode t && t.Tag is KeyValuePair<string, string> property &&
treeViewMain.SelectedNode is TreeNode main && main.Tag is PckFileData file &&
file.Properties.Remove(property))
file.RemoveProperty(property))
{
treeMeta.SelectedNode.Remove();
RebuildSubPCK(treeViewMain.SelectedNode.FullPath);
@@ -1146,7 +1152,7 @@ namespace PckStudio
if (treeViewMain.SelectedNode is TreeNode node &&
node.Tag is PckFileData file)
{
foreach (var property in file.Properties)
foreach (var property in file.GetProperties())
{
treeMeta.Nodes.Add(CreateNode(property.Key, property));
}
@@ -1161,7 +1167,7 @@ namespace PckStudio
using AddPropertyPrompt addProperty = new AddPropertyPrompt();
if (addProperty.ShowDialog() == DialogResult.OK)
{
file.Properties.Add(addProperty.Property);
file.AddProperty(addProperty.Property);
RebuildSubPCK(treeViewMain.SelectedNode.FullPath);
ReloadMetaTreeView();
wasModified = true;
@@ -1205,8 +1211,8 @@ namespace PckStudio
var pack = new PckFile(3);
var zeroFile = pack.CreateNewFile("0", PckFileType.InfoFile);
zeroFile.Properties.Add("PACKID", packId.ToString());
zeroFile.Properties.Add("PACKVERSION", packVersion.ToString());
zeroFile.AddProperty("PACKID", packId);
zeroFile.AddProperty("PACKVERSION", packVersion);
var locFile = new LOCFile();
locFile.InitializeDefault(packName);
@@ -1234,8 +1240,8 @@ namespace PckStudio
var texturepackInfo = pack.CreateNewFile($"{res}/{res}Info.pck", PckFileType.TexturePackInfoFile);
texturepackInfo.Properties.Add("PACKID", "0");
texturepackInfo.Properties.Add("DATAPATH", $"{res}Data.pck");
texturepackInfo.AddProperty("PACKID", "0");
texturepackInfo.AddProperty("DATAPATH", $"{res}Data.pck");
texturepackInfo.SetData(new PckFileWriter(infoPCK, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian));
@@ -1390,7 +1396,7 @@ namespace PckStudio
//attempts to generate reimportable metadata file out of minefiles metadata
string metaData = "";
foreach (var entry in file.Properties)
foreach (var entry in file.GetProperties())
{
metaData += $"{entry.Key}: {entry.Value}{Environment.NewLine}";
}
@@ -1468,7 +1474,7 @@ namespace PckStudio
{
string[] param = property.Split(':');
if (param.Length < 2) continue;
newFile.Properties.Add((param[0], param[1]));
newFile.AddProperty(param[0], param[1]);
//switch (param[0])
//{
// case "DISPLAYNAMEID":
@@ -1602,7 +1608,7 @@ namespace PckStudio
{
}
mfNew.Properties.Add(new KeyValuePair<string, string>(key, value));
mfNew.AddProperty(key, value);
}
wasModified = true;
}
@@ -1884,7 +1890,7 @@ namespace PckStudio
"File path: " + file.Filename +
"\nAssigned File type: " + (int)file.Filetype + " (" + file.Filetype + ")" +
"\nFile size: " + file.Size +
"\nProperties count: " + file.Properties.Count
"\nProperties count: " + file.PropertyCount
, Path.GetFileName(file.Filename) + " file info");
}
}
@@ -1995,7 +2001,7 @@ namespace PckStudio
int idx = line.IndexOf(' ');
if (idx == -1 || line.Length - 1 == idx)
continue;
file.Properties.Add((line.Substring(0, idx), line.Substring(idx + 1)));
file.AddProperty(line.Substring(0, idx), line.Substring(idx + 1));
}
ReloadMetaTreeView();
RebuildSubPCK(treeViewMain.SelectedNode.FullPath);
@@ -2010,9 +2016,10 @@ namespace PckStudio
if (treeViewMain.SelectedNode.TryGetTagData(out PckFileData file) &&
file.Filetype == PckFileType.SkinFile)
{
foreach (var p in file.Properties.FindAll(s => s.Key == "BOX" || s.Key == "OFFSET"))
foreach (var p in file.GetProperties())
{
file.Properties[file.Properties.IndexOf(p)] = new KeyValuePair<string, string>(p.Key, p.Value.Replace(',', '.'));
if (p.Key == "BOX" || p.Key == "OFFSET")
file.SetProperty(file.GetPropertyIndex(p), new KeyValuePair<string, string>(p.Key, p.Value.Replace(',', '.')));
}
ReloadMetaTreeView();
RebuildSubPCK(treeViewMain.SelectedNode.FullPath);
@@ -2044,18 +2051,18 @@ namespace PckStudio
{
if (treeViewMain.SelectedNode.TryGetTagData(out PckFileData file))
{
var props = file.Properties.Select(p => p.Key + " " + p.Value);
var props = file.GetProperties().Select(p => p.Key + " " + p.Value);
using (var input = new MultiTextPrompt(props.ToArray()))
{
if (input.ShowDialog(this) == DialogResult.OK)
{
file.Properties.Clear();
file.ClearProperties();
foreach (var line in input.TextOutput)
{
int idx = line.IndexOf(' ');
if (idx == -1 || line.Length - 1 == idx)
continue;
file.Properties.Add((line.Substring(0, idx).Replace(":", string.Empty), line.Substring(idx + 1)));
file.AddProperty(line.Substring(0, idx).Replace(":", string.Empty), line.Substring(idx + 1));
}
ReloadMetaTreeView();
RebuildSubPCK(treeViewMain.SelectedNode.FullPath);
@@ -2183,7 +2190,7 @@ namespace PckStudio
using BoxEditor diag = new BoxEditor(SkinBOX.Empty, IsSubPCKNode(treeViewMain.SelectedNode.FullPath));
if (diag.ShowDialog(this) == DialogResult.OK)
{
file.Properties.Add("BOX", diag.Result);
file.AddProperty("BOX", diag.Result);
RebuildSubPCK(treeViewMain.SelectedNode.FullPath);
ReloadMetaTreeView();
wasModified = true;
@@ -2199,7 +2206,7 @@ namespace PckStudio
using ANIMEditor diag = new ANIMEditor(SkinANIM.Empty);
if (diag.ShowDialog(this) == DialogResult.OK)
{
file.Properties.Add("ANIM", diag.ResultAnim);
file.AddProperty("ANIM", diag.ResultAnim);
RebuildSubPCK(treeViewMain.SelectedNode.FullPath);
ReloadMetaTreeView();
wasModified = true;

View File

@@ -133,6 +133,7 @@
<Reference Include="WindowsFormsIntegration" />
</ItemGroup>
<ItemGroup>
<Compile Include="Extensions\LocFileExtensions.cs" />
<Compile Include="Extensions\PckFileDataExtensions.cs" />
<Compile Include="Extensions\TreeNodeExtensions.cs" />
<Compile Include="Helper\AnimationHelper.cs" />

2
Vendor/OMI-Lib vendored