From d29cd353aa5f1cb3673a47e89a21fcf489f16662 Mon Sep 17 00:00:00 2001 From: MattNL Date: Sun, 20 Aug 2023 18:00:38 -0400 Subject: [PATCH 01/36] Fix for incorrect TileData --- PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs b/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs index 35988534..b6e740af 100644 --- a/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs +++ b/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs @@ -38,7 +38,7 @@ namespace PckStudio.Forms.Additional_Popups.Animation private void treeViews_AfterSelect(object sender, TreeViewEventArgs e) { - if (e.Node.Tag is string tileData) + if (e.Node.Name is string tileData) { selectedTile = tileData; Debug.WriteLine(selectedTile); From 143984a5d67961eb9b5a69d3dd22662f74a9d718 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Fri, 25 Aug 2023 12:50:19 +0200 Subject: [PATCH 02/36] Added setting to use a combo box when setting parameter name inside the grf editor --- PCK-Studio/App.config | 3 ++ .../Grf/AddParameter.Designer.cs | 19 +++++++++- .../Additional-Popups/Grf/AddParameter.cs | 36 +++++++++++++++---- PCK-Studio/Forms/AppSettingsForm.Designer.cs | 17 +++++++++ PCK-Studio/Forms/AppSettingsForm.cs | 6 ++++ PCK-Studio/Properties/Settings.Designer.cs | 16 +++++++-- PCK-Studio/Properties/Settings.settings | 3 ++ 7 files changed, 90 insertions(+), 10 deletions(-) diff --git a/PCK-Studio/App.config b/PCK-Studio/App.config index 521fd32a..7140d8a4 100644 --- a/PCK-Studio/App.config +++ b/PCK-Studio/App.config @@ -64,6 +64,9 @@ True + + False + diff --git a/PCK-Studio/Forms/Additional-Popups/Grf/AddParameter.Designer.cs b/PCK-Studio/Forms/Additional-Popups/Grf/AddParameter.Designer.cs index f17df864..78eb47ae 100644 --- a/PCK-Studio/Forms/Additional-Popups/Grf/AddParameter.Designer.cs +++ b/PCK-Studio/Forms/Additional-Popups/Grf/AddParameter.Designer.cs @@ -35,6 +35,7 @@ this.ValueTextBox = new MetroFramework.Controls.MetroTextBox(); this.CancelBtn = new MetroFramework.Controls.MetroButton(); this.ConfirmBtn = new MetroFramework.Controls.MetroButton(); + this.availableComboBox = new MetroFramework.Controls.MetroComboBox(); metroLabel1 = new MetroFramework.Controls.MetroLabel(); metroLabel2 = new MetroFramework.Controls.MetroLabel(); this.SuspendLayout(); @@ -147,12 +148,27 @@ this.ConfirmBtn.UseSelectable = true; this.ConfirmBtn.Click += new System.EventHandler(this.ConfirmButton_Click); // + // availableComboBox + // + this.availableComboBox.FormattingEnabled = true; + this.availableComboBox.ItemHeight = 23; + this.availableComboBox.Location = new System.Drawing.Point(72, 21); + this.availableComboBox.Name = "availableComboBox"; + this.availableComboBox.Size = new System.Drawing.Size(165, 29); + this.availableComboBox.Style = MetroFramework.MetroColorStyle.Silver; + this.availableComboBox.TabIndex = 6; + this.availableComboBox.Theme = MetroFramework.MetroThemeStyle.Dark; + this.availableComboBox.UseSelectable = true; + this.availableComboBox.Visible = false; + this.availableComboBox.SelectedIndexChanged += new System.EventHandler(this.availableComboBox_SelectedIndexChanged); + // // AddParameter // this.AcceptButton = this.ConfirmBtn; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(257, 126); + this.ClientSize = new System.Drawing.Size(264, 126); + this.Controls.Add(this.availableComboBox); this.Controls.Add(this.ConfirmBtn); this.Controls.Add(this.CancelBtn); this.Controls.Add(this.ValueTextBox); @@ -176,5 +192,6 @@ private MetroFramework.Controls.MetroButton CancelBtn; private MetroFramework.Controls.MetroButton ConfirmBtn; private MetroFramework.Controls.MetroTextBox NameTextBox; + private MetroFramework.Controls.MetroComboBox availableComboBox; } } \ No newline at end of file diff --git a/PCK-Studio/Forms/Additional-Popups/Grf/AddParameter.cs b/PCK-Studio/Forms/Additional-Popups/Grf/AddParameter.cs index 620f66ed..36f3884b 100644 --- a/PCK-Studio/Forms/Additional-Popups/Grf/AddParameter.cs +++ b/PCK-Studio/Forms/Additional-Popups/Grf/AddParameter.cs @@ -1,5 +1,7 @@ using System; using System.Windows.Forms; +using OMI.Formats.GameRule; +using PckStudio.Properties; namespace PckStudio.Forms.Additional_Popups.Grf { @@ -7,19 +9,35 @@ namespace PckStudio.Forms.Additional_Popups.Grf { public string ParameterName => NameTextBox.Text; public string ParameterValue => ValueTextBox.Text; + + private bool _useComboBox + { + get + { + return availableComboBox.Visible && !NameTextBox.Visible; + } + set + { + NameTextBox.Visible = !value; + availableComboBox.Visible = value; + } + } + public AddParameter() { InitializeComponent(); + availableComboBox.Items.Clear(); + availableComboBox.Items.AddRange(GameRuleFile.GameRule.ValidParameters); + _useComboBox = Settings.Default.UseComboBoxForGRFParameter; } - public AddParameter(string parameterName, string parameterValue) : this() + + public AddParameter(string parameterName, string parameterValue, bool isKeyReadonly = true) : this() { NameTextBox.Text = parameterName; ValueTextBox.Text = parameterValue; - } - - public AddParameter(string parameterName, string parameterValue, bool parameterNameBoxEnabled = true) : this(parameterName, parameterValue) - { - NameTextBox.Enabled = parameterNameBoxEnabled; + NameTextBox.Enabled = isKeyReadonly; + availableComboBox.Enabled = isKeyReadonly; + availableComboBox.SelectedItem = parameterName; } private void ConfirmButton_Click(object sender, EventArgs e) @@ -30,7 +48,11 @@ namespace PckStudio.Forms.Additional_Popups.Grf return; } DialogResult = DialogResult.OK; - Close(); + } + + private void availableComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + NameTextBox.Text = availableComboBox.SelectedItem.ToString(); } } } diff --git a/PCK-Studio/Forms/AppSettingsForm.Designer.cs b/PCK-Studio/Forms/AppSettingsForm.Designer.cs index e9191a50..d651aef3 100644 --- a/PCK-Studio/Forms/AppSettingsForm.Designer.cs +++ b/PCK-Studio/Forms/AppSettingsForm.Designer.cs @@ -35,6 +35,7 @@ this.autoUpdateCheckBox = new MetroFramework.Controls.MetroCheckBox(); this.autoLoadPckCheckBox = new MetroFramework.Controls.MetroCheckBox(); this.showPresenceCheckBox = new MetroFramework.Controls.MetroCheckBox(); + this.grf_paramKeyComboBoxCheckBox = new MetroFramework.Controls.MetroCheckBox(); this.SuspendLayout(); // // autoSaveCheckBox @@ -114,11 +115,26 @@ this.showPresenceCheckBox.UseSelectable = true; this.showPresenceCheckBox.CheckedChanged += new System.EventHandler(this.showPresenceCheckBox_CheckedChanged); // + // grf_paramKeyComboBoxCheckBox + // + this.grf_paramKeyComboBoxCheckBox.AutoSize = true; + this.grf_paramKeyComboBoxCheckBox.Location = new System.Drawing.Point(23, 169); + this.grf_paramKeyComboBoxCheckBox.Name = "grf_paramKeyComboBoxCheckBox"; + this.grf_paramKeyComboBoxCheckBox.Size = new System.Drawing.Size(100, 15); + this.grf_paramKeyComboBoxCheckBox.Style = MetroFramework.MetroColorStyle.White; + this.grf_paramKeyComboBoxCheckBox.TabIndex = 5; + this.grf_paramKeyComboBoxCheckBox.Text = "Select GRF Key"; + this.grf_paramKeyComboBoxCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; + this.SettingToolTip.SetToolTip(this.grf_paramKeyComboBoxCheckBox, "Use a combobox instead of typing the parameter key name"); + this.grf_paramKeyComboBoxCheckBox.UseSelectable = true; + this.grf_paramKeyComboBoxCheckBox.CheckedChanged += new System.EventHandler(this.grf_paramKeyComboBoxCheckBox_CheckedChanged); + // // AppSettingsForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(527, 270); + this.Controls.Add(this.grf_paramKeyComboBoxCheckBox); this.Controls.Add(this.showPresenceCheckBox); this.Controls.Add(this.autoLoadPckCheckBox); this.Controls.Add(this.autoUpdateCheckBox); @@ -147,5 +163,6 @@ private MetroFramework.Controls.MetroCheckBox autoUpdateCheckBox; private MetroFramework.Controls.MetroCheckBox autoLoadPckCheckBox; private MetroFramework.Controls.MetroCheckBox showPresenceCheckBox; + private MetroFramework.Controls.MetroCheckBox grf_paramKeyComboBoxCheckBox; } } \ No newline at end of file diff --git a/PCK-Studio/Forms/AppSettingsForm.cs b/PCK-Studio/Forms/AppSettingsForm.cs index 53995275..71725fb0 100644 --- a/PCK-Studio/Forms/AppSettingsForm.cs +++ b/PCK-Studio/Forms/AppSettingsForm.cs @@ -40,6 +40,11 @@ namespace PckStudio.Forms Settings.Default.ShowRichPresence = showPresenceCheckBox.Checked; } + private void grf_paramKeyComboBoxCheckBox_CheckedChanged(object sender, EventArgs e) + { + Settings.Default.UseComboBoxForGRFParameter = grf_paramKeyComboBoxCheckBox.Checked; + } + private void LoadCheckboxState(CheckBox checkBox, EventHandler eventHandler, bool state) { checkBox.CheckedChanged -= eventHandler; @@ -53,6 +58,7 @@ namespace PckStudio.Forms LoadCheckboxState(endianCheckBox, endianCheckBox_CheckedChanged, Settings.Default.UseLittleEndianAsDefault); LoadCheckboxState(autoLoadPckCheckBox, autoLoadPckCheckBox_CheckedChanged, Settings.Default.LoadSubPcks); LoadCheckboxState(showPresenceCheckBox, showPresenceCheckBox_CheckedChanged, Settings.Default.ShowRichPresence); + LoadCheckboxState(grf_paramKeyComboBoxCheckBox, grf_paramKeyComboBoxCheckBox_CheckedChanged, Settings.Default.UseComboBoxForGRFParameter); } private void AppBehaviorSettingsForm_FormClosing(object sender, FormClosingEventArgs e) diff --git a/PCK-Studio/Properties/Settings.Designer.cs b/PCK-Studio/Properties/Settings.Designer.cs index c154a761..e6d87129 100644 --- a/PCK-Studio/Properties/Settings.Designer.cs +++ b/PCK-Studio/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace PckStudio.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.5.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.7.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -58,7 +58,7 @@ namespace PckStudio.Properties { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] + [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool LoadSubPcks { get { return ((bool)(this["LoadSubPcks"])); @@ -79,5 +79,17 @@ namespace PckStudio.Properties { this["ShowRichPresence"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool UseComboBoxForGRFParameter { + get { + return ((bool)(this["UseComboBoxForGRFParameter"])); + } + set { + this["UseComboBoxForGRFParameter"] = value; + } + } } } diff --git a/PCK-Studio/Properties/Settings.settings b/PCK-Studio/Properties/Settings.settings index 1bbfe4fc..8724beec 100644 --- a/PCK-Studio/Properties/Settings.settings +++ b/PCK-Studio/Properties/Settings.settings @@ -17,5 +17,8 @@ True + + False + \ No newline at end of file From 01edf96f9c155b147aea5e87666ed13bf30d3dfd Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Fri, 25 Aug 2023 12:51:12 +0200 Subject: [PATCH 03/36] Removed SoundIO.cs and Sounds.cs --- PCK-Studio/Classes/IO/Sounds/SoundIO.cs | 26 ------------------------- PCK-Studio/Classes/IO/Sounds/Sounds.cs | 21 -------------------- 2 files changed, 47 deletions(-) delete mode 100644 PCK-Studio/Classes/IO/Sounds/SoundIO.cs delete mode 100644 PCK-Studio/Classes/IO/Sounds/Sounds.cs diff --git a/PCK-Studio/Classes/IO/Sounds/SoundIO.cs b/PCK-Studio/Classes/IO/Sounds/SoundIO.cs deleted file mode 100644 index a66f2907..00000000 --- a/PCK-Studio/Classes/IO/Sounds/SoundIO.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.IO; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Newtonsoft.Json; - -namespace PckStudio.Classes.IO.Sounds -{ - public class SoundIO - { - public Dictionary Read(string Filepath) - { - var jObj = (Newtonsoft.Json.Linq.JObject)JsonConvert.DeserializeObject(File.ReadAllText(Filepath)); - var dict = JsonConvert.DeserializeObject>(jObj.ToString()); - - return dict; - } - - public string Serialize(Dictionary input) - { - return JsonConvert.SerializeObject(input, Formatting.Indented); - } - } -} diff --git a/PCK-Studio/Classes/IO/Sounds/Sounds.cs b/PCK-Studio/Classes/IO/Sounds/Sounds.cs deleted file mode 100644 index b5350b69..00000000 --- a/PCK-Studio/Classes/IO/Sounds/Sounds.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace PckStudio.Classes.IO.Sounds -{ - public class SoundInfo - { - public bool replace { get; set; } - public List sounds = new List(); - } - - public class Sound - { - public string name { get; set; } - public string type { get; set; } - public bool stream { get; set; } - } -} From 9faaf65601987a6e4fcbe0e28ab6b8e283a90059 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Fri, 25 Aug 2023 12:51:49 +0200 Subject: [PATCH 04/36] Updated ChangeTile.cs --- .../Additional-Popups/Animation/ChangeTile.cs | 51 ++++++++----------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs b/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs index b6e740af..0c54fe5f 100644 --- a/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs +++ b/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs @@ -31,16 +31,16 @@ namespace PckStudio.Forms.Additional_Popups.Animation private void InitializeTreeviews() { Profiler.Start(); - GetTileDataToView("blocks", treeViewBlocks.Nodes, treeViewBlockCache.Add); - GetTileDataToView("items", treeViewItems.Nodes, treeViewItemCache.Add); + GetTileDataToView(Internal.Animation.AnimationCategory.Blocks, treeViewBlocks.Nodes, treeViewBlockCache.Add); + GetTileDataToView(Internal.Animation.AnimationCategory.Items, treeViewItems.Nodes, treeViewItemCache.Add); Profiler.Stop(); } private void treeViews_AfterSelect(object sender, TreeViewEventArgs e) { - if (e.Node.Name is string tileData) + if (e.Node.Tag is JsonTileInfo tileData) { - selectedTile = tileData; + selectedTile = tileData.InternalName; Debug.WriteLine(selectedTile); category = e.Node.TreeView == treeViewItems ? Internal.Animation.AnimationCategory.Items @@ -48,40 +48,29 @@ namespace PckStudio.Forms.Additional_Popups.Animation } } - private void GetTileDataToView(string key, TreeNodeCollection collection, Action additinalAction) + private void GetTileDataToView(Internal.Animation.AnimationCategory key, TreeNodeCollection collection, Action additinalAction) { List textureInfos = key switch { - "blocks" => Tiles.BlockTileInfos, - "items" => Tiles.ItemTileInfos, - _ => throw new InvalidOperationException(key) + Internal.Animation.AnimationCategory.Blocks => Tiles.BlockTileInfos, + Internal.Animation.AnimationCategory.Items => Tiles.ItemTileInfos, + _ => throw new InvalidOperationException(nameof(key)) }; Profiler.Start(); - try + if (textureInfos is not null) { - if (textureInfos is not null) - { - foreach ((int i, var content) in textureInfos.enumerate()) + foreach ((int i, var content) in textureInfos.enumerate()) + { + if (string.IsNullOrEmpty(content.InternalName) || collection.ContainsKey(content.InternalName)) + continue; + TreeNode tileNode = new TreeNode(content.DisplayName, i, i) { - if (!string.IsNullOrEmpty(content.InternalName) && !collection.ContainsKey(content.InternalName)) - { - TreeNode tileNode = new TreeNode(content.DisplayName) - { - Name = content.InternalName, - Tag = content.DisplayName, - ImageIndex = i, - SelectedImageIndex = i, - }; - collection.Add(tileNode); - additinalAction(tileNode); - } - } - } - } - catch (Newtonsoft.Json.JsonException j_ex) - { - MessageBox.Show(j_ex.Message, "Error"); - return; + Name = content.InternalName, + Tag = content + }; + collection.Add(tileNode); + additinalAction(tileNode); + } } Profiler.Stop(); } From 9c357d151aa34158df71bff1f6d251bad49e72f3 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Fri, 25 Aug 2023 12:56:22 +0200 Subject: [PATCH 05/36] Updated Animation API and added AnimationHelper --- PCK-Studio/Forms/Editor/AnimationEditor.cs | 196 ++++++------------ PCK-Studio/Forms/Editor/TextureAtlasEditor.cs | 33 ++- PCK-Studio/Forms/Utilities/PckCenterBeta.cs | 3 - PCK-Studio/Helper/AnimationHelper.cs | 89 ++++++++ PCK-Studio/Internal/Animation.cs | 32 ++- PCK-Studio/MainForm.cs | 18 +- PCK-Studio/PckStudio.csproj | 3 +- 7 files changed, 207 insertions(+), 167 deletions(-) create mode 100644 PCK-Studio/Helper/AnimationHelper.cs diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.cs b/PCK-Studio/Forms/Editor/AnimationEditor.cs index 91c6025d..9a669606 100644 --- a/PCK-Studio/Forms/Editor/AnimationEditor.cs +++ b/PCK-Studio/Forms/Editor/AnimationEditor.cs @@ -24,10 +24,9 @@ namespace PckStudio.Forms.Editor { public partial class AnimationEditor : MetroForm { - private PckFile.FileData animationFile; - private Animation currentAnimation; + private Animation _animation; - private string TileName = string.Empty; + private string _tileName = string.Empty; private bool IsSpecialTile(string tileName) { @@ -40,81 +39,56 @@ namespace PckStudio.Forms.Editor toolStripSeparator1.Visible = saveToolStripMenuItem1.Visible = !Settings.Default.AutoSaveChanges; } - internal AnimationEditor(Animation animation, string tileName) + internal AnimationEditor(Animation animation, string name) : this() { - currentAnimation = animation; - TileName = tileName; + _ = animation ?? throw new ArgumentNullException(nameof(animation)); + _animation = animation; + _tileName = name; } - public AnimationEditor(PckFile.FileData file) - : this() + internal AnimationEditor(Animation animation, string name, Color blendColor) + : this(animation, name) { - animationFile = file; - TileName = Path.GetFileNameWithoutExtension(animationFile.Filename); - } - - public AnimationEditor(PckFile.FileData file, Color blendColor) - : this(file) - { animationPictureBox.UseBlendColor = true; animationPictureBox.BlendColor = blendColor; } - private void AnimationEditor_Load(object sender, EventArgs e) { bulkAnimationSpeedToolStripMenuItem.Enabled = importToolStripMenuItem.Enabled = exportAsToolStripMenuItem.Enabled = - InterpolationCheckbox.Visible = !IsSpecialTile(TileName); + InterpolationCheckbox.Visible = !IsSpecialTile(_tileName); - if (currentAnimation is null) - CreateAnimation(); SetTileLabel(); LoadAnimationTreeView(); } - private void CreateAnimation() - { - currentAnimation = new Animation(Array.Empty()); - if (animationFile is not null && animationFile.Size > 0) - { - var texture = animationFile.GetTexture(); - var frameTextures = texture.Split(ImageLayoutDirection.Vertical); - currentAnimation = animationFile.Properties.HasProperty("ANIM") - ? new Animation(frameTextures, animationFile.Properties.GetPropertyValue("ANIM")) - : new Animation(frameTextures, string.Empty); - } - currentAnimation.Category = animationFile.Filename.Split('/').Contains("items") - ? Animation.AnimationCategory.Items - : Animation.AnimationCategory.Blocks; - } - private void LoadAnimationTreeView() { - if (currentAnimation is null) + if (_animation is null) { AnimationStartStopBtn.Enabled = false; return; } AnimationStartStopBtn.Enabled = true; - InterpolationCheckbox.Checked = currentAnimation.Interpolate; + InterpolationCheckbox.Checked = _animation.Interpolate; frameTreeView.Nodes.Clear(); TextureIcons.Images.Clear(); - TextureIcons.Images.AddRange(currentAnimation.GetTextures().ToArray()); - foreach (var frame in currentAnimation.GetFrames()) + TextureIcons.Images.AddRange(_animation.GetTextures().ToArray()); + foreach (var frame in _animation.GetFrames()) { - var imageIndex = currentAnimation.GetTextureIndex(frame.Texture); + var imageIndex = _animation.GetTextureIndex(frame.Texture); frameTreeView.Nodes.Add(new TreeNode($"for {frame.Ticks} ticks") { ImageIndex = imageIndex, SelectedImageIndex = imageIndex, }); } - if (currentAnimation.FrameCount > 0) + if (_animation.FrameCount > 0) { - animationPictureBox.SelectFrame(currentAnimation, 0); + animationPictureBox.SelectFrame(_animation, 0); } } @@ -122,7 +96,7 @@ namespace PckStudio.Forms.Editor { if (animationPictureBox.IsPlaying) AnimationStartStopBtn.Text = "Play Animation"; - animationPictureBox.SelectFrame(currentAnimation, frameTreeView.SelectedNode.Index); + animationPictureBox.SelectFrame(_animation, frameTreeView.SelectedNode.Index); } private void AnimationStartStopBtn_Click(object sender, EventArgs e) @@ -133,9 +107,9 @@ namespace PckStudio.Forms.Editor AnimationStartStopBtn.Text = "Play Animation"; return; } - if (currentAnimation.FrameCount > 1) + if (_animation.FrameCount > 1) { - animationPictureBox.Start(currentAnimation); + animationPictureBox.Start(_animation); AnimationStartStopBtn.Text = "Stop Animation"; } } @@ -158,13 +132,8 @@ namespace PckStudio.Forms.Editor private void saveToolStripMenuItem1_Click(object sender, EventArgs e) { - if (!IsSpecialTile(TileName) && currentAnimation is not null && animationFile is not null) + if (!IsSpecialTile(_tileName) && _animation is not null) { - string anim = currentAnimation.BuildAnim(); - animationFile.Properties.SetProperty("ANIM", anim); - var texture = currentAnimation.BuildTexture(); - animationFile.SetData(texture, ImageFormat.Png); - animationFile.Filename = $"res/textures/{currentAnimation.CategoryString}/{TileName}.png"; DialogResult = DialogResult.OK; return; } @@ -228,7 +197,7 @@ namespace PckStudio.Forms.Editor { int draggedIndex = draggedNode.Index; int targetIndex = targetNode.Index; - currentAnimation.GetFrames().Swap(draggedIndex, targetIndex); + _animation.SwapFrames(draggedIndex, targetIndex); LoadAnimationTreeView(); } } @@ -250,8 +219,8 @@ namespace PckStudio.Forms.Editor private void treeView1_doubleClick(object sender, EventArgs e) { - var frame = currentAnimation.GetFrame(frameTreeView.SelectedNode.Index); - using FrameEditor diag = new FrameEditor(frame.Ticks, currentAnimation.GetTextureIndex(frame.Texture), TextureIcons); + var frame = _animation.GetFrame(frameTreeView.SelectedNode.Index); + using FrameEditor diag = new FrameEditor(frame.Ticks, _animation.GetTextureIndex(frame.Texture), TextureIcons); if (diag.ShowDialog(this) == DialogResult.OK) { /* Found a bug here. When passing the frame variable, @@ -261,7 +230,7 @@ namespace PckStudio.Forms.Editor * - Matt */ - currentAnimation.SetFrame(frameTreeView.SelectedNode.Index, diag.FrameTextureIndex, diag.FrameTime); + _animation.SetFrame(frameTreeView.SelectedNode.Index, diag.FrameTextureIndex, diag.FrameTime); LoadAnimationTreeView(); } } @@ -272,7 +241,7 @@ namespace PckStudio.Forms.Editor diag.SaveBtn.Text = "Add"; if (diag.ShowDialog(this) == DialogResult.OK) { - currentAnimation.AddFrame(diag.FrameTextureIndex, TileName == "clock" || TileName == "compass" ? 1 : diag.FrameTime); + _animation.AddFrame(diag.FrameTextureIndex, IsSpecialTile(_tileName) ? Animation.MinimumFrameTime : diag.FrameTime); LoadAnimationTreeView(); } } @@ -280,7 +249,7 @@ namespace PckStudio.Forms.Editor private void removeFrameToolStripMenuItem_Click(object sender, EventArgs e) { if (frameTreeView.SelectedNode is TreeNode t && - currentAnimation.RemoveFrame(t.Index)) + _animation.RemoveFrame(t.Index)) frameTreeView.SelectedNode.Remove(); } @@ -290,7 +259,9 @@ namespace PckStudio.Forms.Editor SetBulkSpeed diag = new SetBulkSpeed(); if (diag.ShowDialog(this) == DialogResult.OK) { - currentAnimation.GetFrames().ForEach(frame => frame.Ticks = diag.Ticks); + if (animationPictureBox.IsPlaying) + animationPictureBox.Stop(); + _animation.SetFrameTicks(diag.Ticks); LoadAnimationTreeView(); } diag.Dispose(); @@ -324,51 +295,13 @@ namespace PckStudio.Forms.Editor MessageBox.Show(textureFile + " was not found", "Texture not found"); return; } - var textures = Image.FromFile(textureFile).Split(ImageLayoutDirection.Vertical); - var new_animation = new Animation(textures); - new_animation.Category = currentAnimation.Category; try { + var img = Image.FromFile(textureFile); JObject mcmeta = JObject.Parse(File.ReadAllText(fileDialog.FileName)); - if (mcmeta["animation"] is JToken animation) - { - int frameTime = Animation.MinimumFrameTime; - // Some if statements to ensure that the animation is valid. - if (animation["frametime"] is JToken frametime_token && frametime_token.Type == JTokenType.Integer) - frameTime = (int)frametime_token; - if (animation["interpolate"] is JToken interpolate_token && interpolate_token.Type == JTokenType.Boolean) - new_animation.Interpolate = (bool)interpolate_token; - if (animation["frames"] is JToken frames_token && - frames_token.Type == JTokenType.Array) - { - foreach (JToken frame in frames_token.Children()) - { - if (frame.Type == JTokenType.Object) - { - if (frame["index"] is JToken frame_index && frame_index.Type == JTokenType.Integer && - frame["time"] is JToken frame_time && frame_time.Type == JTokenType.Integer) - { - Debug.WriteLine("{0}*{1}", (int)frame["index"], (int)frame["time"]); - new_animation.AddFrame((int)frame["index"], (int)frame["time"]); - } - } - else if (frame.Type == JTokenType.Integer) - { - Debug.WriteLine("{0}*{1}", (int)frame, frameTime); - new_animation.AddFrame((int)frame, frameTime); - } - } - } - else - { - for (int i = 0; i < new_animation.TextureCount; i++) - { - new_animation.AddFrame(i, frameTime); - } - } - } - - currentAnimation = new_animation; + Animation javaAnimation = AnimationHelper.GetAnimationFromJavaAnimation(mcmeta, img); + javaAnimation.Category = _animation.Category; + _animation = javaAnimation; LoadAnimationTreeView(); } catch (JsonException j_ex) @@ -381,16 +314,18 @@ namespace PckStudio.Forms.Editor private void changeTileToolStripMenuItem_Click(object sender, EventArgs e) { using (ChangeTile diag = new ChangeTile()) - if (diag.ShowDialog(this) == DialogResult.OK) { + if (diag.ShowDialog(this) != DialogResult.OK) + return; + Debug.WriteLine(diag.SelectedTile); - currentAnimation.Category = diag.Category; - TileName = diag.SelectedTile; + _animation.Category = diag.Category; + _tileName = diag.SelectedTile; bulkAnimationSpeedToolStripMenuItem.Enabled = importToolStripMenuItem.Enabled = exportAsToolStripMenuItem.Enabled = - InterpolationCheckbox.Visible = !IsSpecialTile(TileName); + InterpolationCheckbox.Visible = !IsSpecialTile(_tileName); SetTileLabel(); } @@ -398,31 +333,26 @@ namespace PckStudio.Forms.Editor private void SetTileLabel() { - var textureInfos = currentAnimation.Category switch + var textureInfos = _animation.Category switch { Animation.AnimationCategory.Blocks => Tiles.BlockTileInfos, Animation.AnimationCategory.Items => Tiles.ItemTileInfos, - _ => throw new ArgumentOutOfRangeException(currentAnimation.Category.ToString()) + _ => throw new ArgumentOutOfRangeException(_animation.Category.ToString()) }; + tileLabel.Text = textureInfos.FirstOrDefault(p => p.InternalName == _tileName)?.DisplayName ?? _tileName; - if (textureInfos.FirstOrDefault(p => p.InternalName == TileName) is JsonTileInfo textureInfo) - { - tileLabel.Text = textureInfo.DisplayName; - return; - } - - switch (MessageBox.Show(this, - $"{TileName} is not a valid tile for animation, and will not play in game. Would you like to choose a new tile?", - "Not a valid tile", - MessageBoxButtons.YesNo)) - { - case DialogResult.Yes: - changeTileToolStripMenuItem_Click(null, EventArgs.Empty); - break; - default: - DialogResult = DialogResult.Abort; - break; - } + //switch (MessageBox.Show(this, + // $"{TileName} is not a valid tile for animation, and will not play in game. Would you like to choose a new tile?", + // "Not a valid tile", + // MessageBoxButtons.YesNo)) + //{ + // case DialogResult.Yes: + // changeTileToolStripMenuItem_Click(null, EventArgs.Empty); + // break; + // default: + // DialogResult = DialogResult.Abort; + // break; + //} } private void exportJavaAnimationToolStripMenuItem_Click(object sender, EventArgs e) @@ -432,13 +362,15 @@ namespace PckStudio.Forms.Editor fileDialog.Filter = "Animation Scripts (*.mcmeta)|*.png.mcmeta"; if (fileDialog.ShowDialog(this) == DialogResult.OK) { - JObject mcmeta = currentAnimation.ConvertToJavaAnimation(); + JObject mcmeta = _animation.ConvertToJavaAnimation(); string jsondata = JsonConvert.SerializeObject(mcmeta, Formatting.Indented); string filename = fileDialog.FileName; File.WriteAllText(filename, jsondata); - var finalTexture = currentAnimation.BuildTexture(); - finalTexture.Save(Path.Combine(Path.GetDirectoryName(filename), Path.GetFileNameWithoutExtension(filename))); // removes ".mcmeta" from filename! - MessageBox.Show("Animation was successfully exported to " + filename, "Export successful!"); + var finalTexture = _animation.BuildTexture(); + // removes ".mcmeta" from filename + string texturePath = Path.Combine(Path.GetDirectoryName(filename), Path.GetFileNameWithoutExtension(filename)); + finalTexture.Save(texturePath); + MessageBox.Show("Animation was successfully exported as " + Path.GetFileName(filename), "Export successful!"); } } @@ -466,8 +398,8 @@ namespace PckStudio.Forms.Editor private void InterpolationCheckbox_CheckedChanged(object sender, EventArgs e) { - if (currentAnimation is not null) - currentAnimation.Interpolate = InterpolationCheckbox.Checked; + if (_animation is not null) + _animation.Interpolate = InterpolationCheckbox.Checked; } private void AnimationEditor_FormClosing(object sender, FormClosingEventArgs e) @@ -508,7 +440,7 @@ namespace PckStudio.Forms.Editor gif.SelectActiveFrame(dimension, i); textures.Add(new Bitmap(gif)); } - currentAnimation = new Animation(textures, string.Empty); + _animation = new Animation(textures, string.Empty); LoadAnimationTreeView(); } @@ -523,7 +455,7 @@ namespace PckStudio.Forms.Editor return; Image img = Image.FromFile(ofd.FileName); var textures = img.Split(ImageLayoutDirection.Vertical); - currentAnimation = new Animation(textures, string.Empty); + _animation = new Animation(textures, string.Empty); LoadAnimationTreeView(); } diff --git a/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs b/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs index a35b9cc1..a8743487 100644 --- a/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs +++ b/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs @@ -137,7 +137,7 @@ namespace PckStudio.Forms.Editor if (_tiles is null || !_tiles.IndexInRange(index) || (_selectedTile = _tiles[index]) is null) return; - if(String.IsNullOrEmpty(_selectedTile.Tile.DisplayName)) + if(string.IsNullOrEmpty(_selectedTile.Tile.DisplayName)) { // changes the selected tile to the base flowing tile (carries all properties over) - Matt _selectedTile = _tiles.Find(t => t.Tile.InternalName == _selectedTile.Tile.InternalName); @@ -156,10 +156,7 @@ namespace PckStudio.Forms.Editor hasAnimation && animationFile.Size > 0) { - using var ms = new MemoryStream(animationFile.Data); - var img = Image.FromStream(ms); - var textures = img.Split(ImageLayoutDirection.Vertical); - var animation = new Internal.Animation(textures, animationFile.Properties.GetPropertyValue("ANIM")); + var animation = AnimationHelper.GetAnimationFromFile(animationFile); selectTilePictureBox.Start(animation); return; } @@ -292,15 +289,6 @@ namespace PckStudio.Forms.Editor originalPictureBox.Invalidate(); } - private void ApplyBlend(string colorKey, Image image) - { - if (variantComboBox.Enabled = _selectedTile.Tile.ColourEntry.Variants.Length > 1) - { - selectTilePictureBox.BlendColor = FindBlendColorByKey(colorKey); - selectTilePictureBox.Image = image; - } - } - private Color GetBlendColor() { if (_selectedTile.Tile.HasColourEntry && _selectedTile.Tile.ColourEntry is not null) @@ -415,8 +403,17 @@ namespace PckStudio.Forms.Editor file = new PckFile.FileData($"res/textures/{_atlasType}/{_selectedTile.Tile.InternalName}.png", PckFile.FileData.FileType.TextureFile); } - var animationEditor = new AnimationEditor(file, GetBlendColor()); - if (animationEditor.ShowDialog() == DialogResult.OK && isNewFile) + var animation = AnimationHelper.GetAnimationFromFile(file); + + var animationEditor = new AnimationEditor(animation, _selectedTile.Tile.InternalName, GetBlendColor()); + if (animationEditor.ShowDialog() != DialogResult.OK) + { + return; + } + + AnimationHelper.SaveAnimationToFile(file, animation); + + if (isNewFile) { _pckFile.Files.Add(file); } @@ -440,7 +437,9 @@ namespace PckStudio.Forms.Editor if (_selectedTile.Tile.ColourEntry is not null && _selectedTile.Tile.ColourEntry.Variants.IndexInRange(variantComboBox.SelectedIndex)) { - ApplyBlend(_selectedTile.Tile.ColourEntry.Variants[variantComboBox.SelectedIndex], _selectedTile.Texture); + string colorKey = _selectedTile.Tile.ColourEntry.Variants[variantComboBox.SelectedIndex]; + selectTilePictureBox.BlendColor = FindBlendColorByKey(colorKey); + selectTilePictureBox.Image = _selectedTile.Texture; } } diff --git a/PCK-Studio/Forms/Utilities/PckCenterBeta.cs b/PCK-Studio/Forms/Utilities/PckCenterBeta.cs index d96eab9b..a5f68a1d 100644 --- a/PCK-Studio/Forms/Utilities/PckCenterBeta.cs +++ b/PCK-Studio/Forms/Utilities/PckCenterBeta.cs @@ -11,9 +11,6 @@ using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Media.Imaging; using MetroFramework.Forms; -using PckStudio.Classes.Misc; -using PckStudio.Classes.Networking; -using PckStudio.Classes.IO; using PckStudio.API.PCKCenter.model; using PckStudio.API.PCKCenter; diff --git a/PCK-Studio/Helper/AnimationHelper.cs b/PCK-Studio/Helper/AnimationHelper.cs new file mode 100644 index 00000000..5460d9a1 --- /dev/null +++ b/PCK-Studio/Helper/AnimationHelper.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json.Linq; +using OMI.Formats.Pck; +using PckStudio.Extensions; +using PckStudio.Internal; + +namespace PckStudio.Helper +{ + internal static class AnimationHelper + { + internal static void SaveAnimationToFile(PckFile.FileData file, Animation animation) + { + string anim = animation.BuildAnim(); + file.Properties.SetProperty("ANIM", anim); + var texture = animation.BuildTexture(); + file.SetData(texture, ImageFormat.Png); + } + + internal static Animation GetAnimationFromFile(PckFile.FileData file) + { + _ = file ?? throw new ArgumentNullException(nameof(file)); + if (file.Size > 0) + { + var texture = file.GetTexture(); + var frameTextures = texture.Split(ImageLayoutDirection.Vertical); + var _animation = new Animation(frameTextures, file.Properties.GetPropertyValue("ANIM")); + _animation.Category = file.Filename.Split('/').Contains("items") + ? Animation.AnimationCategory.Items + : Animation.AnimationCategory.Blocks; + return _animation; + } + return Animation.Empty(file.Filename.Split('/').Contains("items") + ? Animation.AnimationCategory.Items + : Animation.AnimationCategory.Blocks); + } + + internal static Animation GetAnimationFromJavaAnimation(JObject jsonObject, Image texture) + { + var textures = texture.Split(ImageLayoutDirection.Vertical); + Animation result = new Animation(textures); + if (jsonObject["animation"] is not JToken animation) + return result; + + int frameTime = Animation.MinimumFrameTime; + + if (animation["frametime"] is JToken frametime_token && frametime_token.Type == JTokenType.Integer) + frameTime = (int)frametime_token; + + if (animation["interpolate"] is JToken interpolate_token && interpolate_token.Type == JTokenType.Boolean) + result.Interpolate = (bool)interpolate_token; + + if (animation["frames"] is JToken frames_token && frames_token.Type == JTokenType.Array) + { + foreach (JToken frame in frames_token.Children()) + { + if (frame.Type == JTokenType.Object && + frame["index"] is JToken frame_index && + frame_index.Type == JTokenType.Integer && + frame["time"] is JToken frame_time && + frame_time.Type == JTokenType.Integer) + { + Debug.WriteLine("Index: {0}, Time: {1}", frame_index, frame_time); + result.AddFrame((int)frame_index, (int)frame_time); + } + else if (frame.Type == JTokenType.Integer) + { + Debug.WriteLine("Index: {0}, Time: {1}", frame, frameTime); + result.AddFrame((int)frame, frameTime); + } + } + return result; + } + + for (int i = 0; i < result.TextureCount; i++) + { + result.AddFrame(i, frameTime); + } + + return result; + } + } +} diff --git a/PCK-Studio/Internal/Animation.cs b/PCK-Studio/Internal/Animation.cs index 4d9c972b..5d12a5b0 100644 --- a/PCK-Studio/Internal/Animation.cs +++ b/PCK-Studio/Internal/Animation.cs @@ -20,6 +20,7 @@ using System.Collections.Generic; using System.Drawing; using PckStudio.Extensions; using System.Text; +using System.Collections.ObjectModel; namespace PckStudio.Internal { @@ -27,6 +28,13 @@ namespace PckStudio.Internal { public const int MinimumFrameTime = 1; + public static Animation Empty(AnimationCategory category) + { + var animation = new Animation(Array.Empty(), string.Empty); + animation.Category = category; + return animation; + } + public int FrameCount => frames.Count; public int TextureCount => textures.Count; @@ -55,8 +63,7 @@ namespace PckStudio.Internal private readonly List textures; - private readonly List frames = new List(); - + private readonly IList frames = new List(); public Animation(IEnumerable textures) { @@ -149,12 +156,12 @@ namespace PckStudio.Internal public Frame GetFrame(int index) => frames[index]; - public List GetFrames() + public IReadOnlyCollection GetFrames() { - return frames; + return new ReadOnlyCollection(frames); } - public List GetTextures() + public IReadOnlyCollection GetTextures() { return textures; } @@ -191,5 +198,18 @@ namespace PckStudio.Internal return textures.Combine(ImageLayoutDirection.Vertical); } - } + + internal void SetFrameTicks(int ticks) + { + foreach (var frame in frames) + { + frame.Ticks = ticks; + } + } + + internal void SwapFrames(int sourceIndex, int destinationIndex) + { + frames.Swap(sourceIndex, destinationIndex); + } + } } diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index c1beb9fb..7c09e1ce 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -383,18 +383,19 @@ namespace PckStudio return; } - if (file.Filename.StartsWith("res/textures/blocks/") || file.Filename.StartsWith("res/textures/items/")) - { - using (AnimationEditor animationEditor = new AnimationEditor(file)) + if (!file.Filename.StartsWith("res/textures/blocks/") && !file.Filename.StartsWith("res/textures/items/")) + return; + var animation = AnimationHelper.GetAnimationFromFile(file); + using (AnimationEditor animationEditor = new AnimationEditor(animation, Path.GetFileNameWithoutExtension(file.Filename))) { if (animationEditor.ShowDialog(this) == DialogResult.OK) { wasModified = true; + AnimationHelper.SaveAnimationToFile(file, animation); BuildMainTreeView(); } } } - } private void HandleGameRuleFile(PckFile.FileData file) { @@ -565,7 +566,7 @@ namespace PckStudio File.WriteAllBytes(extractFilePath, file.Data); if (file.Properties.Count > 0) { - using var fs = File.CreateText($"{extractFilePath}.txt"); + using var fs = File.CreateText($"{extractFilePath}.txt"); file.Properties.ForEach(property => fs.WriteLine($"{property.Key}: {property.Value}")); } // Verification that file extraction path was successful @@ -853,11 +854,14 @@ namespace PckStudio $"res/textures/{Animation.GetCategoryName(diag.Category)}/{diag.SelectedTile}.png", PckFile.FileData.FileType.TextureFile); - using AnimationEditor animationEditor = new AnimationEditor(file); + var animation = AnimationHelper.GetAnimationFromFile(file); + + using AnimationEditor animationEditor = new AnimationEditor(animation, diag.SelectedTile); if (animationEditor.ShowDialog() == DialogResult.OK) { wasModified = true; - currentPCK.Files.Add(file); + AnimationHelper.SaveAnimationToFile(file, animation); + currentPCK.Files.Add(file); BuildMainTreeView(); ReloadMetaTreeView(); } diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index 305bda5d..a5b0ac35 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -133,6 +133,7 @@ + Component @@ -185,8 +186,6 @@ - - From 8817ae9fc1011e569c66135bf1d4c3a863cd53ba Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Fri, 25 Aug 2023 12:57:14 +0200 Subject: [PATCH 06/36] AnimationEditor - Added Copyright notice --- PCK-Studio/Forms/Editor/AnimationEditor.cs | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.cs b/PCK-Studio/Forms/Editor/AnimationEditor.cs index 9a669606..b5236c60 100644 --- a/PCK-Studio/Forms/Editor/AnimationEditor.cs +++ b/PCK-Studio/Forms/Editor/AnimationEditor.cs @@ -1,4 +1,21 @@ -using System; +/* Copyright (c) 2023-present miku-666, MattNL + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; @@ -11,8 +28,6 @@ using MetroFramework.Forms; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -using OMI.Formats.Pck; - using PckStudio.Forms.Additional_Popups.Animation; using PckStudio.Extensions; using PckStudio.Properties; From 939a8b57da2564d7ee5601a308074772cb222f67 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Fri, 25 Aug 2023 12:57:57 +0200 Subject: [PATCH 07/36] EnumerableExtensions - Added EqualsAny extension --- PCK-Studio/Extensions/EnumerableExtensions.cs | 10 ++++++++++ PCK-Studio/Forms/Editor/AnimationEditor.cs | 6 ++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/PCK-Studio/Extensions/EnumerableExtensions.cs b/PCK-Studio/Extensions/EnumerableExtensions.cs index 44f18f28..2608b500 100644 --- a/PCK-Studio/Extensions/EnumerableExtensions.cs +++ b/PCK-Studio/Extensions/EnumerableExtensions.cs @@ -15,6 +15,16 @@ namespace PckStudio.Extensions yield break; } + public static bool EqualsAny(this T type, params T[] items) + { + foreach (var item in items) + { + if (item.Equals(type)) + return true; + } + return false; + } + public static bool ContainsAny(this IEnumerable array, params T[] items) { foreach (var item in array) diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.cs b/PCK-Studio/Forms/Editor/AnimationEditor.cs index b5236c60..a2e17386 100644 --- a/PCK-Studio/Forms/Editor/AnimationEditor.cs +++ b/PCK-Studio/Forms/Editor/AnimationEditor.cs @@ -43,9 +43,11 @@ namespace PckStudio.Forms.Editor private string _tileName = string.Empty; - private bool IsSpecialTile(string tileName) + private static readonly string[] specialTileNames = { "clock", "compass" }; + + private static bool IsSpecialTile(string name) { - return tileName == "clock" || tileName == "compass"; + return name.ToLower().EqualsAny(specialTileNames); } private AnimationEditor() From 4978e111b15fe0dc309c21ce2a09525fe3f74873 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Fri, 25 Aug 2023 13:01:34 +0200 Subject: [PATCH 08/36] PckFileDataExtensions - Improved GetTexture extension --- PCK-Studio/Extensions/PckFileDataExtensions.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/PCK-Studio/Extensions/PckFileDataExtensions.cs b/PCK-Studio/Extensions/PckFileDataExtensions.cs index c781b3a5..0c2f4bc9 100644 --- a/PCK-Studio/Extensions/PckFileDataExtensions.cs +++ b/PCK-Studio/Extensions/PckFileDataExtensions.cs @@ -16,27 +16,29 @@ namespace PckStudio.Extensions { private const string MipMap = "MipMapLevel"; + private static Image EmptyImage = new Bitmap(1, 1, PixelFormat.Format32bppArgb); + internal static Image GetTexture(this PckFile.FileData file) { if (file.Filetype != PckFile.FileData.FileType.SkinFile && file.Filetype != PckFile.FileData.FileType.CapeFile && file.Filetype != PckFile.FileData.FileType.TextureFile) { - return null; + throw new Exception("File is not suitable to contain image data."); } - Image image = null; using (var stream = new MemoryStream(file.Data)) { try { - image = Image.FromStream(stream); + return Image.FromStream(stream); } catch(Exception ex) { + Trace.WriteLine($"Failed to read image from pck file data({file.Filename}).", category: nameof(PckFileDataExtensions) + "." + nameof(GetTexture)); Debug.WriteLine(ex.Message); + return EmptyImage; } } - return image; } internal static void SetData(this PckFile.FileData file, IDataFormatWriter writer) @@ -54,8 +56,7 @@ namespace PckStudio.Extensions file.Filetype != PckFile.FileData.FileType.CapeFile && file.Filetype != PckFile.FileData.FileType.TextureFile) { - Debug.WriteLine($"{file.Filename} can't contain image data"); - return; + throw new Exception("File is not suitable to contain image data."); } using (var stream = new MemoryStream()) From 871261e43d7593f180637489e99ecc26d0b65195 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Fri, 25 Aug 2023 13:10:56 +0200 Subject: [PATCH 09/36] Moved AnimationCategory into its own file --- .../Additional-Popups/Animation/ChangeTile.cs | 18 ++++++------- PCK-Studio/Forms/Editor/AnimationEditor.cs | 4 +-- PCK-Studio/Helper/AnimationHelper.cs | 8 +++--- PCK-Studio/Internal/Animation.cs | 7 +---- PCK-Studio/Internal/AnimationCategory.cs | 26 +++++++++++++++++++ PCK-Studio/PckStudio.csproj | 1 + 6 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 PCK-Studio/Internal/AnimationCategory.cs diff --git a/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs b/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs index 0c54fe5f..0bef8b08 100644 --- a/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs +++ b/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs @@ -12,10 +12,10 @@ namespace PckStudio.Forms.Additional_Popups.Animation internal partial class ChangeTile : MetroForm { string selectedTile = ""; - Internal.Animation.AnimationCategory category = Internal.Animation.AnimationCategory.Blocks; + Internal.AnimationCategory category = Internal.AnimationCategory.Blocks; public string SelectedTile => selectedTile; - public Internal.Animation.AnimationCategory Category => category; + public Internal.AnimationCategory Category => category; List treeViewBlockCache = new List(); List treeViewItemCache = new List(); @@ -31,8 +31,8 @@ namespace PckStudio.Forms.Additional_Popups.Animation private void InitializeTreeviews() { Profiler.Start(); - GetTileDataToView(Internal.Animation.AnimationCategory.Blocks, treeViewBlocks.Nodes, treeViewBlockCache.Add); - GetTileDataToView(Internal.Animation.AnimationCategory.Items, treeViewItems.Nodes, treeViewItemCache.Add); + GetTileDataToView(Internal.AnimationCategory.Blocks, treeViewBlocks.Nodes, treeViewBlockCache.Add); + GetTileDataToView(Internal.AnimationCategory.Items, treeViewItems.Nodes, treeViewItemCache.Add); Profiler.Stop(); } @@ -43,17 +43,17 @@ namespace PckStudio.Forms.Additional_Popups.Animation selectedTile = tileData.InternalName; Debug.WriteLine(selectedTile); category = e.Node.TreeView == treeViewItems - ? Internal.Animation.AnimationCategory.Items - : Internal.Animation.AnimationCategory.Blocks; + ? Internal.AnimationCategory.Items + : Internal.AnimationCategory.Blocks; } } - private void GetTileDataToView(Internal.Animation.AnimationCategory key, TreeNodeCollection collection, Action additinalAction) + private void GetTileDataToView(Internal.AnimationCategory key, TreeNodeCollection collection, Action additinalAction) { List textureInfos = key switch { - Internal.Animation.AnimationCategory.Blocks => Tiles.BlockTileInfos, - Internal.Animation.AnimationCategory.Items => Tiles.ItemTileInfos, + Internal.AnimationCategory.Blocks => Tiles.BlockTileInfos, + Internal.AnimationCategory.Items => Tiles.ItemTileInfos, _ => throw new InvalidOperationException(nameof(key)) }; Profiler.Start(); diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.cs b/PCK-Studio/Forms/Editor/AnimationEditor.cs index a2e17386..3ecbbf00 100644 --- a/PCK-Studio/Forms/Editor/AnimationEditor.cs +++ b/PCK-Studio/Forms/Editor/AnimationEditor.cs @@ -352,8 +352,8 @@ namespace PckStudio.Forms.Editor { var textureInfos = _animation.Category switch { - Animation.AnimationCategory.Blocks => Tiles.BlockTileInfos, - Animation.AnimationCategory.Items => Tiles.ItemTileInfos, + AnimationCategory.Blocks => Tiles.BlockTileInfos, + AnimationCategory.Items => Tiles.ItemTileInfos, _ => throw new ArgumentOutOfRangeException(_animation.Category.ToString()) }; tileLabel.Text = textureInfos.FirstOrDefault(p => p.InternalName == _tileName)?.DisplayName ?? _tileName; diff --git a/PCK-Studio/Helper/AnimationHelper.cs b/PCK-Studio/Helper/AnimationHelper.cs index 5460d9a1..9f08dad3 100644 --- a/PCK-Studio/Helper/AnimationHelper.cs +++ b/PCK-Studio/Helper/AnimationHelper.cs @@ -32,13 +32,13 @@ namespace PckStudio.Helper var frameTextures = texture.Split(ImageLayoutDirection.Vertical); var _animation = new Animation(frameTextures, file.Properties.GetPropertyValue("ANIM")); _animation.Category = file.Filename.Split('/').Contains("items") - ? Animation.AnimationCategory.Items - : Animation.AnimationCategory.Blocks; + ? AnimationCategory.Items + : AnimationCategory.Blocks; return _animation; } return Animation.Empty(file.Filename.Split('/').Contains("items") - ? Animation.AnimationCategory.Items - : Animation.AnimationCategory.Blocks); + ? AnimationCategory.Items + : AnimationCategory.Blocks); } internal static Animation GetAnimationFromJavaAnimation(JObject jsonObject, Image texture) diff --git a/PCK-Studio/Internal/Animation.cs b/PCK-Studio/Internal/Animation.cs index 5d12a5b0..163ce6b7 100644 --- a/PCK-Studio/Internal/Animation.cs +++ b/PCK-Studio/Internal/Animation.cs @@ -24,7 +24,7 @@ using System.Collections.ObjectModel; namespace PckStudio.Internal { - internal sealed class Animation + internal sealed class Animation { public const int MinimumFrameTime = 1; @@ -41,11 +41,6 @@ namespace PckStudio.Internal public bool Interpolate { get; set; } = false; - public enum AnimationCategory - { - Items, - Blocks - } public AnimationCategory Category { get; set; } diff --git a/PCK-Studio/Internal/AnimationCategory.cs b/PCK-Studio/Internal/AnimationCategory.cs new file mode 100644 index 00000000..8cae76b2 --- /dev/null +++ b/PCK-Studio/Internal/AnimationCategory.cs @@ -0,0 +1,26 @@ +/* Copyright (c) 2023-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ + +namespace PckStudio.Internal +{ + internal enum AnimationCategory + { + Items, + Blocks + } +} diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index a5b0ac35..1b1f7b15 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -134,6 +134,7 @@ + Component From 62b063fa2ae4cbcca52aafa29b2a31fed246e9eb Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Fri, 25 Aug 2023 13:41:42 +0200 Subject: [PATCH 10/36] Add config for Trace class --- PCK-Studio/App.config | 3 +++ PCK-Studio/Program.cs | 2 ++ 2 files changed, 5 insertions(+) diff --git a/PCK-Studio/App.config b/PCK-Studio/App.config index 7140d8a4..db7ee6ab 100644 --- a/PCK-Studio/App.config +++ b/PCK-Studio/App.config @@ -11,6 +11,9 @@ + + + diff --git a/PCK-Studio/Program.cs b/PCK-Studio/Program.cs index f3b4595c..c14667e5 100644 --- a/PCK-Studio/Program.cs +++ b/PCK-Studio/Program.cs @@ -23,6 +23,8 @@ namespace PckStudio [STAThread] static void Main(string[] args) { + using var traceFile = File.OpenWrite(Path.Combine(Application.StartupPath, "tarce.log")); + Trace.Listeners.Add(new TextWriterTraceListener(traceFile)); ApplicationScope.Initialize(); RPC.Initialize(); MainInstance = new MainForm(); From 68f8f83212d798b65a39a080d16830c855b2df07 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 28 Aug 2023 10:23:57 +0200 Subject: [PATCH 11/36] Fixed SkinANIM API --- PCK-Studio/Forms/Editor/ANIMEditor.cs | 22 +++--- PCK-Studio/Internal/SkinANIM.cs | 103 ++++++++------------------ PCK-Studio/Internal/SkinAnimFlag.cs | 67 +++++++++++++++++ PCK-Studio/Internal/SkinAnimMask.cs | 53 +++++++++++++ PCK-Studio/MainForm.cs | 2 +- PCK-Studio/PckStudio.csproj | 2 + 6 files changed, 164 insertions(+), 85 deletions(-) create mode 100644 PCK-Studio/Internal/SkinAnimFlag.cs create mode 100644 PCK-Studio/Internal/SkinAnimMask.cs diff --git a/PCK-Studio/Forms/Editor/ANIMEditor.cs b/PCK-Studio/Forms/Editor/ANIMEditor.cs index 3718dcd8..bd27d242 100644 --- a/PCK-Studio/Forms/Editor/ANIMEditor.cs +++ b/PCK-Studio/Forms/Editor/ANIMEditor.cs @@ -328,18 +328,18 @@ namespace PckStudio.Forms.Editor setDisplayAnim((SkinANIM)initialANIM.Clone()); } - static readonly Dictionary Templates = new Dictionary() + static readonly Dictionary Templates = new Dictionary() { - { "Steve (64x32)", SkinAnimFlag.NONE }, - { "Steve (64x64)", SkinAnimFlag.RESOLUTION_64x64 }, - { "Alex (64x64)", SkinAnimFlag.SLIM_MODEL }, - { "Zombie Skins", SkinAnimFlag.ZOMBIE_ARMS }, - { "Cetacean Skins", SkinAnimFlag.SYNCED_ARMS | SkinAnimFlag.SYNCED_LEGS }, - { "Ski Skins", SkinAnimFlag.SYNCED_ARMS | SkinAnimFlag.STATIC_LEGS }, - { "Ghost Skins", SkinAnimFlag.STATIC_LEGS | SkinAnimFlag.ZOMBIE_ARMS }, - { "Medusa (Greek Myth.)", SkinAnimFlag.SYNCED_LEGS }, - { "Librarian (Halo)", SkinAnimFlag.STATIC_LEGS }, - { "Grim Reaper (Halloween)", SkinAnimFlag.STATIC_LEGS | SkinAnimFlag.STATIC_ARMS } + { "Steve (64x32)", SkinAnimMask.NONE }, + { "Steve (64x64)", SkinAnimMask.RESOLUTION_64x64 }, + { "Alex (64x64)", SkinAnimMask.SLIM_MODEL }, + { "Zombie Skins", SkinAnimMask.ZOMBIE_ARMS }, + { "Cetacean Skins", SkinAnimMask.SYNCED_ARMS | SkinAnimMask.SYNCED_LEGS }, + { "Ski Skins", SkinAnimMask.SYNCED_ARMS | SkinAnimMask.STATIC_LEGS }, + { "Ghost Skins", SkinAnimMask.STATIC_LEGS | SkinAnimMask.ZOMBIE_ARMS }, + { "Medusa (Greek Myth.)", SkinAnimMask.SYNCED_LEGS }, + { "Librarian (Halo)", SkinAnimMask.STATIC_LEGS }, + { "Grim Reaper (Halloween)", SkinAnimMask.STATIC_LEGS | SkinAnimMask.STATIC_ARMS } }; private void templateButton_Click(object sender, EventArgs e) diff --git a/PCK-Studio/Internal/SkinANIM.cs b/PCK-Studio/Internal/SkinANIM.cs index 784ff3f1..c152efa8 100644 --- a/PCK-Studio/Internal/SkinANIM.cs +++ b/PCK-Studio/Internal/SkinANIM.cs @@ -16,118 +16,72 @@ * 3. This notice may not be removed or altered from any source distribution. **/ using System; +using System.Collections.Specialized; using System.Text.RegularExpressions; namespace PckStudio.Internal { - /// - /// For usage see - /// - [Flags] - public enum SkinAnimFlag : int - { - NONE = 0, // 0x00 - STATIC_ARMS = 1 << 0, // 0x01 - ZOMBIE_ARMS = 1 << 1, // 0x02 - STATIC_LEGS = 1 << 2, // 0x04 - BAD_SANTA = 1 << 3, // 0x08 - // - __BIT_4 = 1 << 4, // 0x10 - Unused?? - SYNCED_LEGS = 1 << 5, // 0x20 - SYNCED_ARMS = 1 << 6, // 0x40 - STATUE_OF_LIBERTY = 1 << 7, // 0x80 - - ALL_ARMOR_DISABLED = 1 << 8, // 0x100 - HEAD_BOBBING_DISABLED = 1 << 9, // 0x200 - HEAD_DISABLED = 1 << 10, // 0x400 - RIGHT_ARM_DISABLED = 1 << 11, // 0x800 - - LEFT_ARM_DISABLED = 1 << 12, // 0x1000 - BODY_DISABLED = 1 << 13, // 0x2000 - RIGHT_LEG_DISABLED = 1 << 14, // 0x4000 - LEFT_LEG_DISABLED = 1 << 15, // 0x8000 - - HEAD_OVERLAY_DISABLED = 1 << 16, // 0x10000 - DO_BACKWARDS_CROUCH = 1 << 17, // 0x20000 - RESOLUTION_64x64 = 1 << 18, // 0x40000 - SLIM_MODEL = 1 << 19, // 0x80000 - - LEFT_ARM_OVERLAY_DISABLED = 1 << 20, // 0x100000 - RIGHT_ARM_OVERLAY_DISABLED = 1 << 21, // 0x200000 - LEFT_LEG_OVERLAY_DISABLED = 1 << 22, // 0x400000 - RIGHT_LEG_OVERLAY_DISABLED = 1 << 23, // 0x800000 - - BODY_OVERLAY_DISABLED = 1 << 24, // 0x1000000 - FORCE_HEAD_ARMOR = 1 << 25, // 0x2000000 - FORCE_RIGHT_ARM_ARMOR = 1 << 26, // 0x4000000 - FORCE_LEFT_ARM_ARMOR = 1 << 27, // 0x8000000 - - FORCE_BODY_ARMOR = 1 << 28, // 0x10000000 - FORCE_RIGHT_LEG_ARMOR = 1 << 29, // 0x20000000 - FORCE_LEFT_LEG_ARMOR = 1 << 30, // 0x40000000 - DINNERBONE = 1 << 31, // 0x80000000 - } - /// /// Represents a Skin Anim value where flags can be set /// - public class SkinANIM : ICloneable, IEquatable, IEquatable + public class SkinANIM : ICloneable, IEquatable, IEquatable { public static readonly SkinANIM Empty = new SkinANIM(); - private SkinAnimFlag _flags; + private BitVector32 _flags; private static readonly Regex _validator = new Regex(@"^0x[0-9a-f]{1,8}\b", RegexOptions.IgnoreCase); public SkinANIM() - : this(SkinAnimFlag.NONE) + : this(SkinAnimMask.NONE) { } - public SkinANIM(SkinAnimFlag mask) + public SkinANIM(SkinAnimMask mask) + : this((int)mask) { - _flags = mask; } - public override string ToString() => "0x" + ((int)_flags).ToString("x8"); + private SkinANIM(int mask) + { + _flags = new BitVector32(mask); + } + + public override string ToString() => "0x" + _flags.Data.ToString("x8"); public static bool IsValidANIM(string anim) { - if (anim is not null) - return _validator.IsMatch(anim); - return false; + return !string.IsNullOrWhiteSpace(anim) && _validator.IsMatch(anim); } public static SkinANIM FromString(string value) => IsValidANIM(value) - ? new SkinANIM((SkinAnimFlag)Convert.ToInt32(value.TrimEnd(' ', '\n', '\r'), 16)) + ? new SkinANIM(Convert.ToInt32(value.TrimEnd(' ', '\n', '\r'), 16)) : new SkinANIM(); - public void SetMask(SkinAnimFlag mask) => _flags = mask; - - public static SkinANIM operator |(SkinANIM _this, SkinANIM other) => new SkinANIM(_this._flags | other._flags); + public static SkinANIM operator |(SkinANIM _this, SkinANIM other) => new SkinANIM(_this._flags.Data | other._flags.Data); - public static SkinANIM operator |(SkinANIM _this, SkinAnimFlag mask) => new SkinANIM(_this._flags | mask); + public static SkinANIM operator |(SkinANIM _this, SkinAnimMask mask) => new SkinANIM(_this._flags.Data | (int)mask); - public static implicit operator SkinANIM(SkinAnimFlag mask) => new SkinANIM(mask); + public static implicit operator SkinANIM(SkinAnimMask mask) => new SkinANIM(mask); - public static bool operator ==(SkinANIM _this, SkinAnimFlag mask) => _this.Equals(mask); - public static bool operator !=(SkinANIM _this, SkinAnimFlag mask) => !_this.Equals(mask); + public static bool operator ==(SkinANIM _this, SkinAnimMask mask) => _this.Equals(mask); + public static bool operator !=(SkinANIM _this, SkinAnimMask mask) => !_this.Equals(mask); public static bool operator ==(SkinANIM _this, SkinANIM other) => _this.Equals(other); public static bool operator !=(SkinANIM _this, SkinANIM other) => !_this.Equals(other); public bool Equals(SkinANIM other) { - return _flags == other._flags; + return _flags.Data == other._flags.Data; } - public bool Equals(SkinAnimFlag other) + public bool Equals(SkinAnimMask other) { - return _flags == other; + return _flags.Data == (int)other; } public override bool Equals(object obj) => obj is SkinANIM a && Equals(a); - public override int GetHashCode() => (int)_flags; + public override int GetHashCode() => _flags.Data; /// /// Sets the desired flag in the bitfield @@ -136,18 +90,21 @@ namespace PckStudio.Internal /// State of the flag public void SetFlag(SkinAnimFlag flag, bool state) { - if (state) _flags |= flag; - else _flags &= ~flag; + if (!Enum.IsDefined(typeof(SkinAnimFlag), flag)) + throw new ArgumentOutOfRangeException(nameof(flag)); + _flags[1 << (int)flag] = state; } /// - /// Gets a desired flags state + /// Gets flag state /// /// Flag to check /// True if flag is set, otherwise false public bool GetFlag(SkinAnimFlag flag) { - return (_flags & flag) != 0; + if (!Enum.IsDefined(typeof(SkinAnimFlag), flag)) + throw new ArgumentOutOfRangeException(nameof(flag)); + return _flags[1 << (int)flag]; } public object Clone() diff --git a/PCK-Studio/Internal/SkinAnimFlag.cs b/PCK-Studio/Internal/SkinAnimFlag.cs new file mode 100644 index 00000000..456c4c91 --- /dev/null +++ b/PCK-Studio/Internal/SkinAnimFlag.cs @@ -0,0 +1,67 @@ +/* Copyright (c) 2022-present miku-666, MattNL + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; + +namespace PckStudio.Internal +{ + /// + /// For usage see + /// + public enum SkinAnimFlag : int + { + STATIC_ARMS = 0, // 0x01 + ZOMBIE_ARMS = 1, // 0x02 + STATIC_LEGS = 2, // 0x04 + BAD_SANTA = 3, // 0x08 + // + __BIT_4 = 4, // 0x10 - Unused?? + SYNCED_LEGS = 5, // 0x20 + SYNCED_ARMS = 6, // 0x40 + STATUE_OF_LIBERTY = 7, // 0x80 + + ALL_ARMOR_DISABLED = 8, // 0x100 + HEAD_BOBBING_DISABLED = 9, // 0x200 + HEAD_DISABLED = 10, // 0x400 + RIGHT_ARM_DISABLED = 11, // 0x800 + + LEFT_ARM_DISABLED = 12, // 0x1000 + BODY_DISABLED = 13, // 0x2000 + RIGHT_LEG_DISABLED = 14, // 0x4000 + LEFT_LEG_DISABLED = 15, // 0x8000 + + HEAD_OVERLAY_DISABLED = 16, // 0x10000 + DO_BACKWARDS_CROUCH = 17, // 0x20000 + RESOLUTION_64x64 = 18, // 0x40000 + SLIM_MODEL = 19, // 0x80000 + + LEFT_ARM_OVERLAY_DISABLED = 20, // 0x100000 + RIGHT_ARM_OVERLAY_DISABLED = 21, // 0x200000 + LEFT_LEG_OVERLAY_DISABLED = 22, // 0x400000 + RIGHT_LEG_OVERLAY_DISABLED = 23, // 0x800000 + + BODY_OVERLAY_DISABLED = 24, // 0x1000000 + FORCE_HEAD_ARMOR = 25, // 0x2000000 + FORCE_RIGHT_ARM_ARMOR = 26, // 0x4000000 + FORCE_LEFT_ARM_ARMOR = 27, // 0x8000000 + + FORCE_BODY_ARMOR = 28, // 0x10000000 + FORCE_RIGHT_LEG_ARMOR = 29, // 0x20000000 + FORCE_LEFT_LEG_ARMOR = 30, // 0x40000000 + DINNERBONE = 31, // 0x80000000 + } +} diff --git a/PCK-Studio/Internal/SkinAnimMask.cs b/PCK-Studio/Internal/SkinAnimMask.cs new file mode 100644 index 00000000..05a3b097 --- /dev/null +++ b/PCK-Studio/Internal/SkinAnimMask.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PckStudio.Internal +{ + [Flags] + public enum SkinAnimMask : int + { + NONE = 0, // 0x00 + STATIC_ARMS = 1 << 0, // 0x01 + ZOMBIE_ARMS = 1 << 1, // 0x02 + STATIC_LEGS = 1 << 2, // 0x04 + BAD_SANTA = 1 << 3, // 0x08 + + __BIT_4 = 1 << 4, // 0x10 - Unused?? + SYNCED_LEGS = 1 << 5, // 0x20 + SYNCED_ARMS = 1 << 6, // 0x40 + STATUE_OF_LIBERTY = 1 << 7, // 0x80 + + ALL_ARMOR_DISABLED = 1 << 8, // 0x100 + HEAD_BOBBING_DISABLED = 1 << 9, // 0x200 + HEAD_DISABLED = 1 << 10, // 0x400 + RIGHT_ARM_DISABLED = 1 << 11, // 0x800 + + LEFT_ARM_DISABLED = 1 << 12, // 0x1000 + BODY_DISABLED = 1 << 13, // 0x2000 + RIGHT_LEG_DISABLED = 1 << 14, // 0x4000 + LEFT_LEG_DISABLED = 1 << 15, // 0x8000 + + HEAD_OVERLAY_DISABLED = 1 << 16, // 0x10000 + DO_BACKWARDS_CROUCH = 1 << 17, // 0x20000 + RESOLUTION_64x64 = 1 << 18, // 0x40000 + SLIM_MODEL = 1 << 19, // 0x80000 + + LEFT_ARM_OVERLAY_DISABLED = 1 << 20, // 0x100000 + RIGHT_ARM_OVERLAY_DISABLED = 1 << 21, // 0x200000 + LEFT_LEG_OVERLAY_DISABLED = 1 << 22, // 0x400000 + RIGHT_LEG_OVERLAY_DISABLED = 1 << 23, // 0x800000 + + BODY_OVERLAY_DISABLED = 1 << 24, // 0x1000000 + FORCE_HEAD_ARMOR = 1 << 25, // 0x2000000 + FORCE_RIGHT_ARM_ARMOR = 1 << 26, // 0x4000000 + FORCE_LEFT_ARM_ARMOR = 1 << 27, // 0x8000000 + + FORCE_BODY_ARMOR = 1 << 28, // 0x10000000 + FORCE_RIGHT_LEG_ARMOR = 1 << 29, // 0x20000000 + FORCE_LEFT_LEG_ARMOR = 1 << 30, // 0x40000000 + DINNERBONE = 1 << 31, // 0x80000000 + } +} diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index 7c09e1ce..cd955fc4 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -476,7 +476,7 @@ namespace PckStudio buttonEdit.Visible = true; } else if (file.Properties.HasProperty("ANIM") && - file.Properties.GetPropertyValue("ANIM", s => SkinANIM.FromString(s) == (SkinAnimFlag.RESOLUTION_64x64 | SkinAnimFlag.SLIM_MODEL))) + file.Properties.GetPropertyValue("ANIM", s => SkinANIM.FromString(s) == (SkinAnimMask.RESOLUTION_64x64 | SkinAnimMask.SLIM_MODEL))) { buttonEdit.Text = "View Skin"; buttonEdit.Visible = true; diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index 1b1f7b15..f78b84a2 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -135,6 +135,8 @@ + + Component From caa9a0142f137912e373de93d802fd49062a2018 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 28 Aug 2023 12:56:55 +0200 Subject: [PATCH 12/36] MainForm.cs - Renamed 'SetPckFileIcon' to 'SetNodeIcon' --- PCK-Studio/MainForm.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index cd955fc4..34f5c4ca 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -327,7 +327,7 @@ namespace PckStudio } } } - SetPckFileIcon(node, file.Filetype); + SetNodeIcon(node, file.Filetype); }; } @@ -774,7 +774,7 @@ namespace PckStudio add.SkinFile.Filename = add.SkinFile.Filename.Insert(0, "Skins.pck/"); TreeNode newNode = new TreeNode(Path.GetFileName(add.SkinFile.Filename)); newNode.Tag = add.SkinFile; - SetPckFileIcon(newNode, PckFile.FileData.FileType.SkinFile); + SetNodeIcon(newNode, PckFile.FileData.FileType.SkinFile); subPCK.Nodes.Add(newNode); RebuildSubPCK(newNode.FullPath); } @@ -792,7 +792,7 @@ namespace PckStudio add.CapeFile.Filename = add.CapeFile.Filename.Insert(0, "Skins.pck/"); TreeNode newNode = new TreeNode(Path.GetFileName(add.CapeFile.Filename)); newNode.Tag = add.CapeFile; - SetPckFileIcon(newNode, PckFile.FileData.FileType.SkinFile); + SetNodeIcon(newNode, PckFile.FileData.FileType.SkinFile); subPCK.Nodes.Add(newNode); RebuildSubPCK(newNode.FullPath); } @@ -1764,7 +1764,7 @@ namespace PckStudio SaveTemplate(); } - private void SetPckFileIcon(TreeNode node, PckFile.FileData.FileType type) + private void SetNodeIcon(TreeNode node, PckFile.FileData.FileType type) { switch (type) { @@ -1837,7 +1837,7 @@ namespace PckStudio { Debug.WriteLine($"Setting {file.Filetype} to {type}"); file.Filetype = type; - SetPckFileIcon(t, type); + SetNodeIcon(treeViewMain.SelectedNode, type); RebuildSubPCK(treeViewMain.SelectedNode.FullPath); } } From 80423098a213f0323a425d06ec25e8f394e7bd74 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:09:52 +0200 Subject: [PATCH 13/36] MainForm.cs - Updated and renmaed 'setFileType_Click' to 'SetFileType' --- PCK-Studio/MainForm.cs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index 34f5c4ca..56105ea3 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -51,18 +51,18 @@ namespace PckStudio { InitializeComponent(); - skinToolStripMenuItem1.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.SkinFile); - capeToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.CapeFile); - textureToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.TextureFile); - languagesFileLOCToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.LocalisationFile); - gameRulesFileGRFToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.GameRulesFile); - audioPCKFileToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.AudioFile); - coloursCOLFileToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.ColourTableFile); - gameRulesHeaderGRHToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.GameRulesHeader); - skinsPCKToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.SkinDataFile); - modelsFileBINToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.ModelsFile); - behavioursFileBINToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.BehavioursFile); - entityMaterialsFileBINToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.MaterialFile); + skinToolStripMenuItem1.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.SkinFile); + capeToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.CapeFile); + textureToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.TextureFile); + languagesFileLOCToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.LocalisationFile); + gameRulesFileGRFToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.GameRulesFile); + audioPCKFileToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.AudioFile); + coloursCOLFileToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.ColourTableFile); + gameRulesHeaderGRHToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.GameRulesHeader); + skinsPCKToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.SkinDataFile); + modelsFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.ModelsFile); + behavioursFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.BehavioursFile); + entityMaterialsFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.MaterialFile); treeViewMain.TreeViewNodeSorter = new PckNodeSorter(); @@ -1831,7 +1831,7 @@ namespace PckStudio } } - private void setFileType_Click(object sender, EventArgs e, PckFile.FileData.FileType type) + private void SetFileType(PckFile.FileData.FileType type) { if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PckFile.FileData file) { From 44456bbf6d6b5ae3f02a5df00185be269f2aacab Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:15:57 +0200 Subject: [PATCH 14/36] Added TreeNodeExtensions.cs --- PCK-Studio/Extensions/TreeNodeExtensions.cs | 51 ++++++++++++++++++ PCK-Studio/MainForm.cs | 58 ++++++--------------- PCK-Studio/PckNodeSorter.cs | 42 +++++++-------- PCK-Studio/PckStudio.csproj | 1 + 4 files changed, 89 insertions(+), 63 deletions(-) create mode 100644 PCK-Studio/Extensions/TreeNodeExtensions.cs diff --git a/PCK-Studio/Extensions/TreeNodeExtensions.cs b/PCK-Studio/Extensions/TreeNodeExtensions.cs new file mode 100644 index 00000000..756ece05 --- /dev/null +++ b/PCK-Studio/Extensions/TreeNodeExtensions.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace PckStudio.Extensions +{ + internal static class TreeNodeExtensions + { + internal static bool IsTagOfType(this TreeNode node) + { + return node.Tag is T; + } + + internal static bool TryGetTagData(this TreeNode node, out TOut tagData) + { + if (node?.Tag is TOut _data) + { + tagData = _data; + return true; + } + tagData = default; + return false; + } + + internal static bool Contains(this TreeNode thisNode, TreeNode childNode) + { + if (childNode.Parent == null) + return false; + if (thisNode.Equals(childNode.Parent)) + return true; + // If the parent node is not equal to the first node, + // call the TreeNode.Contains recursively using the parent of the node. + return thisNode.Contains(childNode.Parent); + } + + internal static List GetChildNodes(this TreeNode thisNode) + { + List nodes = new List(thisNode.Nodes.Count); + foreach (TreeNode node in thisNode.Nodes) + { + nodes.Add(node); + nodes.AddRange(node.GetChildNodes()); + } + return nodes; + } + + } +} \ No newline at end of file diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index 56105ea3..8c0cbb4a 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -465,9 +465,8 @@ namespace PckStudio entryTypeTextBox.Text = entryDataTextBox.Text = labelImageSize.Text = string.Empty; buttonEdit.Visible = false; previewPictureBox.Image = Resources.NoImageFound; - var node = e.Node; viewFileInfoToolStripMenuItem.Visible = false; - if (node is TreeNode t && t.Tag is PckFile.FileData file) + if (e.Node.TryGetTagData(out PckFile.FileData file)) { viewFileInfoToolStripMenuItem.Visible = true; if (file.Properties.HasProperty("BOX")) @@ -552,8 +551,9 @@ namespace PckStudio private void extractToolStripMenuItem_Click(object sender, EventArgs e) { var node = treeViewMain.SelectedNode; - if (node == null) return; - if (node.Tag is PckFile.FileData file) + if (node == null) + return; + if (node.TryGetTagData(out PckFile.FileData file)) { using SaveFileDialog exFile = new SaveFileDialog(); exFile.FileName = Path.GetFileName(file.Filename); @@ -585,7 +585,7 @@ namespace PckStudio { GetAllChildNodes(node.Nodes).ForEach(fileNode => { - if (fileNode.Tag is PckFile.FileData file) + if (fileNode.TryGetTagData(out PckFile.FileData file)) { Directory.CreateDirectory($"{extractPath}/{Path.GetDirectoryName(file.Filename)}"); File.WriteAllBytes($"{extractPath}/{file.Filename}", file.Data); @@ -904,7 +904,7 @@ namespace PckStudio foreach (var node in s) { TreeNode parent = treeViewMain.Nodes.Find(node, true)[0]; - if (parent.Tag is PckFile.FileData f && + if (parent.TryGetTagData(out PckFile.FileData f) && (f.Filetype is PckFile.FileData.FileType.TexturePackInfoFile || f.Filetype is PckFile.FileData.FileType.SkinDataFile)) return parent; @@ -948,7 +948,7 @@ namespace PckStudio private void treeViewMain_DoubleClick(object sender, EventArgs e) { - if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PckFile.FileData file) + if (treeViewMain.SelectedNode.TryGetTagData(out PckFile.FileData file)) { if (file.Size <= 0) { @@ -1125,15 +1125,6 @@ namespace PckStudio #region drag and drop for main tree node - public static void getChildren(List Nodes, TreeNode Node) - { - foreach (TreeNode thisNode in Node.Nodes) - { - Nodes.Add(thisNode); - getChildren(Nodes, thisNode); - } - } - // Most of the code below is modified code from this link: https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.treeview.itemdrag?view=windowsdesktop-6.0 // - MattNL @@ -1161,19 +1152,6 @@ namespace PckStudio } - // Determine whether one node is a parent - // or ancestor of a second node. - private bool ContainsNode(TreeNode node1, TreeNode node2) - { - // Check the parent node of the second node. - if (node2.Parent == null) return false; - if (node2.Parent.Equals(node1)) return true; - // If the parent node is not null or equal to the first node, - // call the ContainsNode method recursively using the parent of - // the second node. - return ContainsNode(node1, node2.Parent); - } - #endregion private PckFile InitializePack(int packId, int packVersion, string packName, bool createSkinsPCK) @@ -1833,7 +1811,7 @@ namespace PckStudio private void SetFileType(PckFile.FileData.FileType type) { - if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PckFile.FileData file) + if (treeViewMain.SelectedNode.TryGetTagData(out PckFile.FileData file)) { Debug.WriteLine($"Setting {file.Filetype} to {type}"); file.Filetype = type; @@ -1948,8 +1926,7 @@ namespace PckStudio private void as3DSTextureFileToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode is TreeNode node && - node.Tag is PckFile.FileData file && + if (treeViewMain.SelectedNode.TryGetTagData(out PckFile.FileData file) && file.Filetype == PckFile.FileData.FileType.SkinFile) { SaveFileDialog saveFileDialog = new SaveFileDialog(); @@ -1969,8 +1946,7 @@ namespace PckStudio private void addMultipleEntriesToolStripMenuItem1_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode is TreeNode node && - node.Tag is PckFile.FileData file) + if (treeViewMain.SelectedNode.TryGetTagData(out PckFile.FileData file)) { using (var input = new MultiTextPrompt()) { @@ -1984,7 +1960,7 @@ namespace PckStudio file.Properties.Add((line.Substring(0, idx), line.Substring(idx + 1))); } ReloadMetaTreeView(); - RebuildSubPCK(node.FullPath); + RebuildSubPCK(treeViewMain.SelectedNode.FullPath); wasModified = true; } } @@ -1993,14 +1969,15 @@ namespace PckStudio private void correctSkinDecimalsToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode is TreeNode node && node.Tag is PckFile.FileData file && file.Filetype == PckFile.FileData.FileType.SkinFile) + if (treeViewMain.SelectedNode.TryGetTagData(out PckFile.FileData file) && + file.Filetype == PckFile.FileData.FileType.SkinFile) { foreach(var p in file.Properties.FindAll(s => s.Key == "BOX" || s.Key == "OFFSET")) { file.Properties[file.Properties.IndexOf(p)] = new KeyValuePair(p.Key, p.Value.Replace(',','.')); } ReloadMetaTreeView(); - RebuildSubPCK(node.FullPath); + RebuildSubPCK(treeViewMain.SelectedNode.FullPath); wasModified = true; } } @@ -2112,8 +2089,7 @@ namespace PckStudio private void editAllEntriesToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode is TreeNode node && - node.Tag is PckFile.FileData file) + if (treeViewMain.SelectedNode.TryGetTagData(out PckFile.FileData file)) { var props = file.Properties.Select(p => p.Key + " " + p.Value); using (var input = new MultiTextPrompt(props.ToArray())) @@ -2129,7 +2105,7 @@ namespace PckStudio file.Properties.Add((line.Substring(0, idx).Replace(":", string.Empty), line.Substring(idx + 1))); } ReloadMetaTreeView(); - RebuildSubPCK(node.FullPath); + RebuildSubPCK(treeViewMain.SelectedNode.FullPath); wasModified = true; } } @@ -2262,7 +2238,7 @@ namespace PckStudio private void addANIMEntryToolStripMenuItem1_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PckFile.FileData file) + if (treeViewMain.SelectedNode.TryGetTagData(out PckFile.FileData file)) { using ANIMEditor diag = new ANIMEditor(SkinANIM.Empty); if (diag.ShowDialog(this) == DialogResult.OK) diff --git a/PCK-Studio/PckNodeSorter.cs b/PCK-Studio/PckNodeSorter.cs index b2568055..b554bf86 100644 --- a/PCK-Studio/PckNodeSorter.cs +++ b/PCK-Studio/PckNodeSorter.cs @@ -3,35 +3,43 @@ using System.Collections.Generic; using System.Windows.Forms; using OMI.Formats.Pck; +using PckStudio.Extensions; namespace PckStudio { public class PckNodeSorter : IComparer, IComparer { + public bool Descending { get; set; } = false; + private bool CheckForSkinAndCapeFiles(TreeNode node) { - if (IsPckFile(node, out PckFile.FileData file)) + if (node.TryGetTagData(out PckFile.FileData file)) return file.Filetype == PckFile.FileData.FileType.SkinFile || file.Filetype == PckFile.FileData.FileType.CapeFile; return false; } - private bool IsPckFile(TreeNode node) => IsPckFile(node, out _); - private bool IsPckFile(TreeNode node, out PckFile.FileData file) + public int Compare(object x, object y) { - if (node.Tag is PckFile.FileData _file) + TreeNode tx = x as TreeNode; + TreeNode ty = y as TreeNode; + return Compare(tx, ty); + } + + public int Compare(TreeNode x, TreeNode y) { - file = _file; - return true; + int result = InternalCompare(x, y); + if (Descending && result != 0) + { + result = 2 % result + 1; } - file = null; - return false; + return result; } - public int Compare(TreeNode first, TreeNode second) + private int InternalCompare(TreeNode first, TreeNode second) { - if (IsPckFile(first) && !IsPckFile(second)) + if (first.IsTagOfType() && !second.IsTagOfType()) return -1; - if (!IsPckFile(first) && IsPckFile(second)) + if (!first.IsTagOfType() && second.IsTagOfType()) return 1; if (CheckForSkinAndCapeFiles(first)) @@ -40,17 +48,7 @@ namespace PckStudio return 1; return first.Text.CompareTo(second.Text); - // weird fail save - //return first.ImageIndex.CompareTo(second.ImageIndex); + } } - int IComparer.Compare(object x, object y) - { - if (x is not TreeNode NodeX) - return -1; - if (y is not TreeNode NodeY) - return 1; - return Compare(NodeX, NodeY); - } - } } \ No newline at end of file diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index f78b84a2..77455a9b 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -133,6 +133,7 @@ + From 945d9baf8e2fb2a36e5cebce15c81193891b25b6 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:50:19 +0200 Subject: [PATCH 15/36] Moved PckNodeSorter to 'Internal' folder --- PCK-Studio/{ => Internal}/PckNodeSorter.cs | 20 +++++++++++--------- PCK-Studio/PckStudio.csproj | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) rename PCK-Studio/{ => Internal}/PckNodeSorter.cs (76%) diff --git a/PCK-Studio/PckNodeSorter.cs b/PCK-Studio/Internal/PckNodeSorter.cs similarity index 76% rename from PCK-Studio/PckNodeSorter.cs rename to PCK-Studio/Internal/PckNodeSorter.cs index b554bf86..55d419f1 100644 --- a/PCK-Studio/PckNodeSorter.cs +++ b/PCK-Studio/Internal/PckNodeSorter.cs @@ -1,37 +1,39 @@ using System.Collections; using System.Collections.Generic; +using System.Diagnostics; using System.Windows.Forms; using OMI.Formats.Pck; using PckStudio.Extensions; -namespace PckStudio +namespace PckStudio.Internal { public class PckNodeSorter : IComparer, IComparer { + public object SortingOptions { get; set; } = null; public bool Descending { get; set; } = false; private bool CheckForSkinAndCapeFiles(TreeNode node) { - if (node.TryGetTagData(out PckFile.FileData file)) - return file.Filetype == PckFile.FileData.FileType.SkinFile || file.Filetype == PckFile.FileData.FileType.CapeFile; - return false; + return node.TryGetTagData(out PckFile.FileData file) && + (file.Filetype == PckFile.FileData.FileType.SkinFile || file.Filetype == PckFile.FileData.FileType.CapeFile); } public int Compare(object x, object y) - { + { TreeNode tx = x as TreeNode; TreeNode ty = y as TreeNode; return Compare(tx, ty); } public int Compare(TreeNode x, TreeNode y) - { + { int result = InternalCompare(x, y); + Debug.WriteLine(result); if (Descending && result != 0) { result = 2 % result + 1; - } + } return result; } @@ -43,12 +45,12 @@ namespace PckStudio return 1; if (CheckForSkinAndCapeFiles(first)) - return -1; + return 1; if (CheckForSkinAndCapeFiles(second)) return 1; return first.Text.CompareTo(second.Text); } - } + } } \ No newline at end of file diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index 77455a9b..73092839 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -439,7 +439,7 @@ TextureConverterUtility.cs - + Form From 8b4796416f683da7c276e00a10e23093add2dc21 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:52:47 +0200 Subject: [PATCH 16/36] MainForm.cs - Added 'BeforeFileRemove' function to check before a file is removed --- PCK-Studio/MainForm.cs | 45 ++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index 8c0cbb4a..fbfb9165 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -674,25 +674,22 @@ namespace PckStudio MessageBox.Show("Can't replace a folder."); } - private void deleteFileToolStripMenuItem_Click(object sender, EventArgs e) + /// + /// Action to run before a file will be deleted + /// + /// File to remove + /// True if the remove should be canceled, otherwise False + private bool BeforeFileRemove(PckFile.FileData file) { - var node = treeViewMain.SelectedNode; - if (node == null) return; - - string path = node.FullPath; - - if (node.Tag is PckFile.FileData) - { - PckFile.FileData file = node.Tag as PckFile.FileData; - string itemPath = "res/textures/items/"; // warn the user about deleting compass.png and clock.png if (file.Filetype == PckFile.FileData.FileType.TextureFile && (file.Filename == itemPath + "compass.png" || file.Filename == itemPath + "clock.png")) { - if(MessageBox.Show("Are you sure want to delete this file? If \"compass.png\" or \"clock.png\" are missing, your game will crash upon loading this pack.", "Warning", - MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) return; + if (MessageBox.Show("Are you sure want to delete this file? If \"compass.png\" or \"clock.png\" are missing, your game will crash upon loading this pack.", "Warning", + MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) + return true; } // remove loc key if its a skin/cape @@ -700,15 +697,25 @@ namespace PckStudio { if (TryGetLocFile(out LOCFile locFile)) { - foreach (var property in file.Properties) - { - if (property.Key == "THEMENAMEID" || property.Key == "DISPLAYNAMEID") - locFile.RemoveLocKey(property.Value); - } + locFile.RemoveLocKey(file.Properties.GetPropertyValue("THEMENAMEID")); + locFile.RemoveLocKey(file.Properties.GetPropertyValue("DISPLAYNAMEID")); TrySetLocFile(locFile); } } - if (currentPCK.Files.Remove(file)) + return false; + } + + private void deleteFileToolStripMenuItem_Click(object sender, EventArgs e) + { + var node = treeViewMain.SelectedNode; + if (node == null) + return; + + string path = node.FullPath; + + if (node.TryGetTagData(out PckFile.FileData file)) + { + if (!BeforeFileRemove(file) && currentPCK.Files.Remove(file)) { node.Remove(); wasModified = true; @@ -718,7 +725,7 @@ namespace PckStudio MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) { string pckFolderDir = node.FullPath; - currentPCK.Files.RemoveAll(file => file.Filename.StartsWith(pckFolderDir)); + currentPCK.Files.RemoveAll(file => !BeforeFileRemove(file) && file.Filename.StartsWith(pckFolderDir)); node.Remove(); wasModified = true; } From 6ad1696b4e4c9da461d71522bf311d4ad6ea27fd Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:54:33 +0200 Subject: [PATCH 17/36] MainForm.cs - Chnaged some debug logging messages to trace logging --- PCK-Studio/MainForm.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index fbfb9165..524b92cf 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -959,7 +959,7 @@ namespace PckStudio { if (file.Size <= 0) { - Debug.WriteLine($"'{file.Filename}' has no data attached.", category: nameof(HandleTextureFile)); + Trace.WriteLine($"'{file.Filename}' has no data attached.", category: nameof(HandleTextureFile)); return; } pckFileTypeHandler[file.Filetype]?.Invoke(file); @@ -1001,6 +1001,7 @@ namespace PckStudio catch (Exception ex) { Debug.WriteLine(ex.Message); + Trace.WriteLine("Invalid ANIM value: " + property.Value); MessageBox.Show("Failed to parse ANIM value, aborting to normal functionality. Please make sure the value only includes hexadecimal characters (0-9,A-F) and has no more than 8 characters."); } break; @@ -1021,6 +1022,7 @@ namespace PckStudio catch (Exception ex) { Debug.WriteLine(ex.Message); + Trace.WriteLine("Invalid BOX value: " + property.Value); MessageBox.Show("Failed to parse BOX value, aborting to normal functionality."); } break; @@ -1336,9 +1338,10 @@ namespace PckStudio } catch (OverflowException ex) { + Debug.WriteLine(ex.Message); + Trace.WriteLine("Failed to open " + ofd.FileName); MessageBox.Show("Error", "Failed to open pck\nTry checking the 'Open/Save as Switch/Vita/PS4 pck' check box in the upper right corner.", MessageBoxButtons.OK, MessageBoxIcon.Error); - Debug.WriteLine(ex.Message); } } foreach (PckFile.FileData file in pckfile.Files) @@ -2062,7 +2065,7 @@ namespace PckStudio case DialogResult.No: case DialogResult.Cancel: default: - MessageBox.Show(this, "Operation cancelled"); + Trace.WriteLine("Operation cancelled", category: nameof(addCustomPackIconToolStripMenuItem_Click)); return; } } From cfae4b00fb9183f71256d413e802e1f4f021652b Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:55:45 +0200 Subject: [PATCH 18/36] MainForm.cs - Added call to `treeViewMain.Sort()` in `BuildMainTreeView` --- PCK-Studio/MainForm.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index 524b92cf..4f3c945b 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -349,6 +349,7 @@ namespace PckStudio if (!skinsNode.Nodes.ContainsKey("Skins")) skinsNode.Nodes.Add(folderNode); } + treeViewMain.Sort(); TreeNode[] selectedNodes; if (!string.IsNullOrEmpty(selectedNodeText) && From 11d62f921eec5113d97016598db54869f607f3b8 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:57:24 +0200 Subject: [PATCH 19/36] MainForm.cs - Marked 'importSkinToolStripMenuItem_Click' as deprecated with message --- PCK-Studio/MainForm.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index 4f3c945b..afe65da0 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -1523,6 +1523,7 @@ namespace PckStudio } + [Obsolete("Refactor or remove this")] private void importSkinToolStripMenuItem_Click(object sender, EventArgs e) { using (OpenFileDialog contents = new OpenFileDialog()) From 6949147e47486a7ed9600e47bb5078420855f0f1 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:58:48 +0200 Subject: [PATCH 20/36] MainForm.cs - Removed unused 'fAQToolStripMenuItem1_Click' function --- PCK-Studio/MainForm.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index afe65da0..2749d8a4 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -1608,11 +1608,6 @@ namespace PckStudio } } - private void fAQToolStripMenuItem1_Click(object sender, EventArgs e) - { - //System.Diagnostics.Process.Start(hosturl + "pckStudio#faq"); - } - private void convertToBedrockToolStripMenuItem_Click(object sender, EventArgs e) { MessageBox.Show("This feature is currently being reworked.", "Currently unavailable", MessageBoxButtons.OK, MessageBoxIcon.Information); From a47272442f1986d32ba9d5dbed0d17b5b050995e Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 28 Aug 2023 14:00:03 +0200 Subject: [PATCH 21/36] MainForm - Made toolStripSeparator not generate member variables --- PCK-Studio/MainForm.Designer.cs | 315 ++- PCK-Studio/MainForm.resx | 3557 ++++++++----------------------- 2 files changed, 1033 insertions(+), 2839 deletions(-) diff --git a/PCK-Studio/MainForm.Designer.cs b/PCK-Studio/MainForm.Designer.cs index 5a0215ef..366dc5d5 100644 --- a/PCK-Studio/MainForm.Designer.cs +++ b/PCK-Studio/MainForm.Designer.cs @@ -31,6 +31,8 @@ this.components = new System.ComponentModel.Container(); System.Windows.Forms.PictureBox logoPictureBox; System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + System.Windows.Forms.ToolStripSeparator toolStripSeparator3; this.contextMenuPCKEntries = new System.Windows.Forms.ContextMenuStrip(this.components); this.createToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.folderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -96,6 +98,21 @@ this.openPckCenterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.joinDevelopmentDiscordToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.trelloBoardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.videosToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.howToMakeABasicSkinPackToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.howToMakeACustomSkinModelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.howToMakeCustomSkinModelsbedrockToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.howToMakeCustomMusicToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.howToInstallPcksDirectlyToWiiUToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pckCenterReleaseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.howPCKsWorkToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.donateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toNobledezJackToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toPhoenixARCDeveloperToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.forMattNLContributorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.contextMenuMetaTree = new System.Windows.Forms.ContextMenuStrip(this.components); this.addEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.addEntryToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); @@ -127,27 +144,9 @@ this.imageList = new System.Windows.Forms.ImageList(this.components); this.previewPictureBox = new PckStudio.ToolboxItems.InterpolationPictureBox(); this.LittleEndianCheckBox = new MetroFramework.Controls.MetroCheckBox(); - this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.videosToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.howToMakeABasicSkinPackToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.howToMakeACustomSkinModelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.howToMakeCustomSkinModelsbedrockToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.howToMakeCustomMusicToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.howToInstallPcksDirectlyToWiiUToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.pckCenterReleaseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.howPCKsWorkToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.donateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toNobledezJackToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toPhoenixARCDeveloperToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.forMattNLContributorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.installationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.fAQToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); logoPictureBox = new System.Windows.Forms.PictureBox(); + toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); ((System.ComponentModel.ISupportInitialize)(logoPictureBox)).BeginInit(); this.contextMenuPCKEntries.SuspendLayout(); this.menuStrip.SuspendLayout(); @@ -626,6 +625,132 @@ resources.ApplyResources(this.trelloBoardToolStripMenuItem, "trelloBoardToolStripMenuItem"); this.trelloBoardToolStripMenuItem.Click += new System.EventHandler(this.trelloBoardToolStripMenuItem_Click); // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.aboutToolStripMenuItem, + toolStripSeparator1, + this.videosToolStripMenuItem, + this.donateToolStripMenuItem, + toolStripSeparator3, + this.settingsToolStripMenuItem}); + this.helpToolStripMenuItem.ForeColor = System.Drawing.Color.Silver; + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + resources.ApplyResources(this.helpToolStripMenuItem, "helpToolStripMenuItem"); + // + // aboutToolStripMenuItem + // + resources.ApplyResources(this.aboutToolStripMenuItem, "aboutToolStripMenuItem"); + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(toolStripSeparator1, "toolStripSeparator1"); + // + // videosToolStripMenuItem + // + this.videosToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.howToMakeABasicSkinPackToolStripMenuItem, + this.howToMakeACustomSkinModelToolStripMenuItem, + this.howToMakeCustomSkinModelsbedrockToolStripMenuItem, + this.howToMakeCustomMusicToolStripMenuItem, + this.howToInstallPcksDirectlyToWiiUToolStripMenuItem, + this.pckCenterReleaseToolStripMenuItem, + this.howPCKsWorkToolStripMenuItem}); + this.videosToolStripMenuItem.ForeColor = System.Drawing.Color.Black; + resources.ApplyResources(this.videosToolStripMenuItem, "videosToolStripMenuItem"); + this.videosToolStripMenuItem.Name = "videosToolStripMenuItem"; + // + // howToMakeABasicSkinPackToolStripMenuItem + // + this.howToMakeABasicSkinPackToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Youtube; + this.howToMakeABasicSkinPackToolStripMenuItem.Name = "howToMakeABasicSkinPackToolStripMenuItem"; + resources.ApplyResources(this.howToMakeABasicSkinPackToolStripMenuItem, "howToMakeABasicSkinPackToolStripMenuItem"); + this.howToMakeABasicSkinPackToolStripMenuItem.Click += new System.EventHandler(this.howToMakeABasicSkinPackToolStripMenuItem_Click); + // + // howToMakeACustomSkinModelToolStripMenuItem + // + this.howToMakeACustomSkinModelToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Youtube; + this.howToMakeACustomSkinModelToolStripMenuItem.Name = "howToMakeACustomSkinModelToolStripMenuItem"; + resources.ApplyResources(this.howToMakeACustomSkinModelToolStripMenuItem, "howToMakeACustomSkinModelToolStripMenuItem"); + this.howToMakeACustomSkinModelToolStripMenuItem.Click += new System.EventHandler(this.howToMakeACustomSkinModelToolStripMenuItem_Click); + // + // howToMakeCustomSkinModelsbedrockToolStripMenuItem + // + this.howToMakeCustomSkinModelsbedrockToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Youtube; + this.howToMakeCustomSkinModelsbedrockToolStripMenuItem.Name = "howToMakeCustomSkinModelsbedrockToolStripMenuItem"; + resources.ApplyResources(this.howToMakeCustomSkinModelsbedrockToolStripMenuItem, "howToMakeCustomSkinModelsbedrockToolStripMenuItem"); + this.howToMakeCustomSkinModelsbedrockToolStripMenuItem.Click += new System.EventHandler(this.howToMakeCustomSkinModelsbedrockToolStripMenuItem_Click); + // + // howToMakeCustomMusicToolStripMenuItem + // + this.howToMakeCustomMusicToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Youtube; + this.howToMakeCustomMusicToolStripMenuItem.Name = "howToMakeCustomMusicToolStripMenuItem"; + resources.ApplyResources(this.howToMakeCustomMusicToolStripMenuItem, "howToMakeCustomMusicToolStripMenuItem"); + this.howToMakeCustomMusicToolStripMenuItem.Click += new System.EventHandler(this.howToMakeCustomMusicToolStripMenuItem_Click); + // + // howToInstallPcksDirectlyToWiiUToolStripMenuItem + // + this.howToInstallPcksDirectlyToWiiUToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Youtube; + this.howToInstallPcksDirectlyToWiiUToolStripMenuItem.Name = "howToInstallPcksDirectlyToWiiUToolStripMenuItem"; + resources.ApplyResources(this.howToInstallPcksDirectlyToWiiUToolStripMenuItem, "howToInstallPcksDirectlyToWiiUToolStripMenuItem"); + this.howToInstallPcksDirectlyToWiiUToolStripMenuItem.Click += new System.EventHandler(this.howToInstallPcksDirectlyToWiiUToolStripMenuItem_Click); + // + // pckCenterReleaseToolStripMenuItem + // + this.pckCenterReleaseToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Youtube; + this.pckCenterReleaseToolStripMenuItem.Name = "pckCenterReleaseToolStripMenuItem"; + resources.ApplyResources(this.pckCenterReleaseToolStripMenuItem, "pckCenterReleaseToolStripMenuItem"); + this.pckCenterReleaseToolStripMenuItem.Click += new System.EventHandler(this.pckCenterReleaseToolStripMenuItem_Click); + // + // howPCKsWorkToolStripMenuItem + // + this.howPCKsWorkToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Youtube; + this.howPCKsWorkToolStripMenuItem.Name = "howPCKsWorkToolStripMenuItem"; + resources.ApplyResources(this.howPCKsWorkToolStripMenuItem, "howPCKsWorkToolStripMenuItem"); + this.howPCKsWorkToolStripMenuItem.Click += new System.EventHandler(this.howPCKsWorkToolStripMenuItem_Click); + // + // donateToolStripMenuItem + // + this.donateToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toNobledezJackToolStripMenuItem, + this.toPhoenixARCDeveloperToolStripMenuItem, + this.forMattNLContributorToolStripMenuItem}); + this.donateToolStripMenuItem.Name = "donateToolStripMenuItem"; + resources.ApplyResources(this.donateToolStripMenuItem, "donateToolStripMenuItem"); + // + // toNobledezJackToolStripMenuItem + // + this.toNobledezJackToolStripMenuItem.Name = "toNobledezJackToolStripMenuItem"; + resources.ApplyResources(this.toNobledezJackToolStripMenuItem, "toNobledezJackToolStripMenuItem"); + this.toNobledezJackToolStripMenuItem.Click += new System.EventHandler(this.toNobledezJackToolStripMenuItem_Click); + // + // toPhoenixARCDeveloperToolStripMenuItem + // + this.toPhoenixARCDeveloperToolStripMenuItem.Name = "toPhoenixARCDeveloperToolStripMenuItem"; + resources.ApplyResources(this.toPhoenixARCDeveloperToolStripMenuItem, "toPhoenixARCDeveloperToolStripMenuItem"); + this.toPhoenixARCDeveloperToolStripMenuItem.Click += new System.EventHandler(this.toPhoenixARCDeveloperToolStripMenuItem_Click); + // + // forMattNLContributorToolStripMenuItem + // + this.forMattNLContributorToolStripMenuItem.Name = "forMattNLContributorToolStripMenuItem"; + resources.ApplyResources(this.forMattNLContributorToolStripMenuItem, "forMattNLContributorToolStripMenuItem"); + this.forMattNLContributorToolStripMenuItem.Click += new System.EventHandler(this.forMattNLContributorToolStripMenuItem_Click); + // + // toolStripSeparator3 + // + toolStripSeparator3.Name = "toolStripSeparator3"; + resources.ApplyResources(toolStripSeparator3, "toolStripSeparator3"); + // + // settingsToolStripMenuItem + // + this.settingsToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ranch; + this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; + resources.ApplyResources(this.settingsToolStripMenuItem, "settingsToolStripMenuItem"); + this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click); + // // contextMenuMetaTree // this.contextMenuMetaTree.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -959,151 +1084,6 @@ this.LittleEndianCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; this.LittleEndianCheckBox.UseSelectable = true; // - // aboutToolStripMenuItem - // - resources.ApplyResources(this.aboutToolStripMenuItem, "aboutToolStripMenuItem"); - this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; - this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); - // - // videosToolStripMenuItem - // - this.videosToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.howToMakeABasicSkinPackToolStripMenuItem, - this.howToMakeACustomSkinModelToolStripMenuItem, - this.howToMakeCustomSkinModelsbedrockToolStripMenuItem, - this.howToMakeCustomMusicToolStripMenuItem, - this.howToInstallPcksDirectlyToWiiUToolStripMenuItem, - this.pckCenterReleaseToolStripMenuItem, - this.howPCKsWorkToolStripMenuItem}); - this.videosToolStripMenuItem.ForeColor = System.Drawing.Color.Black; - resources.ApplyResources(this.videosToolStripMenuItem, "videosToolStripMenuItem"); - this.videosToolStripMenuItem.Name = "videosToolStripMenuItem"; - // - // howToMakeABasicSkinPackToolStripMenuItem - // - this.howToMakeABasicSkinPackToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Youtube; - this.howToMakeABasicSkinPackToolStripMenuItem.Name = "howToMakeABasicSkinPackToolStripMenuItem"; - resources.ApplyResources(this.howToMakeABasicSkinPackToolStripMenuItem, "howToMakeABasicSkinPackToolStripMenuItem"); - this.howToMakeABasicSkinPackToolStripMenuItem.Click += new System.EventHandler(this.howToMakeABasicSkinPackToolStripMenuItem_Click); - // - // howToMakeACustomSkinModelToolStripMenuItem - // - this.howToMakeACustomSkinModelToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Youtube; - this.howToMakeACustomSkinModelToolStripMenuItem.Name = "howToMakeACustomSkinModelToolStripMenuItem"; - resources.ApplyResources(this.howToMakeACustomSkinModelToolStripMenuItem, "howToMakeACustomSkinModelToolStripMenuItem"); - this.howToMakeACustomSkinModelToolStripMenuItem.Click += new System.EventHandler(this.howToMakeACustomSkinModelToolStripMenuItem_Click); - // - // howToMakeCustomSkinModelsbedrockToolStripMenuItem - // - this.howToMakeCustomSkinModelsbedrockToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Youtube; - this.howToMakeCustomSkinModelsbedrockToolStripMenuItem.Name = "howToMakeCustomSkinModelsbedrockToolStripMenuItem"; - resources.ApplyResources(this.howToMakeCustomSkinModelsbedrockToolStripMenuItem, "howToMakeCustomSkinModelsbedrockToolStripMenuItem"); - this.howToMakeCustomSkinModelsbedrockToolStripMenuItem.Click += new System.EventHandler(this.howToMakeCustomSkinModelsbedrockToolStripMenuItem_Click); - // - // howToMakeCustomMusicToolStripMenuItem - // - this.howToMakeCustomMusicToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Youtube; - this.howToMakeCustomMusicToolStripMenuItem.Name = "howToMakeCustomMusicToolStripMenuItem"; - resources.ApplyResources(this.howToMakeCustomMusicToolStripMenuItem, "howToMakeCustomMusicToolStripMenuItem"); - this.howToMakeCustomMusicToolStripMenuItem.Click += new System.EventHandler(this.howToMakeCustomMusicToolStripMenuItem_Click); - // - // howToInstallPcksDirectlyToWiiUToolStripMenuItem - // - this.howToInstallPcksDirectlyToWiiUToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Youtube; - this.howToInstallPcksDirectlyToWiiUToolStripMenuItem.Name = "howToInstallPcksDirectlyToWiiUToolStripMenuItem"; - resources.ApplyResources(this.howToInstallPcksDirectlyToWiiUToolStripMenuItem, "howToInstallPcksDirectlyToWiiUToolStripMenuItem"); - this.howToInstallPcksDirectlyToWiiUToolStripMenuItem.Click += new System.EventHandler(this.howToInstallPcksDirectlyToWiiUToolStripMenuItem_Click); - // - // pckCenterReleaseToolStripMenuItem - // - this.pckCenterReleaseToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Youtube; - this.pckCenterReleaseToolStripMenuItem.Name = "pckCenterReleaseToolStripMenuItem"; - resources.ApplyResources(this.pckCenterReleaseToolStripMenuItem, "pckCenterReleaseToolStripMenuItem"); - this.pckCenterReleaseToolStripMenuItem.Click += new System.EventHandler(this.pckCenterReleaseToolStripMenuItem_Click); - // - // howPCKsWorkToolStripMenuItem - // - this.howPCKsWorkToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Youtube; - this.howPCKsWorkToolStripMenuItem.Name = "howPCKsWorkToolStripMenuItem"; - resources.ApplyResources(this.howPCKsWorkToolStripMenuItem, "howPCKsWorkToolStripMenuItem"); - this.howPCKsWorkToolStripMenuItem.Click += new System.EventHandler(this.howPCKsWorkToolStripMenuItem_Click); - // - // donateToolStripMenuItem - // - this.donateToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toNobledezJackToolStripMenuItem, - this.toPhoenixARCDeveloperToolStripMenuItem, - this.forMattNLContributorToolStripMenuItem}); - this.donateToolStripMenuItem.Name = "donateToolStripMenuItem"; - resources.ApplyResources(this.donateToolStripMenuItem, "donateToolStripMenuItem"); - // - // toNobledezJackToolStripMenuItem - // - this.toNobledezJackToolStripMenuItem.Name = "toNobledezJackToolStripMenuItem"; - resources.ApplyResources(this.toNobledezJackToolStripMenuItem, "toNobledezJackToolStripMenuItem"); - this.toNobledezJackToolStripMenuItem.Click += new System.EventHandler(this.toNobledezJackToolStripMenuItem_Click); - // - // toPhoenixARCDeveloperToolStripMenuItem - // - this.toPhoenixARCDeveloperToolStripMenuItem.Name = "toPhoenixARCDeveloperToolStripMenuItem"; - resources.ApplyResources(this.toPhoenixARCDeveloperToolStripMenuItem, "toPhoenixARCDeveloperToolStripMenuItem"); - this.toPhoenixARCDeveloperToolStripMenuItem.Click += new System.EventHandler(this.toPhoenixARCDeveloperToolStripMenuItem_Click); - // - // forMattNLContributorToolStripMenuItem - // - this.forMattNLContributorToolStripMenuItem.Name = "forMattNLContributorToolStripMenuItem"; - resources.ApplyResources(this.forMattNLContributorToolStripMenuItem, "forMattNLContributorToolStripMenuItem"); - this.forMattNLContributorToolStripMenuItem.Click += new System.EventHandler(this.forMattNLContributorToolStripMenuItem_Click); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); - // - // installationToolStripMenuItem - // - resources.ApplyResources(this.installationToolStripMenuItem, "installationToolStripMenuItem"); - this.installationToolStripMenuItem.Name = "installationToolStripMenuItem"; - // - // fAQToolStripMenuItem1 - // - resources.ApplyResources(this.fAQToolStripMenuItem1, "fAQToolStripMenuItem1"); - this.fAQToolStripMenuItem1.Name = "fAQToolStripMenuItem1"; - this.fAQToolStripMenuItem1.Click += new System.EventHandler(this.fAQToolStripMenuItem1_Click); - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); - // - // settingsToolStripMenuItem - // - this.settingsToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ranch; - this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; - resources.ApplyResources(this.settingsToolStripMenuItem, "settingsToolStripMenuItem"); - this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click); - // - // helpToolStripMenuItem - // - this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.aboutToolStripMenuItem, - this.toolStripSeparator1, - this.videosToolStripMenuItem, - this.donateToolStripMenuItem, - this.toolStripSeparator2, - this.installationToolStripMenuItem, - this.fAQToolStripMenuItem1, - this.toolStripSeparator3, - this.settingsToolStripMenuItem}); - this.helpToolStripMenuItem.ForeColor = System.Drawing.Color.Silver; - this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; - resources.ApplyResources(this.helpToolStripMenuItem, "helpToolStripMenuItem"); - // // MainForm // this.ApplyImageInvert = true; @@ -1240,7 +1220,6 @@ private System.Windows.Forms.ToolStripMenuItem addANIMEntryToolStripMenuItem1; private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripMenuItem videosToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem howToMakeABasicSkinPackToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem howToMakeACustomSkinModelToolStripMenuItem; @@ -1253,10 +1232,6 @@ private System.Windows.Forms.ToolStripMenuItem toNobledezJackToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem toPhoenixARCDeveloperToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem forMattNLContributorToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; - private System.Windows.Forms.ToolStripMenuItem installationToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem fAQToolStripMenuItem1; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem; } } diff --git a/PCK-Studio/MainForm.resx b/PCK-Studio/MainForm.resx index 3911f9c2..6d014a15 100644 --- a/PCK-Studio/MainForm.resx +++ b/PCK-Studio/MainForm.resx @@ -812,6 +812,29 @@ 116, 17 + + 158, 224 + + + contextMenuPCKEntries + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAA3SURBVDhPY/j/ + /z9FGKsgGIsCKWSMTQ0QYxUE45FmALpiYvFwMgAbxqIYG8YqCMajBhCJ/zMAAPGwpV/Xje8RAAAAAElF + TkSuQmCC + + + + 157, 22 + + + Create + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -900,19 +923,20 @@ EntityMaterials.bin - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAA3SURBVDhPY/j/ - /z9FGKsgGIsCKWSMTQ0QYxUE45FmALpiYvFwMgAbxqIYG8YqCMajBhCJ/zMAAPGwpV/Xje8RAAAAAElF + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAABzSURBVDhPpYzB + DQAhCARp4hr3Txu254WTjYRb9cEmk/BgRjBVHTv85Twmgt77PcJEYIFrhIkAgWOEiSAGthEmgtbaD9fW + mBgpB4xywCgFxiMf5YDdrq3l5wjEjKtzTARMNlydY2IGot2ureVnRjkQmZbICyCi7XU5cfqKAAAAAElF TkSuQmCC - + 157, 22 - - Create + + Import @@ -966,20 +990,11 @@ Add File - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAABzSURBVDhPpYzB - DQAhCARp4hr3Txu254WTjYRb9cEmk/BgRjBVHTv85Twmgt77PcJEYIFrhIkAgWOEiSAGthEmgtbaD9fW - mBgpB4xywCgFxiMf5YDdrq3l5wjEjKtzTARMNlydY2IGot2ureVnRjkQmZbICyCi7XU5cfqKAAAAAElF - TkSuQmCC - - - + 157, 22 - - Import + + Export 186, 22 @@ -987,11 +1002,11 @@ Export as 3DS Texture - + 157, 22 - - Export + + Set File Type 222, 22 @@ -1065,11 +1080,11 @@ Entity Materials File (.BIN) - + 157, 22 - - Set File Type + + Misc. Functions 210, 22 @@ -1089,12 +1104,6 @@ Correct Skin Decimals - - 157, 22 - - - Misc. Functions - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -1160,15 +1169,6 @@ Delete - - 158, 224 - - - contextMenuPCKEntries - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 17, 17 @@ -1181,371 +1181,24 @@ None - - 151, 22 - - - Skin Pack - - - 151, 22 - - - Texture Pack - - - 151, 22 - - - Mash-Up Pack - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADuSURBVFhH7ZbB - CsMgEERDbv5A/v83e2jNTmCKGdegJk0heHgUn7vrKBQyxRj/iivJPM9WMTWjc45wJeAwhAghVJEG1nkl - XNkziLCvtteXphFCfQ08nOi+4kvTeFL1NfBQ/BLuefjS9NkAADOwPnpNX14UADBEaV4mNnkygN34Y/1v - AgeWZXll9So2eTLAEVm9ik2a7g1Qgn9t9bvFV/4gAOZdHgB1RPeUEeAZAeBr0d4R4JIACuqI7ikjwDMD - tDACNAfo/Sou0fQ9wGKvoQfO8i61W6SkTXi+XtLLgOwcFSna3It3c+LKO3HlfcRpBa3JBjU5E8DiAAAA - AElFTkSuQmCC - - - - 186, 22 - - - New - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAABGSURBVDhPYxgc - 4P8Chv8YeKWUIFSaMPi/W+r//1MapOGTOixQ7UADsCkgAkO1jxoAAtgkicFQ7cPCAGLB////wXgwAQYG - AOrUrx4HdAXuAAAAAElFTkSuQmCC - - - - Ctrl+O - - - 186, 22 - - - Open - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABVSURBVDhPvYwB - CgAgCAP9/6cLg0BlS4XqQGjmTn4xyLQ4CtCnnQ3b+0CIZddxARBL9r1wIbCP401JgMrwFi1RWSkJWFlJ - BaeyUhYwUkHGO0FnbiEyAQxPT7Gcb/TQAAAAAElFTkSuQmCC - - - - 186, 22 - - - Extract - - - 160, 22 - - - Full box support - - - 186, 22 - - - Pack Settings - - - False - - - False - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 - QLt++3yTGbf/Fm599P/Nh49wfPXxq/+rTt37f+Dak/8gOSBgAGEMANIMxGBFyAasPf/0v8GE8//z1t8C - y4HU4DIALIluwLpLL+HiMANAGKoNAWASCavv/n/57gPcgOvP3oENOXj7NViOoAFGU6791+k4ghWD5Aga - QCyGakMAkODcU89R/I8Ng9TgNADk14dPn/8/c+kqVgySgwUqVBsCwAx49urN/zsPHmPFIDmaGvAXJInN - 38gYasBfqDYE0K7dOn/Wvut/sfkdGYPUgJI9VNuAAwYGAGn6yvdevWgPAAAAAElFTkSuQmCC - - - - Ctrl+S - - - 186, 22 - - - Save - - - False - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 - IEt7+/x6k9t/lxQ++v/2zUc4vnv11f+Dq+79v3DgyX+QHBAwgDAGAGkGYrAiZAOOrX36v9zg/P95ebfA - ciA1uAwAS6IbcGLdS7g4zAAQhmpDAJjEjIS7/1+//AA34MH1d2BDLh98DZYjaECN0bX/BTpHsGKQHEED - iMVQbQgAEtw39zmK/7FhkBqcBoD8+vjh8//nz1zFikFysECFakMAmAEvnr35f//OY6wYJEdTA/6CJLH5 - GxlDDfgL1YYAWdpb52+bdf0vNr8jY5AaULKHahtwwMAAAPeIxBbbnvcfAAAAAElFTkSuQmCC - - - - Ctrl+Shift+S - - - 186, 22 - - - Save As - - - 186, 22 - - - Close - - - False - 37, 20 File - - False - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAACRSURBVFhH7Y45 - DoAwDATz/09DZWRF62utUIBHmgayk6xhaHBtvs5/HmBdor97/1roUEcaFGOkQTHGFpVg5WyaarB6PoSJ - MZsHPd7NgrZiCBqJWdBWDEEjMQvaiiFoJGZBW7EMM2Y2JjqWCVbPh+xBL1o5mwIFGWlQjJEGxRhbWCH9 - 3ft3DH3J0Yss5gHDF1jrBvn6/wGuM1ZgAAAAAElFTkSuQmCC - - - - Ctrl+Q - - - 192, 22 - - - Quick Change - - - False - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAAJeSURBVDhPhVFp - TxNRFH1/RbGdlsQElaWzdaQgbadFtnkznWlLCm2Q2UCxTqdFFAzTRONSYheIoCjRpmoErBiKW/hi4q+q - bxpoSPzgyfnw7r3nvHvveyD92W/UQ5l9Vt6h5B1S2/Wntnr1977lHxDltVr/7FtaqTLJbc/YU+f8x0GQ - rgfmPgw9aoj390dX6uMSgWlVMvkGT7zqLR5PF34lzL3w9HZXunZNfuedr/nAw+9RnnZt/dHl1+SN2lWO - cS3sDsVxbOEgsPwTFo9Tz38nRdIRK15MvvRIlBtIFKboSoTGRMp5e4+VaEeEdoi0Y2r7kkBjyqcBjsEW - x3s4xomUWUiAkhoweLqiBRurEFLujVl/lvfkICESFyK0M0qc1xU5KxAlOSzQbtuQm+iWiHMVjd2Q++9A - b0X3C2SHSHYIpNPgGZMnRbIzLeBZrs8QmH1rEuw+iEVo1xLfl+O6nqzcvQd7MpDay6cQm2fwTBnO8sQL - xQcaFq+GLm/eGtm8OfY4N2NN+VBhbWawmhmzhQDYbDatSSafGECDgC/WFFLUrdTBanRNGUbLoDADiTVt - 5KwBJQvaaFG9Dspq0Ji4YghEWQtlJvCCHLJ1bZwa2rANJZ2VvO5FAUdEh1a6pfuXJ4a5EdTxWz6GaPL4 - fw0hkydysK+khdFUh5ZkG9o41bUBDA6HjGsd7Qo9ZR0tzR5ZcdRwietu1U8M6NKv+XjDioIM5ylqYfRB - izwRoZwmpCoqW9KDJjwzW7N5aMXLGoveEBRV1uQ9EarzKB/LQlyiXOj/JS+GmtiGU6BwXQ2sa8G/5oRp - fQPDL0EAAAAASUVORK5CYII= - - - - 192, 22 - - - Convert to Bedrock - 39, 20 Edit - - 195, 22 - - - Add Custom Pack Icon - - - 195, 22 - - - Pck Manager - - - 145, 22 - - - Wav -> Binka - - - 145, 22 - - - Binka -> Wav - - - 195, 22 - - - Audio Converter - 46, 20 Tools - - 223, 22 - - - PCK Center - - - - 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 - - - - 223, 22 - - - Development Discord Server - - - 223, 22 - - - Trello Board - 63, 20 @@ -2021,9 +1674,424 @@ About + + False + 177, 6 + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAKdJREFUOE+1 + jzEKwzAQBNUEXKQIBOwifcgTUvkDbt2p9qP0Ev1E31FYkVXOx2FLRRYWi7NnTnZ/z/MxZPY7aguhbZlq + myQafL+ubRINshCwnO0kFqi3HkpwWOf7DkC1RBfvx9slV4ElscqbxBiz9/4nwOBIQjCEUL7FswhwDYAp + JVMiN0oYs/ILiCXRIGHOwVQBoiXsKSgjJdzaBMpQ0g3KEOoG++PcBx9PFJGNjU4vAAAAAElFTkSuQmCC + + + + 180, 22 + + + Tutorials + + + 180, 22 + + + Buy a coffee + + + False + + + 177, 6 + + + Alt+S + + + 180, 22 + + + Settings + + + 44, 20 + + + Help + + + 24, 44 + + + 1016, 24 + + + 2 + + + MainMenuStrip + + + menuStrip + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADuSURBVFhH7ZbB + CsMgEERDbv5A/v83e2jNTmCKGdegJk0heHgUn7vrKBQyxRj/iivJPM9WMTWjc45wJeAwhAghVJEG1nkl + XNkziLCvtteXphFCfQ08nOi+4kvTeFL1NfBQ/BLuefjS9NkAADOwPnpNX14UADBEaV4mNnkygN34Y/1v + AgeWZXll9So2eTLAEVm9ik2a7g1Qgn9t9bvFV/4gAOZdHgB1RPeUEeAZAeBr0d4R4JIACuqI7ikjwDMD + tDACNAfo/Sou0fQ9wGKvoQfO8i61W6SkTXi+XtLLgOwcFSna3It3c+LKO3HlfcRpBa3JBjU5E8DiAAAA + AElFTkSuQmCC + + + + 186, 22 + + + New + + + 151, 22 + + + Skin Pack + + + 151, 22 + + + Texture Pack + + + 151, 22 + + + Mash-Up Pack + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAABGSURBVDhPYxgc + 4P8Chv8YeKWUIFSaMPi/W+r//1MapOGTOixQ7UADsCkgAkO1jxoAAtgkicFQ7cPCAGLB////wXgwAQYG + AOrUrx4HdAXuAAAAAElFTkSuQmCC + + + + Ctrl+O + + + 186, 22 + + + Open + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABVSURBVDhPvYwB + CgAgCAP9/6cLg0BlS4XqQGjmTn4xyLQ4CtCnnQ3b+0CIZddxARBL9r1wIbCP401JgMrwFi1RWSkJWFlJ + BaeyUhYwUkHGO0FnbiEyAQxPT7Gcb/TQAAAAAElFTkSuQmCC + + + + 186, 22 + + + Extract + + + 186, 22 + + + Pack Settings + + + False + + + 160, 22 + + + Full box support + + + False + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 + QLt++3yTGbf/Fm599P/Nh49wfPXxq/+rTt37f+Dak/8gOSBgAGEMANIMxGBFyAasPf/0v8GE8//z1t8C + y4HU4DIALIluwLpLL+HiMANAGKoNAWASCavv/n/57gPcgOvP3oENOXj7NViOoAFGU6791+k4ghWD5Aga + QCyGakMAkODcU89R/I8Ng9TgNADk14dPn/8/c+kqVgySgwUqVBsCwAx49urN/zsPHmPFIDmaGvAXJInN + 38gYasBfqDYE0K7dOn/Wvut/sfkdGYPUgJI9VNuAAwYGAGn6yvdevWgPAAAAAElFTkSuQmCC + + + + Ctrl+S + + + 186, 22 + + + Save + + + False + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 + IEt7+/x6k9t/lxQ++v/2zUc4vnv11f+Dq+79v3DgyX+QHBAwgDAGAGkGYrAiZAOOrX36v9zg/P95ebfA + ciA1uAwAS6IbcGLdS7g4zAAQhmpDAJjEjIS7/1+//AA34MH1d2BDLh98DZYjaECN0bX/BTpHsGKQHEED + iMVQbQgAEtw39zmK/7FhkBqcBoD8+vjh8//nz1zFikFysECFakMAmAEvnr35f//OY6wYJEdTA/6CJLH5 + GxlDDfgL1YYAWdpb52+bdf0vNr8jY5AaULKHahtwwMAAAPeIxBbbnvcfAAAAAElFTkSuQmCC + + + + Ctrl+Shift+S + + + 186, 22 + + + Save As + + + 186, 22 + + + Close + + + False + + + False + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAACRSURBVFhH7Y45 + DoAwDATz/09DZWRF62utUIBHmgayk6xhaHBtvs5/HmBdor97/1roUEcaFGOkQTHGFpVg5WyaarB6PoSJ + MZsHPd7NgrZiCBqJWdBWDEEjMQvaiiFoJGZBW7EMM2Y2JjqWCVbPh+xBL1o5mwIFGWlQjJEGxRhbWCH9 + 3ft3DH3J0Yss5gHDF1jrBvn6/wGuM1ZgAAAAAElFTkSuQmCC + + + + Ctrl+Q + + + 192, 22 + + + Quick Change + + + False + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAAJeSURBVDhPhVFp + TxNRFH1/RbGdlsQElaWzdaQgbadFtnkznWlLCm2Q2UCxTqdFFAzTRONSYheIoCjRpmoErBiKW/hi4q+q + bxpoSPzgyfnw7r3nvHvveyD92W/UQ5l9Vt6h5B1S2/Wntnr1977lHxDltVr/7FtaqTLJbc/YU+f8x0GQ + rgfmPgw9aoj390dX6uMSgWlVMvkGT7zqLR5PF34lzL3w9HZXunZNfuedr/nAw+9RnnZt/dHl1+SN2lWO + cS3sDsVxbOEgsPwTFo9Tz38nRdIRK15MvvRIlBtIFKboSoTGRMp5e4+VaEeEdoi0Y2r7kkBjyqcBjsEW + x3s4xomUWUiAkhoweLqiBRurEFLujVl/lvfkICESFyK0M0qc1xU5KxAlOSzQbtuQm+iWiHMVjd2Q++9A + b0X3C2SHSHYIpNPgGZMnRbIzLeBZrs8QmH1rEuw+iEVo1xLfl+O6nqzcvQd7MpDay6cQm2fwTBnO8sQL + xQcaFq+GLm/eGtm8OfY4N2NN+VBhbWawmhmzhQDYbDatSSafGECDgC/WFFLUrdTBanRNGUbLoDADiTVt + 5KwBJQvaaFG9Dspq0Ji4YghEWQtlJvCCHLJ1bZwa2rANJZ2VvO5FAUdEh1a6pfuXJ4a5EdTxWz6GaPL4 + fw0hkydysK+khdFUh5ZkG9o41bUBDA6HjGsd7Qo9ZR0tzR5ZcdRwietu1U8M6NKv+XjDioIM5ylqYfRB + izwRoZwmpCoqW9KDJjwzW7N5aMXLGoveEBRV1uQ9EarzKB/LQlyiXOj/JS+GmtiGU6BwXQ2sa8G/5oRp + fQPDL0EAAAAASUVORK5CYII= + + + + 192, 22 + + + Convert to Bedrock + + + 195, 22 + + + Add Custom Pack Icon + + + 195, 22 + + + Pck Manager + + + 195, 22 + + + Audio Converter + + + 145, 22 + + + Wav -> Binka + + + 145, 22 + + + Binka -> Wav + + + 223, 22 + + + PCK Center + + + + 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 + + + + 223, 22 + + + Development Discord Server + + + 223, 22 + + + Trello Board + 312, 22 @@ -2066,20 +2134,6 @@ How PCKs work - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAKdJREFUOE+1 - jzEKwzAQBNUEXKQIBOwifcgTUvkDbt2p9qP0Ev1E31FYkVXOx2FLRRYWi7NnTnZ/z/MxZPY7aguhbZlq - myQafL+ubRINshCwnO0kFqi3HkpwWOf7DkC1RBfvx9slV4ElscqbxBiz9/4nwOBIQjCEUL7FswhwDYAp - JVMiN0oYs/ILiCXRIGHOwVQBoiXsKSgjJdzaBMpQ0g3KEOoG++PcBx9PFJGNjU4vAAAAAElFTkSuQmCC - - - - 180, 22 - - - Tutorials - 253, 22 @@ -2098,2069 +2152,32 @@ For MattNL (Other Developer) - - 180, 22 - - - Buy a coffee - - - 177, 6 - - - False - - - - iVBORw0KGgoAAAANSUhEUgAABkAAAAZACAYAAAAhDI6nAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAi+1JREFUeF7s3atXXNu67mH+qLi4WGwUPmJaLB6FxMVGYbFxyJhYNDou+rTz9cWc - e17yJeFS1cflfZ7Wfq2dy95rzQnU6EW91KgTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWMzb6ry6 - qj7+o/F/v6j+qMb/DAAAAAAAwKqNweO2+l79v2f0UH2qzioAAAAAAIBFjXdwjHd1jAGjGzZe2hhRTisA - AAAAAIBpPlT3VTdeHLIxrIx3lQAAAAAAABzN+NyOb1U3VhyzMYSM0QUAAAAAAOBgxq2uvlbdODGzuwoA - AAAAAODVrqpujFiq8QHr450oAAAAAAAAL/Kl6kaINfSpAgAAAAAAeLI31fjcjW54WFNuiQUAAAAAADzJ - aTVuM9UNDmtsfDYJAAAAAADAT72rtjR+/NW4VRcAAAAAAEBri+PHX7kdFgAAAAAA8IMtfObH77quAAAA - AAAA/me8e6IbFLbYWQUAAAAAAIS7rLohYauN23gBAAAAAADhuhFh691UAAAAAABAqD3d+uq/nVYAAAAA - AECY91U3HOylrxUAAAAAABBmDATdcLCnvAsEAAAAAACC7P3dH3/1pQIAAAAAAEJ8rrrBYI+9qQAAAAAA - gADdULDXrioAAAAAAGDnLqpuKNhr3yoAAAAAAGDnxudidEPBnntbAQAAAAAAO9YNBHvvvAIAAAAAAHbq - fdUNBHvvtgIAAAAAAHbqsuoGgr3nc0AAAAAAAGDHxjshuoEgIQAAAAAAYKfuq24cSAgAAAAAANip71U3 - DiR0WgEAAAAAADvUDQMpnVUAAAAAAMAOdcNASgYQAAAAAADYqW4YSOlDBQAAAAAA7FA3DKT0RwUAAAAA - AOxQNwykZAABAAAAAICd6oaBlAwgAAAAAACwU90wkJIBBAAAAAAAdqobBlIygAAAAAAAwE51w0BKBhAA - AAAAANipbhhIyQACAAAAAAA71Q0DKRlAAAAAAABgp7phICUDCAAAAAAA7FQ3DKRkAAEAAAAAgJ3qhoGU - DCAAAAAAALBT3TCQkgEEAAAAAAB2qhsGUjKAAAAAAADATnXDQEoGEAAAAAAA2KluGEjJAAIAAAAAADvV - DQMpGUAAAAAAAGCnumEgJQMIAAAAAADsVDcMpGQAAQAAAACAneqGgZQMIAAAAAAAsFPdMJCSAQQAAAAA - AHaqGwZSMoAAAAAAAMBOdcNASgYQAAAAAADYqW4YSMkAAgAAAAAAO9UNAykZQAAAAAAAYKe6YSAlAwgA - AAAAAOxUNwykZAABAAAAAICd6oaBlAwgAAAAAACwU90wkJIBBAAAAAAAdqobBlIygAAAAAAAwE51w0BK - BhAAAAAAANipbhhIyQACAAAAAAA71Q0DKRlAAAAAAABgp7phICUDCAAAAAAA7FQ3DKRkAAEAAAAAgJ3q - hoGUDCAAAAAAALBT3TCQkgEEAAAAAAB2qhsGUjKAAAAAAADATnXDQEoGEAAAAAAA2KluGEjJAAIAAAAA - ADvVDQMpGUAAAAAAAGCnumEgJQMIAAAAAADsVDcMpGQAAQAAAACAneqGgZQMIAAAAAAAsFPdMJCSAQQA - AAAAAHaqGwZSMoAAAAAAAMBOdcNASgYQAAAAAADYqW4YSMkAAgAAAAAAO9UNAykZQAAAAAAAYKe6YSAl - AwgAAAAAAOxUNwykZAABAAAAAICd6oaBlAwgAAAAAACwU90wkJIBBAAAAAAAdqobBlIygAAAAAAAwE51 - w0BKBhAAAAAAANipbhhIyQACAAAAAAA71Q0DKRlAAAAAAABgp7phICUDCAAAAAAA7FQ3DKRkAAEAAAAA - gJ3qhoGUDCAAAAAAALBT3TCQkgEEAAAAAAB2qhsGUjKAAAAAAADATnXDQEoGEAAAAAAA2KluGEjJAAIA - AAAAADvVDQMpGUAAAAAAAGCnumEgJQMIAAAAAADsVDcMpGQAAQAAAACAneqGgZQMIAAAAAAAsFPdMJCS - AQQAAAAAAHaqGwZSMoAAAAAAAMBOdcNASgYQAAAAAADYqW4YSMkAAgAAAAAAO9UNAykZQAAAAAAAYKe6 - YSAlAwgAAAAAAOxUNwykZAABAAAAAICd6oaBlAwgAAAAAACwU90wkJIBBAAAAAAAdqobBlIygAAAAAAA - wE51w0BKBhAAAAAAANipbhhIyQACAAAAAAA71Q0DKRlAAAAAAABgp7phICUDCAAAAAAA7FQ3DKRkAAEA - AAAAgJ3qhoGUDCAAAAAAALBT3TCQkgEEAAAAAAB2qhsGUjKAAAAAAADATnXDQEoGEAAAAAAA2KluGEjJ - AAIAAAAAADvVDQMpGUAAAAAAAGCnumEgJQMIAAAAAADsVDcMpGQAAQAAAACAneqGgZQMIAAAAAAAsFPd - MJCSAQQAAAAAAHaqGwZSMoAAAAAAAMBOdcNASgYQAAAAAADYqW4YSMkAAgAAAAAAO9UNAykZQAAAAAAA - YKe6YSAlAwgAAAAAAOxUNwykZAABAAAAAICd6oaBlAwgAAAAAACwU90wkJIBBAAAAAAAdqobBlIygAAA - AAAAwE51w0BKBhAAAAAAANipbhhIyQACAAAAAAA71Q0DKRlAAAAAAABgp7phICUDCAAAAAAA7FQ3DKRk - AAEAAAAAgJ3qhoGUDCAAAAAAALBT3TCQkgEEAAAAAAB2qhsGUjKAAAAAAADATnXDQEoGEAAAAAAA2Klu - GEjJAAIAAAAAADvVDQMpGUAAAAAAAGCnumEgJQMIAAAAAADsVDcMpGQAAQAAAACAneqGgZQMIAAAAAAA - sFPdMJCSAQQAAAAAAHaqGwZSMoAAAAAAAMBOdcNASgYQAAAAAADYqW4YSMkAAgAAAAAAO9UNAykZQAAA - AAAAYKe6YSAlAwgAAAAAAOxUNwykZAABAAAAAICd6oaBlAwgAAAAAACwU90wkJIBBAAAAAAAdqobBlIy - gAAAAAAAwE51w0BKBhAAAAAAANipbhhIyQACAAAAbMab6qy6qK6rj9VNdVt9rr5UXyVJq+qyYjndMJCS - AWQ5p1V3PZAkLdv4vXn8/jx+jx6/T4/Gc7UP1bsKAIBJxhOw8WRsPEn7XnUvbEiS1t+niuV035OUDCDL - GX+w0n1PJEnb6L4az+HOq7cVAACvNAaP8Zco36ruCZgkaZsZQJbVfU9SMoAsxwAiSftq/FHiXTXuxgAA - wBONvyYZb8HtnmBJkvaRAWRZ3fckJQPIcgwgkrTvxjtErioAAP5j3BN6vNOjexIlSdpfBpBldd+TlAwg - yzGASFJO47bV444OAADRxrs9xl+JdE+YJEn7zQCyrO57kpIBZDkGEEnKa9wm67oCAIgyhg+f6yFJuRlA - ltV9T1IygCzHACJJ2X2sAAB2bbzo8FB1T4YkSTkZQJbVfU9SMoAsxwAiSRrvCPE5IQDA7ryt3OpKkvRX - BpBldd+TlAwgyzGASJL+agwhzmQAYBfG21y7JzySpNwMIMvqvicpebFlOQYQSdJ/u6sAADbpfeV2V5Kk - LgPIsrrvSUoGkOUYQCRJP+uyAgDYjOuqe1IjSdLIALKs7nuSkgFkOQYQSdKv8m4QAGATxpOW7smMJEl/ - ZQBZVvc9SckAshwDiCTpd32r3lUAAKsznqSMJyvdkxhJkv6ZAWRZ3fckJQPIcgwgkqSndlEBAKyGX2gl - Sc/JALKs7nuSkgFkOZ4vSpKek+eLAMAqnFfdkxVJkn6WX2iX1X1PUjKALMcAIkl6brcVAMBiLqvuSYok - Sb/KALKs7nuSkgFkOQYQSdJL8uHoAMAirqvuyYkkSb/LALKs7nuSkgFkOQYQSdJL+1IBAEwzPpCse1Ii - SdJTMoAsq/uepGQAWY4BRJL0mrwTBACYYrxw0D0ZkSTpqRlAltV9T1IygCzHACJJem03FQDA0byvuich - kiQ9JwPIsrrvSUoGkOUYQCRJh2jcjhsA4Ci+V90TEEmSnpMBZFnd9yQlA8hyDCCSpEN1XgEAHNR91T3x - kCTpuRlAltV9T1IygCzHACJJOmRvKwCAgxj32eyecEiS9JIMIMvqvicpGUCWYwCRJB2yhwoA4NXGW0u7 - JxuSJL00A8iyuu9JSgaQ5RhAJEmH7nMFAPAq3ZMMSZJekwFkWd33JCUDyHIMIJKkY+TzQACAF/tSdU8w - JEl6TQaQZXXfk5QMIMsxgEiSjtH3CgDg2dz6SpJ0rAwgy+q+JykZQJZjAJEkHSu3wgIAnm38FUX3xEKS - pNdmAFlW9z1JyQCyHAOIJOmYfagAAJ7ktuqeUEiSdIgMIMvqvicpGUCWYwCRJB2zbxUAwG+9rbonE5Ik - HSoDyLK670lKBpDlGEAkScfusgIA+KW7qnsiIUnSoTKALKv7nqRkAFmOAUSSdOx8IDoA8EunVfckQpKk - Q2YAWVb3PUnJALIcA4gkaUbXFQBA62vVPYGQJOmQGUCW1X1PUjKALMcAIkmaFQDAD7z7Q5I0KwPIsrrv - SUoGkOUYQCRJs/IuEADgB7dV98RBkqRDZwBZVvc9SckAshwDiCRpVj4LBAD4QfekQZKkY2QAWVb3PUnJ - ALIcA4gkaWbnFQDA/4y3h3ZPGCRJOkYGkGV135OUDCDLMYBIkmZ2XwEA/M94e2j3hEGSpGNkAFlW9z1J - yQCyHAOIJGl247NOAYBwfhmVJM3OALKs7nuSkgFkOZ5zSpJm5zknAHByU3VPFCRJOlZ+GV1W9z1JyQCy - HAOIJGl2PgwdAHD7K0nS9Awgy+q+JykZQJZjAJEkLZHbYAFAsPdV9wRBkqRjZgBZVvc9SckAshwDiCRp - iTzvBIBgbn8lSVoiv4guq/uepGQAWY4BRJK0RG6DBQDBvlXdEwRJko6ZAWRZ3fckJQPIcgwgkqSlelsB - AIG6JwaSJB07A8iyuu9JSgaQ5RhAJElLdVEBAGHGCwDdEwNJko6dAWRZ3fckJQPIcgwgkqSl+lwBAGF8 - /ockaakMIMvqvicpGUCWYwCRJC2VzwEBgDBvKp//IUlaKgPIsrrvSUoGkOUYQCRJSzbOIQAgRPdkQJKk - WRlAltV9T1IygCzHACJJWrrTCgAI0D0RkCRpVgaQZXXfk5QMIMsxgEiSls4AAgAhuicCkiTNygCyrO57 - kpIBZDkGEEnS0p1XAMDO+eVTkrR0BpBldd+TlAwgy/EcVJK0dDcVALBzH6vuiYAkSbMygCyr+56kZABZ - jgFEkrR0DxUAsHP3VfdEQJKkWRlAltV9T1IygCzHACJJWkMAwM51TwAkSZqZAWRZ3fckJQPIcgwgkqQ1 - NM4jAGCnTqvuCYAkSTMzgCyr+56kZABZjgFEkrSGxm3BAYCduqy6JwCSJM3MALKs7nuSkgFkOQYQSdIa - +loBADt1V3VPACRJmpkBZFnd9yQlA8hyDCCSpLUEAOzU96o7/CVJmpkBZFnd9yQlA8hyDCCSpLU0bg8O - AOzM26o7+CVJmp0BZFnd9yQlA8hyDCCSpLU0bg8OAOzMedUd/JIkzc4Asqzue5KSAWQ5BhBJ0lr6XAEA - O3NTdQe/JEmzM4Asq/uepGQAWY4BRJK0lsbtwQGAnXmouoM/qftq/KWHJGnZLiqW052RKRlAlvOu6q4H - kqS5fam6MzItAGBnugM/rfcVAKTrzsiUDCAA0J+RaXlOAAA74pYDjwEA/RmZkhc7AODk5GvVnZNJuSUr - AOzIddUd+EmNW4ABAP05mZIBBAC8RjDyGgEA7Ii/7vDXHQDwl+6cTMkAAgDuEvFXAMBOdAd9Wl7wAIBH - 3TmZkucDAPCoOyfTGkMQALBxp1V30KcFADzqzsmUDCAA8GjcAqo7K5MatwIDADbusuoO+qS+VwDAo+6s - TMkAAgCPbqrurEzqSwUAbNznqjvokxpfAwDgUXdWpmQAAYBH51V3VqYFAGzcePdDd8gndVEBAI+6szIl - AwgAPHpbdWdlWu8qAGCj3lTdAZ+WJzQA8LfurEzJAAIAf/MHk/5gEgA2zVtaHwMA/tadlSkZQADgb3dV - d14mdVsBABvlQ818qBkA/Fd3XqZkAAGAv11W3XmZ1LcKANioh6o74JO6rgCAv3XnZUoGEAD422nVnZdp - AQAb1R3saZ1VAMDfuvMyJQMIAPxbd16m9aECADZmvPDfHexpAQD/1p2XKRlAAODf7qvuzEzqYwUAbMy4 - 9VN3sCc1bgEGAPxbd2amZAABgH8bL/53Z2ZSYwQCADZmfPh3d7An9akCAP6tOzNTMoAAwL+N2z91Z2Za - AMDGdAd6Wl7kAIAfdWdmSp4bAMCPujMzrfGB8ADARoyDuzvQ0wIAftSdmSkZQADgR9+q7txM6qoCADbi - ouoO9KS+VwDAj7pzMyUDCAD86Lbqzs2k7ioAYCM+V92BntT4GgAAP+rOzZQMIADwI39E+RgAsBHj3Q/d - YZ7UeAIHAPyoOzdTMoAAwI/eVd25mdabCgDYgO4gT2s8gQMAftSdmykZQACg152baZ1XAMDKjV/su4M8 - LQCg152bKRlAAKD3perOzqRuKgBg5caB3R3kSY0nbgBArzs7UzKAAEDvuurOzqQeKgBg5caB3R3kSY0n - bgBArzs7UzKAAEDvrOrOzrQAgJXrDvC0xhM3AKDXnZ0pGUAA4Oe6szMtrycAwIr5i43HAICf687OlAwg - APBz7ihxcvKxAgBWyj07T07uKwDg57rzMyUDCAD8nM8UPTn5WgEAKzU+/Ls7wJP6VAEAP9ednykZQADg - 58Y52Z2faQEAK9Ud3Gl5YQMAfq07P1PyPAEAfq07P9N6VwEAKzMO6O7gTgsA+LXu/EzJAAIAv/a96s7Q - pC4rAGBlLqru4E5qPFEDAH6tO0NTMoAAwK99rrozNKnxNQAAVsaTFE9SAOApujM0JQMIAPzaePdDd4Ym - 5Y8rAWCFvE318V0wAMCvdWdoSgYQAPi106o7Q9MCAFamO7DT8kFlAPB73RmakgEEAH6vO0PT8pwBAFZk - HMzdgZ0WAPB73RmakhczAOD3vlbdOZrUpwoAWIlxMHcHdlJfKgDg97pzNCUDCAD83seqO0eTeqgAgJUY - B3N3YCd1XQEAv9edoykZQADg986q7hxNCwBYie6gTut9BQD8XneOpmQAAYCn6c7RtLzOAAArMA7k7qBO - CwB4mu4cTckAAgBP404T7jQBAKtwVXUHdVL3FQDwNN1ZmpIBBACe5rbqztKkfNYoAKzAOJC7gzqp8SHw - AMDTdGdpSgYQAHia86o7S9MCABbWHdBpeTEDAJ6uO0tT8pwBAJ7mbdWdpWm9qwCAhYyDuDug0wIAnq47 - S1MygADA03VnaVoXFQCwkHEQdwd0Ut8rAODpuvM0JQMIADzdXdWdp0mNz0IBABbiQ8k8GQGA5+rO05QM - IADwdFdVd54m9a0CABYyDuLugE7K21EB4Hm68zQlAwgAPN37qjtP0wIAFtIdzGn5QDIAeJ7uPE3JAAIA - z9Odp2l9qACAycYB3B3MaQEAz9OdpykZQADgee6r7kxN6lMFAEw2DuDuYE7qSwUAPE93pqZkAAGA5/Ha - w+MIBABM5q8wHj+QDQB4nu5MTckAAgDP4+4TjwEAk3UHclrjA9kAgOfpztSUDCAA8HzdmZqW1x8AYKJx - 8HYHcloAwPN1Z2pKBhAAeL5vVXeuJuUOFAAw0Th4uwM5qYcKAHi+7lxNyQACAM/3uerO1aTuKgBgknHw - dgdyUuOD2ACA5+vO1ZQMIADwfBdVd66mBQBM0h3EaXkBAwBepjtXU/L8AQCe713Vnatpva0AgCMbB253 - EKcFALxMd66mZAABgJfpztW0zisA4MjGgdsdxEmND2ADAF6mO1tTMoAAwMt8rbqzNanbCgA4snHgdgdx - Up50AMDLdWdrSgYQAHiZ66o7W5N6qACAIxvvfugO4qTGB7ABAC/Tna0pGUAA4GXOqu5sTQsAOLLuAE5r - fAAbAPAy3dmakgEEAF6uO1vT+lABAEcyDtruAE4LAHi57mxNyQACAC83bgHVna9JfawAgCMZB213ACf1 - pQIAXq47X1MygADAy91U3fma1PgweADgSO6r7gBO6qoCAF6uO19TMoAAwMudV935mhYAcCTdwZvW+woA - eLnufE3JAAIAL/em6s7XtE4rAODAxgHbHbxpAQCv052vKRlAAOB1vlfdGZvUZQUAHNg4YLuDN6nxgWsA - wOt0Z2xKBhAAeJ27qjtjkxpfAwDgwDzJODn5VAEAr9OdsSkZQADgdfxx5uO7YACAA/M205OTDxUA8Drd - GZuSAQQAXsftuR8bn4cCABzI26o7cNMCAF6vO2NTMoAAwOt1Z2xa5xUAcCDjYO0O3KS+VQDA63XnbEoG - EAB4vfuqO2eTuqkAgAMZB2t34CZ1WwEAr9edsykZQADg9T5W3Tmb1EMFABzIOFi7AzepiwoAeL3unE3J - AAIArzc+n7M7Z9MCAA6kO2jTelcBAK/XnbMpGUAA4DC6czatswoAeKVxoHYHbVoAwGF052xKBhAAOIzx - OZ3dWZvUdQUAvJJ7a56cfKkAgMPoztqUDCAAcBjjczq7szaprxUA8ErjQO0O2qSuKgDgMLqzNiUDCAAc - xviczu6sTQsAeKXugE3rfQUAHEZ31qZkAAGAw3hbdWdtWj6vFABe4bTqDti0AIDD6c7alAwgAHA43Vmb - 1ngnDADwQpdVd8Am9VABAIfTnbcpGUAA4HDuqu68TepzBQC8kCcTJyefKgDgcLrzNiUDCAAczvi8zu68 - Tep7BQC80DhIuwM2qQ8VAHA43XmbkgEEAA5nfF5nd96mBQC8wJuqO1jTAgAOqztvUzKAAMBhdedtWp5f - AMALnFfdwZrUtwoAOKzuzE3JCxQAcFjjczu7Mzcpt+4GgBe4qbqDNanbCgA4rO7MTckAAgCHNV78787c - pMYIBAA8k7+iODm5qACAw+rO3JQMIABwWONs7c7ctACAZ+oO1LTeVgDAYXVnbkoGEAA4vO7MTWt8IDwA - 8ERnVXegpgUAHF535qZkAAGAw/tededuUlcVAPBE11V3oCb1pQIADq87d1MygADA4X2uunM3qbsKAHii - r1V3oCblrycA4Di6czclAwgAHN74/M7u3E0LAHii7iBNy/0zAeA4unM3JQMIABzeu6o7d9PyOaYA8ASn - VXeQpgUAHEd37qZkAAGA4+jO3bTOKwDgNy6r7iBN6r4CAI6jO3tTMoAAwHGMz/Hszt6kbisA4Dd8eNjJ - yacKADiO7uxNyQACAMdxXXVnb1LfKgDgN75X3UGa1IcKADiO7uxNyQACAMdxVnVnb1oAwG90B2haAMDx - dGdvSgYQADie7uxNyx90AsAvjF/KuwM0KW8ZBYDj6s7flAwgAHA8D1V3/ib1sQIAfmJ89kV3gCblQ8MA - 4Li68zclAwgAHM9N1Z2/Sd1XAMBP+GuJk5OLCgA4nu78TckAAgDHc151529aAMBPdAdnWm8rAOB4uvM3 - JQMIABzP+H2+O3/TOq0AgP94X3UHZ1oAwHF1529KBhAAOK7vVXcGJ3VZAQD/cV11B2dSdxUAcFzdGZyS - AQQAjmv8Xt+dwUl5bQMAGl+r7uBM6qoCAI6rO4NTMoAAwHGNdz90Z3BS410wAMB/dIdmWuM2YADAcXVn - cEoGEAA4rvH5F90ZnNabCgD407uqOzDTAgCOrzuDUzKAAMDxdWdwWucVAPCni6o7MJO6rwCA4+vO4ZQM - IABwfOP3++4cTuqmAgD+9LnqDsykPlUAwPF153BKBhAAOL6PVXcOJ/VQAQB/Gh+Q1R2YSX2oAIDj687h - lAwgAHB84/f77hxOCwD4U3dQpgUAzNGdwykZQABgju4cTuusAoB44xfx7qBM6lsFAMzRncUpGUAAYI7x - e353Fid1XQFAvPHZF91BmdRtBQDM0Z3FKRlAAGCO8Xt+dxYn9bUCgHj3VXdQJnVRAQBzdGdxSgYQAJhj - /J7fncVpAUC87oBM620FAMzRncUpGUAAYI53VXcWpzW+DgAQ633VHZBpAQDzdGdxSgYQAJinO4vTcscL - AKJdVd0BmdRdBQDM053HKRlAAGCeL1V3Hif1uQKAWJ4MPI5AAMA83XmckgEEAOa5rrrzOKnvFQDE6g7H - tMZtwACAebrzOCUDCADMc1Z153FaABDJB4I9BgDM1Z3HKRlAAGCu7jxOy/MPACKND8LqDsak7isAYK7u - TE7JCxAAMNdD1Z3JSX2qACDObdUdjEl9rACAubozOSUDCADMdVN1Z3JSYwQCgDjfqu5gTOpDBQDM1Z3J - KRlAAGCucfZ2Z3JaABCnOxDTAgDm687klAwgADBfdyan9b4CgBjjnQ/dgZjUeAcMADBfdy6nZAABgPm+ - V925nNRVBQAxxgdgdQdiUuMzUACA+bpzOSUDCADM97nqzuWk7ioAiHFfdQdiUhcVADBfdy6nZAABgPku - q+5cTgsAYnQHYVpvKwBgvu5cTskAAgDznVbduZyW10EAiDA++Ko7CNMCAJbRncspGUAAYBnduZyWO2EA - EGF88FV3ECbl3pcAsJzubE7JAAIAy/hadWdzUj4LFYAI48X/7iBMaoxAAMAyurM5JQMIACzjY9WdzUl9 - qwBg97pDMK1xGzAAYBnd2ZySAQQAlnFWdWdzWgCwa+MDr7oDMC0AYDnd2ZySAQQAltOdzWl9qABgt8YH - XnUHYFL3FQCwnO58TskAAgDLeai68zmpcSswANit8YFX3QGYlMMeAJbVnc8pGUAAYDleE/FHoQDs3PjA - q+4ATMrbPQFgWd35nJIBBACWc15153NaALBb3cGXFgCwrO58TskAAgDL8bmoj51WALA7450P3cGX1HgH - DACwrO6MTskAAgDL6s7ntC4rANid8dkX3cGX1LjfJwCwrO6MTskAAgDLuqu6Mzqp8TUAgN0ZH3TVHXxJ - jft9AgDL6s7olAwgALCsq6o7o5P6XgHA7nSHXlrjfp8AwLK6MzolAwgALOt91Z3RaXl9BIBdGR9w1R14 - aQEAy+vO6JQMIACwvO6MTssdMgDYlfEBV92Bl5R7XALAOnTndEoGEABYnluEn5zcVACwGz7k6/E+nwDA - 8rpzOiUDCAAs71PVndNJPVQAsBvdYZfWuA0YALC87pxOyQACAMv7UHXndFoAsAvjg626gy4tAGAdunM6 - JQMIAKxDd06ndVYBwOaND7bqDrqkxv09AYB16M7qlAwgALAO36rurE7qugKAzbutuoMuqY8VALAO3Vmd - kgEEANbhc9Wd1Ul9rQBg88YHW3UHXVLj/p4AwDp0Z3VKBhAAWIeLqjur0wKAzesOuLQAgPXozuqUDCAA - sA7vqu6sTmt8HQBgs8Y7H7oDLqlxX08AYD268zolAwgArEd3Vqc13gkDAJs1PvuiO+CSGp+BAgCsR3de - p2QAAYD1+FJ153VS47NQAGCz7qvugEvqvAIA1qM7r1MygADAelxX3Xmd1PcKADarO9zSelsBAOvRndcp - GUAAYD3Oqu68TgsANum06g62tACAdenO65QMIACwLt15nZbnJwBs0mXVHWxJ3VUAwLp0Z3ZKXmAAgHV5 - qLozO6lPFQBszvggq+5gS+qqAgDWpTuzUzKAAMC63FTdmZ3U+PxYANic8UFW3cGW1LgNGACwLt2ZnZIB - BADW5bzqzuy0AGBTxgd/dwdaWgDA+nRndkoGEABYlzdVd2an9b4CgM3wFwzewgkAa9Wd2ykZQABgfdxB - wy3EAdgY97A8OflYAQDr053bKRlAAGB97qru3E7qSwUAm/FQdQdaUh8qAGB9unM7JQMIAKzPZdWd22kB - wGZ0B1laAMA6ded2SgYQAFif06o7t9ManycLAKt3VnUHWVLfKgBgnbqzOyUDCACsU3dup3VRAcDqjc++ - 6A6ypG4rAGCdurM7JQMIAKzTfdWd3Ul5LQWATfhadQdZUucVALBO3dmdkgEEANbJH5O6mwYAG9EdYmm5 - byUArFd3dqdkAAGAdfpQdWd3WgCwaj646zEAYL26szslAwgArFd3dqc1hiAAWK3LqjvAkrqrAID16s7v - lAwgALBe4xZQ3fmd1LgVGACs1ueqO8CSGiMQALBe3fmdkgEEANZrfAh4d34nNT4MHgBW63vVHWBJjduA - AQDr1Z3fKRlAAGC9Lqru/E4LAFarO7jSAgDWrTu/UzKAAMB6va268zstf1gKwCqdV93BlZS3agLA+nVn - eEoGEABYt+78TsutxQFYpZuqO7iS8mFdALB+3RmekgEEANbtrurO8KTG1wAAVueh6g6upD5UAMC6dWd4 - SgYQAFi3q6o7w5Many8LAKvTHVppAQDr153hKRlAAGDd3lfdGZ7W+DwUAFiNs6o7sJL6VgEA69ed4ykZ - QABg/bozPK3xObMAsBrXVXdgJXVbAQDr153jKRlAAGD93GL88XNmAWA1vlbdgZWUv04AgG3ozvGUDCAA - sH6fqu4cT8pdNgBYle6wSsv9KQFgG7pzPCUDCACs3zivu3M8LQBYhXdVd1Al9b0CALahO8tTMoAAwDZ0 - 53ha4/NmAWBxF1V3UCV1VwEA29Cd5SkZQABgG8YfWnZneVLj82YBYHGfq+6gSuqqAgC2oTvLUzKAAMA2 - eK3l8fNmAWBx/irh5OS0AgC2oTvLUzKAAMA2uNvGYwCwuO6ASgsA2I7uLE/JAAIA2+DzVh/zB6cALGr8 - Et0dUEndVwDAdnTneUoGEADYju4sT+uyAoDFfKq6AyqpjxUAsB3deZ6SAQQAtuNL1Z3nSY3PQgGAxTxU - 3QGV1FkFAGxHd56nZAABgO24rrrzPKnxubMAsJjucEoLANiW7jxPyQACANsx/uCyO8/TAoBFOIhPTr5V - AMC2dGd6SgYQANiW7jxPy/MXABbhrZgnJ7cVALAt3ZmekhcQAGBb3Hr88fNnAWA6H8Z1cnJeAQDb0p3p - KRlAAGBbbqruTE9qjEAAMF13KKX1pgIAtqU701MygADAtow/vOzO9LQAYKp3VXcgJfW9AgC2pzvXUzKA - AMC2vK26Mz2t8Tm0ADDNRdUdSEndVQDA9nTnekoGEADYnvEHmN25ntT4HFoAmGZ8+Hd3ICV1WQEA29Od - 6ykZQABge8YfYHbnelLjc2gBYJpvVXcgJXVaAQDb053rKRlAAGB7xh9gdud6WgAwTXcQpQUAbFN3rqdk - AAGA7Rl/gNmd62mNz6MFgKMbvzh3B1FS9xUAsE3d2Z6SAQQAtqk719Man0cLAEf3qeoOoqQ+VgDANnVn - e0oGEADYpvGHmN3ZntT4PFoAOLqHqjuIkvpQAQDb1J3tKRlAAGCbxh9idmd7UuPzaAHg6LpDKC0AYLu6 - sz0lAwgAbNP4Q8zubE8LAI7qfdUdQEmNd8AAANvVne8pGUAAYLu6sz0td+QA4Kiuqu4ASuqmAgC2qzvf - UzKAAMB2jVtAded7Uj6TFYCj+lJ1B1BS5xUAsF3d+Z6SAQQAtmt8CHh3vic1PgweAI6mO3zSelsBANvV - ne8pGUAAYLsuqu58TwsAjmK88N8dPEl9rwCAbevO+JQMIACwXe+q7nxP67QCgIPzlwYnJ3cVALBt3Rmf - kgEEALatO9/TuqwA4ODca9IhCwB70J3xKRlAAGDbfDarP04F4Ei+Vd3Bk5S3WQLA9nVnfEoGEADYtuuq - O+OTcntyAI6iO3TSAgC2rzvjUzKAAMC2nVXdGZ/W+JxaADiYD1V34CR1XwEA29ed8ykZQABg+7ozPq3z - CgAO5mPVHThJja8BALB93TmfkgEEALbvoerO+aRuKgA4mPHuh+7ASWq8CwYA2L7unE/JAAIA2/ep6s75 - pMYIBAAH0x02aQEA+9Cd8ykZQABg+8Z53p3zaQHAQZxW3UGTlL8sAID96M76lAwgALAP3Tmf1vhAeAB4 - tauqO2iScm9JANiP7qxPyQACAPvwverO+qSuKwB4tbuqO2iSOq8AgH3ozvqUDCAAsA+fq+6sT+prBQCv - 1h0yab2tAIB96M76lAwgALAPl1V31qcFAK8yXvjvDpikxttKAYD96M77lAwgALAPPq/1sfF1AIAXG7d+ - 6g6YpMYtwACA/ejO+5QMIACwH91Zn9Z4JwwAvNht1R0wSTlMAWBfuvM+JQMIAOzH+AyM7rxPanwWCgC8 - 2LeqO2CS8nZK2IfxWB7vavtYjXF3PFEejXd5jT5VV9X4n/G4h33rzvuUDCCwb+MWxmfVRTWe14znPaPr - P//v43nO+P8H9mE8vrvzPim3LQfgVbrDJS1ge8Yv/+PdW2PYGE+Iu8f2Uxp/UTV+qTCIwL50j/eUDCCw - L2PMGH/EcV91j/nf9aUaw4jnOrBN4xrQPbbTAoAX+VB1B0tS48VPYDvGXzce651rD9X4zwe2r3uMp2QA - ge0bL3ge41bF4znU+MOP8YckwHZ0j+e0PL8B4EW8lfLxawCs2/iLxXErq+4xfKzGiw7AdnWP65S8QADb - NW5fNf4go3tsH7rxzpD3FbB+s64La268Ew4Anu2lb6PeU+6PC+s1/jpx9vDx324qYHu6x3NKBhDYnvG4 - XeqzGcc74t9VwHqN30m6x29SYwQCgGfrDpW0gHUat6LqHrNLND5jZPxFJrAd3WM5JQMIbMebagwQ3WN5 - dv66GtZr/C7SPW7TAoBnGbeU6Q6UpPwFAazTWt+dNt6NAmxD9xhOyQAC23BRdY/hJRu/H3k3CKzPeGd8 - 95hNyx08AHiWy6o7UJJyaxtYl3Ef6vFui+7xupbG7SnGX2sC69Y9flMygMD6LX2Lz981flcE1qV7rKY1 - 7hIAAE92V3UHSlJuaQPrsaVRdow04110wHp1j92UDCCwblv5HEZ/LAbr4jWck5MvFQA82dr/ynpG422k - wPK2+o40b8GG9eoesykZQGC9xi2musftWnP7T1iPq6p7nKYFAE/i/pGPAxCwvK3fju9DBaxP93hNyQAC - 6zRuo9k9Ztfe+KtzYHnjdsHdYzQtn1MEwJOMWz91B0lS/poJlreXa5ERBNane6ymZACB9dnq+PFXbocF - 69A9PtO6qADgt8YT2O4gScoH+8GyxmdodI/NrWYEgXXpHqcpGUBgXbY+fvzVuP0OsKytfIbQMbutAOC3 - tnbv2WPkA4xhWXv8HCIjCKxH9xhNyQAC67GX8eOv/A4Fy/pUdY/NpMZ1FQB+qztE0gKWM25B1z0u95AR - BNahe3ymZACBddjb+DHywiMsa/yu0T020wKAXzqrugMkqa8VsIyEJ+1GEFhe99hMyQACy9vj+PFXPg8E - ltU9LtPy+xYAv/Sx6g6QpMbXAFhGyi34PCmHZXWPy5QMILCsPY8ff/WuApaRcI35XeNWYADwU+PdD90B - ktR4Fwww32XVPSb3mhEEltM9JlMygMByUl6Y9I56WM74EPDucZnU+DB4APip7vBIC1jGHj/4/HcZQWAZ - 3eMxJQMILCPtr7LfV8B8F1X3mEwLAFqnVXdwJDV+MQHmO6+6x2RCRhCYr3sspmQAgfkSb0njXSCwjHEL - uu4xmZYRFoBW2u1nunxoHywj5bM/fpYRBObqHocpGUBgruT78fssEFhG93hM66oCgB/cVd3BkdT4K3Rg - rrdV93hMywgC83SPwZQMIDBP8vgx8kHEsIwvVfeYTGq8vgUAP0i8//5/e1MBc11X3eMxMSMIzNE9/lIy - gMAc6ePHaPx+Cczn96vHAOBfxgv/3YGRlCfosIz021/9NyMIHF/32EvJAALHZ/z4O/fhh/nOqu7xmNa4 - 0wAA/J/kDyD+K2+RhGV0j8f0jCBwXN3jLiUDCByX8ePfjb9EB+brHo9pucU5AP8yPvy7OzCSGh8CD8w1 - XujvHo8ygsAxdY+5lAwgcDzGjx/7WgHzeZf9ycltBQD/x+F4cnJaAXNdVd3jUY8ZQeA4usdbSgYQOA7j - x88D5vNHro+vcwHA/+kOi7SA+T5X3eNRf2cEgcPrHmspGUDg8Iwfv859+GE+tzl/DAD+xwdkeWs2LOW+ - 6h6T+ndGEDis7nGWkgEEDsv48fvG75vAXG+q7vGYlusPAP8zPpiuOyiS8uF8sIzvVfeY1I8ZQeBwusdY - SgYQOBzjx9PyWYuwDL9rnZx8rADgf+9+6A6KpPxVACyjezzq5xlB4DC6x1dKBhA4DOPH0/PHZrCMu6p7 - TCblbh8A/E93SKQFLKN7POrXGUHg9brHVkoGEHg948fz8hfYsIzx7qvuMZkWAOFOq+6ASOqhApbRPSb1 - +4wg8Drd4yolAwi8jvHj+X2qgPm83vPY+DoAEOyi6g6IpG4qYBndY1JPywgCL9c9plIygMDLGT9elgEE - ltM9JtPyOUQA4T5X3QGR1HkFLKN7TOrpGUHgZbrHU0oGEHgZ48fL8xkgsJz7qntcJjVe9wIg2PeqOyCS - elMByxi3oOsel3p6RhB4vu6xlJIBBJ7P+PG6/PU1LGd8Bk/3uExqvO4FQLDucEjKQQjLuqu6x6aelxEE - nqd7HKVkAIHnMX68PtcdWM74PaF7XKYFQKjxRLQ7GJIaL74Cyxm3ROgem3p+RhB4uu4xlJIXIuHpjB+H - 6V0FLKd7XKbl+Q9AqPFhdN3BkJS3Y8OyzqrusamXZQSBp+kePyl5AQCexvhxuIBluZ6dnNxUAARy7/2T - k9MKWFb32NTLM4LA73WPnZQMIPB7Xiw8XON3TmBZt1X3+EzKtQggVHcopAUsb3wWT/f41MszgsCvdY+b - lAwg8GvGj8Pmr65heRdV9/hMC4Aw76vuQEjqawUsz+34jpMRBH6ue8ykZACBnzN+HD7XHFje26p7fKY1 - XgcDIIgPHj45+VgByzPIHi8jCPS6x0tKXoyEnvHjOAHr0D0+0xqvgwEQ5EvVHQhJjQ9fBtbBiw7HywgC - P+oeKykZQOBHnoccp7sKWIfxeOwep0mN18EACNIdBmkB6+FdacfNCAL/1j1OUjKAwL8ZP46X6w2sx1XV - PU7TAiDEu6o7CJJ6qIB16R6rOlxGEPhb9xhJyQuS8Dfjx/EaX1tgPdx2+LHxehgAAS6q7iBI6qYC1sWH - oR8/Iwg86h4fKRlA4JHx47hdVsC6dI/VtMbrYQAE+Fx1B0FS5xWwPt3jVYfNCAL9YyMlAwgYP47d9wpY - n3EnjO4xm9R4PQyAAOMJaXcQJPWmAtbHvWnnZAQhXfe4SMkAQjrjx/HzF9awTt5x7/Z8ADG6QyApf5EE - 63ZfdY9dHTYjCMm6x0RKBhCSGT+O33geB6zTeA7QPW7TAmDnHHgnJ3cVsF7jg+m6x64OnxGEVN3jISUD - CKmMH3PyAcOwbt3jNi2/AwHsnLc8+kA+2IJx64Tu8avD5xcAEnWPhZQMICQyfsxp3MoUWDe3RH98XQyA - HfOhV/4qCbbituoewzp8RhDSdI+DlAwgpDF+zOlLBazf+BDw7jGclFv1Aexcd/FPC9iO8ct09zjW4TOC - kKR7DKRkACGJ8WNO44/sgG3wTvvHANip91V34U/qawVsy3jcdo9nHT4jCCm6n/+UDCCkMH7MaXydge3w - eYuPjdfHANihcU/W7sKf1HUFbI8RZF5GEBJ0P/spGUBIYPyY0/gsgTcVsC3d4zktn1kEsFNuJXNyclYB - 22QEmZcRhL3rfu5TMoCwd8aPOY3x420FbI/Xhk5O7ioAdqi76KcFbJsRZF5GEPas+5lPyQDCnhk/5mT8 - gG0bd8boHttpAbAz7vPow/lgL4wg8zKCsFfdz3tKBhD2yvgxJ+MHbN+4M0b3+E7LtQxgZy6q7oKf1E0F - 7IMRZF5GEPao+1lPyQDCHhk/5mT8gP3oHuNpnVcA7Mht1V3wk3K4wb4YQeZlBGFvup/zlAwg7I3xY07G - D9iXcYeM7rGe1HidDIAd8YvBycmbCtgXI8i8jCDsSfcznpIBhD3xO86cjB+wP+MOGd3jPalxhgCwI93F - PqnxpB3YJyPIvIwg7EX3852SAYS9MH7MyfgB+zTukNE95tMCYCfGC1bdhT6pzxWwX0aQeRlB2IPuZzsl - Awh7YPyYk/ED9ms8trvHfVrjA+EB2IFPVXehT+qyAvbNCDIvIwhb1/1cp2QAYeuMH3MyfsD+jcd59/hP - 6mMFwA7cV92FPqnTCtg/I8i8jCBsWfcznZIBhC0zfszJ+AEZ7qruGpDUeL0MgB3oLvJpATmMIPMygrBV - 3c9zSgYQtsr4MSfjB+QYd8rorgNpAbBx76vuAp/UeDEUyGIEmZcRhC3qfpZTMoCwRcaPORk/IMu4U0Z3 - LUjLHUMANu6q6i7wSV1XQB4jyLyMIGxN93OckgGErTF+zMn4AZm660FaPjMWYOPc0/Hk5KwCMhlB5mUE - YUu6n+GUDCBsifFjTsYPyOUzYx9fNwNgw7qLe1pANiPIvIwgbEX385uSAYStMH7MyfgB2T5W3bUhqXEd - BGCjxhPZ7uKe1EMFYASZlxGELeh+dlMygLAFxo85GT+A8dy9uz6k9aYCYIMuqu7CntRNBTAYQeZlBGHt - up/blAwgrJ3xY07GD+Av3TUirfMKgA26rboLe1IOMeCfjCDzMoKwZt3PbEoGENbM+DEn4wfwT669/ngW - YLMcYgA/MoLMywjCWnU/rykZQFgrv7vMyfgB/Jc/nnX7dIDN6i7qSfkgK+BnjCDzMoKwRt3PakoGENbI - +DEn4wfQcfv0xwDYGB9kdXLyuQL4GSPIvIwgrE33c5qSAYS1MX7MyfgB/My7qrtupHVWAbAhH6vugp7U - ZQXwK0aQeRlBWJPuZzQlAwhrYvyYk/ED+J3u2pHWdQXAhtxX3QU9qdMK4HeMIPMygrAW3c9nSgYQ1sL4 - MSfjB/AUX6ruGpLU+L0QgA3pLuZpATyVEWReRhDWoPvZTMkAwhoYP+Zk/ACe6qrqriNpAbAR450P3YU8 - Kcs98FxGkHkZQVha93OZkgGEpRk/5mT8AJ5jfP5Fdy1Ja3weCgAbYLl370bgZYwg8zKCsKTuZzIlAwhL - Mn7MyfgBvER3PUnrogJgA+6q7kKe1PjrBYCXMILMywjCUrqfx5QMICzF+DEn4wfwUg9Vd11J6nMFwAaM - J73dhTwpgNcwgszLCMISup/FlAwgLMH4MSfjB/Aan6ru2pLUuI4CsHJvqu4intT4qwWA1zKCzMsIwmzd - z2FKBhBmM37MyfgBvNZ4jtBdX9ICYOXOq+4CntRNBXAIRpB5GUGYqfsZTMkAwkzGjzkZP4BD6a4xaXmu - BLBy48X/7gKe1BiBAA7FCDIvIwizdD9/KfmlnlmMH3MyfgCHNK4p3bUmqXErMABWzIdWARyeEWReRhBm - 6H72UjKAMIPxY07GD+DQxoeAd9ebpNxWHWDluot3UuOXAIBjMILMywjCsXU/dykZQDg248ecjB/AMVxW - 3TUnLQBWarxg1F24kxp/rQBwLEaQeRlBOKbuZy4lAwjHZPyYk/EDOJbTqrvupPW+AmCFPlbdhTup8dcK - AMdkBJmXEYRj6X7eUjKAcCzGjzkZP4Bj6649aV1VAKyQF+Ue/1oB4Nhcb+dlBOEYup+1lAwgHIPxY07G - D2AGv+ucnNxVAKxQd9FOC2AWvxjMywjCoXU/ZykZQDg048ecjB/ALNdVdx1KC4CVcZ/Gk5MvFcBMRpB5 - GUE4pO5nLCUDCIdk/JiT8QOY6azqrkVpue4CrMz47Ivugp3U+CsFgNmMIPMygnAo3c9XSgYQDsX4MSfj - B7CE7nqU1kUFwIqM+xN2F+ykxl8pACzBCDIvIwiH0P1spWQA4RCMH3MyfgBLeai661JStxUAKzKeHHcX - 7KQAlmQEmZcRhNfqfq5SMoDwWsaPORk/gCXdVN21Kalx3gGwEm+q7mKd1PjrBIClGUHmZQThNbqfqZQM - ILyG8WNOxg9gaedVd31KC4CVcDA9/nUCwBoYQeZlBOGlup+nlAwgvJTxY07GD2ANxnWou0al5fcNgJXw - 1kS/zAPrYgSZl19KeInuZyklz5l4CePHnIwfwJp016m0PlYArIAPpwJYHyPIvIwgPFf3c5SSAYTnMn7M - yfgBrM1d1V2vkrqvAFiB7iKd1PhlAWCNjCDzMoLwHN3PUEoGEJ7D+DEn4wewRldVd81KC4CFnVXdBTqp - zxXAWhlB5mUE4am6n5+UDCA8lfFjTsYPYK3eV911K63TCoAFXVfdBTqpiwpgzYwg8zKC8BTdz05KBhCe - wvgxJ+MHsHbdtSutywqABXlRzRoPbIPr9byMIPxO93OTkgGE3zF+zMn4AWzB+AyM7hqWlLuOACysuzin - BbAVRpB5GUH4le5nJiUDCL9i/JiT8QPYik9Vdx1LalyzAVjIeOdDd3FOaryYCLAlRpB5GUH4me7nJSUD - CD9j/JiT8QPYkvF8uruWpfWmAmAB4z6E3YU5qfEZKABbYwSZlxGETvezkpIBhI7xY07GD2CLuutZWucV - AAsY9yHsLsxJnVUAW2QEmZcRhP/qfk5SMoDwX8aPORk/gK1yTpyc3FQALGA8ie4uzEkBbJkRZF5GEP6p - +xlJyQDCP3lRa07GD2DLbqvu2pbUQwXAArqLclIOIGAPjCDzMoLwl+7nIyUDCH8xfszJ+AFs3UXVXd/S - AmCy8ctrd0FO6lMFsAdGkHkZQRi6n42UDCAMxo85GT+APXhXdde4tNyCHWCycf/B7oKclF/ggT0xgszL - CEL3c5GS508YP+Zk/AD2pLvOpXVdATDRuP1Td0FOCmBvjCDzMoJk634mUjKAZDN+zMn4AezNl6q73iU1 - vgYATNRdjJMav1QA7JERZF5GkFzdz0NKBpBcxo85GT+APRrvfuiueWkBMMm472B3IU7qcwWwV0aQeRlB - MnU/CykZQDIZP+Zk/AD2yutQj43PQwFgAsv7yclFBbBnRpB5GUHydD8HKRlA8hg/5mT8APauu/al5bUo - gEm8KGZ1BzK43s/LCJKl+xlIyQCSxfgxJ+MHkMBn0bobCcA03UU4LYAURpB5GUFydN//lAwgOYwfczJ+ - ACluqu46mNS45gNwZOOdD91FOKnxYiBAEiPIvIwgGbrvfUoGkAzGjzkZP4Ak51V3LUwLgCMb9xvsLsBJ - jc9AAUhjBJmXEWT/uu97SgaQ/TN+zMn4AaR5U3XXw7Q8lwI4snG/we4CnNT7CiCREWReRpB9677nKfml - fd+MH3MyfgCpxvWvuy4m9akC4IgcNgDZjCDzMoLsV/f9TskAsl/GjzkZP4Bkd1V3bUzqvgLgiLqLb1IP - FUA6I8i8jCD71H2vUzKA7JPxY07GDyDdZdVdH9MC4EjGL6zdhTcpbzUEeGQEmZcRZH+673NKBpD9MX7M - yfgBcHJyWnXXyLTcmh3gSMaL/92FNym/tAP8zQgyLyPIvnTf45Q8l9oX48ecjB8Af+uuk2ldVQAcwbj9 - U3fhTQqAfzOCzMsIsh/d9zclA8h+GD/mZPwA+LfxGRjd9TKpLxUAR9BddJMav3wA8CMjyLyMIPvQfW9T - MoDsg/FjTsYPgB99rLprZloAHNhZ1V1wk/pcAdAzgszLCLJ93fc1JQPI9hk/5mT8AOiN58LddTMtZwTA - gV1X3QU3qYsKgJ8zgszLCLJt3fc0JQPIthk/5mT8APi17tqZlteoAA5s3F+wu+Am9a4C4NeMIPMygmxX - 9/1MyQCyXcaPORk/AH7PmXRyclsBcEDdxTYtAJ7GCDIvI8g2dd/LlAwg2+SFpjkZPwCeZrz4311Hkxpn - MwAHMt750F1skxov5gHwdEaQeRlBtqf7PqZkANke48ecjB8ATzdu/9RdS9MC4EAcLI+fgQLA8xhB5mUE - 2Zbue5iSAWRbjB9zMn4APM+4ZnbX07T8DgBwIN5aeHLyvgLg+Ywg8/IL0HZ037+UDCDbYfyYk/ED4GW6 - a2paHysADsAvPwC8hhFkXkaQbei+dykZQLbB8/85GT8AXu6u6q6tSd1XABxAd5FN6qEC4HWMIPMygqxf - 931LyQCyfsaPORk/AF7nququr2kB8ErjRZTuApvUTQXA6xlB5mUEWbfue5aSAWTdjB9zMn4AvN64VXl3 - jU3rtALgFT5V3QU2Kb+oAxyOEWReRpD16r5fKXletV7GjzkZPwAOp7vOpnVZAfAK4/ZP3QU2KQAOywgy - LyPIOnXfq5QMIOtk/JiT8QPgsLxm9fhZKAC8QndxTWr8kgLA4RlB5mUEWZ/u+5SSAWR9jB9zMn4AHJ67 - lnjdCuBV3E/x5ORzBcBxGEHmZQRZl+57lJIBZF2MH3MyfgAcx3he0V1303LGALzQVdVdWJO6qAA4HiPI - vIwg69F9f1IygKyH8WNOxg+A4+quvWmdVwC8wLiPYHdhTepdBcBxGUHmZQRZh+57k5IBZB2MH3MyfgAc - 37jWdtfgpG4qAF6gu6imBcAcRpB5GUGW131fUjKALM/4MSfjB8Ac49bl3XU4qfFh8AA803iy3l1Uk/pS - ATCPEWReRpBldd+TlAwgyzJ+zMn4ATDPuHV5dy1OC4BncoCcnFxXAMxlBJmXEWQ53fcjJQPIcowfczJ+ - AMw1bl3eXY/TOqsAeIbbqrugJuXwAFiGEWReRpBldN+LlAwgyzB+zMn4AbCM7pqclj/iBXgmvyQBsCQj - yLyMIPN134eUDCDzeV4/J+MHwHLGLcy7a3NS4/cnAJ6hu5gm5QOkAJZnBJmXEWSu7nuQkgFkLuPHnIwf - AMsa737ors9pAfBE40WQ7kKa1KcKgOUZQeZlBJmn+/qnZACZx/gxJ+MHwPLGLcy7a3RapxUAT/Cx6i6k - SfnlHGA9jCDzMoLM0X3tU/Icaw7jx5yMHwDr0V2n07qoAHiC+6q7kCYFwLoYQeZlBDm+7uuekgHk+Iwf - czJ+AKzLuJV5d71O6nMFwBN0F9Gkxi8zAKyPEWReRpDj6r7mKRlAjsv4MSfjB8D63FTdNTspr2cBPMG4 - X2B3EU3KYg6wXkaQeRlBjqf7eqdkADke48ecjB8A63ReddfttAD4jauqu4Am5Z6JAOtmBJmXEeQ4uq91 - SgaQ4zB+zMn4AbBe4/rcXbvT8lwL4Dfuqu4CmtS7CoB1M4LMywhyeN3XOSW/lB+e8WNOxg+A9RvX6u4a - ntSnCoBf6C6eaQGwDUaQeRlBDqv7GqdkADks48ecjB8A2+CPeh8/DB6An/B2wZOTLxUA22EEmZcR5HC6 - r29KBpDDMX7MyfgBsB2XVXctTwuAn/CBUScn1xUA22IEmZcR5DC6r21KBpDDMH7MyfgBsC2nVXc9T+us - AqBxW3UXzqQcEgDbZASZlxHk9bqva0oGkNczfszJ+AGwTd01Pa2rCoCGX6YA2DIjyLyMIK/TfU1TMoC8 - jufrczJ+AGzXfdVd25Nye3eAn+gumkn5oCiA7TOCzMsI8nLd1zMlA8jLGT/mZPwA2LaPVXd9TwuA/xi3 - fuoumEl9qgDYPiPIvIwgL9N9LVMygLyM8WNOxg+A7RvPT7trfFrvKgD+wULuF3KAPTGCzMsI8nzd1zEl - z7eez/gxJ+MHwH501/m0LioA/sE9EgHYGyPIvIwgz9N9DVMygDyP8WNOxg+AfXF+npzcVgD8Q3exTGr8 - 0gPA/hhB5mUEebru65eSAeTpvHgzJ+MHwP6MF/+7a35S43kEAH86rbqLZVKfKwD2yQgyLyPI03Rfu5QM - IE9j/JiT8QNgn8btn7rrfloA/Omy6i6USbk3IsC+GUHmZQT5ve7rlpIB5PeMH3MyfgDs1/gA8O7an5bn - 5QB/uqu6C2VS43AEYN+MIPPyy9avdV+zlAwgv2b8mJPxA2D/uut/Wh8rAMr4BaC7UCYFQAYjyLyMID/X - fb1SMoD8nPFjTsYPgAxfqu4cSOq+Aog3nvx3F8mkxqEIQA4jyLyMIL3ua5WSAaRn/JiT8QMgx1XVnQVp - AcQ7r7oLZFLXFQBZjCDzMoL8qPs6pWQA+ZHxY07GD4AsZ1V3HqR1WgFEu6m6C2RS41AEII8RZF5GkH/r - vkYpGUD+zfgxJ+MHQKbuTEjrsgKI5pcuAJIZQeZlBPlb9/VJyQDyN8/D52T8AMj1UHVnQ1J3FUC07uKY - lA+EAsAIMi8jyKPua5OSAeSR8WNOxg+AbJ+q7nxIapyFALHcD/HxMAQAI8i8jCD91yUlA4jxY1bGDwDG - 847ujEjLeQjEGh/+3V0Yk/JLOAB/MYLMK30E6b4mKaU/9zJ+zMn4AcBfunMirfMKIJIXegDg35yN80oe - QbqvR0rJA4jxY07GDwD+aZwL3XmR1E0FEKm7KCblPogAdIwg80odQbqvRUqpA4jxY07GDwD+63PVnRlJ - jQ+DB4jzruouikmNQxAAOkaQeSWOIN3XIaXEAcT4MSfjBwCdy6o7N9ICiOMAODm5qADgZ4wg80obQbqv - QUppA4jxY07GDwB+5rTqzo60ziqAKN4C+PguGAD4FSPIvJJGkO7fP6WkAcT4MSfjBwC/050faX2sAKKM - XxS6C2JSAPAURpB5pYwg3b97SikDiPFjTsYPAJ7C8/nHrwFAjDdVdzFM6ksFAE/ll6Z5JYwg3b93SgkD - iPFjTsYPAJ7quurOkrQAYpxX3YUwqasKAJ7DCDKvvY8g3b9zSnsfQIwfczJ+APAc4/MvuvMkrfF5KAAR - bqruQpjU+woAnssIMq89jyDdv29Kex5AjB9zMn4A8BLdmZLWZQUQ4aHqLoRJAcBLGUHmtdcRpPt3TWmv - A4jxY07GDwBeymthJyefK4AI3UUwqfsKAF7DCDKvPY4g3b9nSnscQIwfczJ+APAa7obyeJYC7J77Hp6c - fKoA4LWMIPPa2wjS/TumtLcBxPgxJ+MHAK/l83AfA9i966q7ACa19w/fBGAeI8i89jSCdP9+Ke3peZjx - Y07GDwAOYZwl3TmTltfEgN37UnUXwKQA4JCMIPPaywjS/bultJdfuo0fczJ+AHBI3VmT1rgVGMCudRe/ - pMYvqwBwaEaQee1hBOn+vVLawwBi/JiT8QOAQ7urujMnqfFh8AC79a7qLn5J3VYAcAxGkHltfQTp/p1S - 2voAYvyYk/EDgGO4qrpzJy2A3bqougtfUuNrAADHYgSZ15ZHkO7fJ6UtDyDGjzkZPwA4lvdVd/akdVYB - 7NLnqrvwJTXeBQMAx2QEmddWR5Du3yWlrQ4gxo85GT8AOLbu/EnrugLYpfELRXfhSwoAZjCCzGuLI0j3 - 75HSFgcQ48ecjB8AzHBfdedQUl8qgF3qLnpJucADMJMRZF5bG0G6f4eUtjaAGD/mZPwAYJZPVXcWpQWw - O+OXze6Cl9T4sCsAmMkIMq8tjSDdP39KWxpAjB9zMn4AMNN4ztidR2m5RTywOzdVd8FLanzYFQDMZgSZ - 11ZGkO6fPaWtDCDGjzkZPwBYQncmpXVRAezKQ9Vd8JICgKUYQea1hRGk++dOaQsDiPFjTsYPAJbirD85 - ua0AdqW72CU1BiAAWJIRZF5rH0G6f+aU1j6AeEFkTsYPAJY0XvzvzqekxnMegN04q7qLXVLjQ64AYGlG - kHmteQTp/nlTWvMAYvyYk/EDgKWN2z91Z1RaALtxXXUXuqS29IGbAOybEWReax1Bun/WlNb6nMz4MSfj - BwBrMD4AvDun0trK5+cB/NaXqrvQJQUAa2IEmdcaf7Hr/jlTWuMAYvyYk/EDgDXpzqq03C0F2I3uIpeU - +xoCsEZGkHmtbQTp/hlTWtsAYvyYk/EDgLXxx8InJ/cVwOZ5W9/jh1sBwBoZQea1phGk++dLaU0DiPFj - TsYPANbI7eIfA9g8H+z0+DUAgLUygsxrLSNI98+W0loGEOPHnIwfAKzVWdWdXWmdVgCb9rnqLnBJjXfB - AMCaGUHmtYYRpPvnSmkNA4jxY07GDwDWrju/0rqqADZt/OLRXeCSAoAtMILMa+kRpPtnSmnpAcT4MSfj - BwBb8FB151hSdxXApnUXt6TGh1oBwFYYQea15AjS/fOktOQAYvyYk/EDgK24qbqzLC2AzRq/YHYXtqS8 - lQ+ArTGCzGupEaT7Z0lpqQHE+DEn4wcAW3JededZWs5uYLM+Vd2FLan3FQBsjRFkXkuMIN0/R0pLDCDG - jzkZPwDYmjdVd6alNYYggE1yL0MA2C4jyLxmjyDdP0NKswcQ48ecjB8AbNU4w7qzLanbCmCTuotaUmMA - AoAtM4LMa+YI0v33pzRzADF+zMn4AcCWjQ8B7863pLx+BmzSuPVTd1FLatwCDAC2zggyr1kjSPffndKs - AcT4MSfjBwBbd1l1Z1xaAJszPvy7u6AltdQHmwLAoRlB5jXj+UP335vSjAHE+DEn4wcAe3BadedcWmcV - wKZ8qboLWlIAsCdGkHkdewTp/jtTOvYAYvyYk/EDgD3pzrq0PlYAm9JdzJIav/wCwN4YQeZ1zBGk++9L - 6ZgDiPFjTsYPAPbmvurOvKTG7xkAm/Gu6i5mSd1WALBHRpB5HWsE6f67UjrWAGL8mJPxA4A9Gu9+6M69 - tAA246LqLmRJja8BAOyVEWRexxhBuv+elI4xgBg/5mT8AGCvxvO97uxLa3weCsAmjHc/dBeypMa7YABg - z4wg8zr0CNL9d6R06AHE+DEn4wcAe9edf2ldVgCb4BdBAMhgBJnXIUeQ7j8/pUMOIJ7zzsn4AUACzytO - Tj5XAJvQXcSS+lIBQAojyLwONYJ0/9kpHWoA8SLFnIwfAKRwN5XHcx9g9dy38OTkqgKAJEaQeR1iBOn+ - c1M6xABi/JiT8QOAJOdVdx6mBbB6n6ruApbU+woA0hhB5vXaEaT7z0zptQOI8WNOxg8A0oxzrzsT0zr0 - 57UBHNx91V3AkgKAVEaQeb1mBOn+81J6zS/Vxo85GT8ASNWdi2ndVACr1l28khoDEAAkM4LM66UjSPef - ldJLBxDjx5yMHwAku6u68zGphwpgtcatn7qLV1LjFmAAkM4IMq+XjCDdf05KLxlAjB9zMn4AkG58pmx3 - RqYFsFou1If5YFIA2AMjyLye+/yj+89I6bkDiPFjTsYPAPCHxX/ls3WB1fJWPQDgn4wg83rOCNL976f0 - nAHE+DEn4wcA/K07K9O6rgBWqbtoJTV+SQYA/s0IMq+njiDd/25KTx1AjB9zMn4AwL+Nz8DozsykvlQA - qzN+cekuWkndVgDAj4wg83rKCNL976X0lAHE+DEn4wcA/Gh8tmx3bqYFsDrnVXfBSuqiAgB6RpB5/W4E - 6f53UvrdAGL8mJPxAwB647lKd3am9a4CWJXx7ofugpWUX+IA4NeMIPP61QjS/c+n9KsBxPgxJ+MHAPxa - d36m5Y+MgdXxCyMA8BRGkHn9bATp/mdT+tkA4rnsnIwfAPB747zsztGk3GYeWJ3uYpXUXQUAPI0RZF7d - CNL9z6XUDSDGjzkZPwDgaT5X3Vma1Hh+BrAa4xfr7mKV1FUFADydEWRe/x1Buv+ZlP47gBg/5mT8AICn - G7d/6s7TtABW42PVXaiSel8BAM9jBJnXP0eQ7v8/pX8OIMaPORk/AOB5xgeAd2dqWj+7nSvAdPdVd6FK - CgB4GSPIvP76JbL7/0vprwHE+DEn4wcAvEx3rqb1qQJYhe4ildQYgACAlzOCzOuy+X9L6royfszJ+AEA - L/el6s7XpLzeBqzCadVdpJKySAPA6xlBpP1k/ACA1xl/tNGdsWkBLC79rwhH7kkIAIdhBJG2n/EDAF7v - rOrO2bR85i6wuLuqu0AlBQAcjhFE2m7GDwA4nO6sTeuqAljU+CWnu0ClNO4hDQAclhFE2l7GDwA4rIeq - O3OTGn94DbCY8QtOd3FK6rYCAA7PCCJtJ+MHABzeTdWdu2kBLOa86i5MSV1UAMBxGEGk9Wf8AIDj8Lrb - Y55nAIuxRLsIA8CxGUGk9Wb8AIDjGWdsd/6mNYYggEW4FyEAMIMRRFpfxg8AOL5x3nbncFJuPw8sprso - JeWDmABgHiOItJ6MHwAwx3jtqTuLk/pWAUx3VnUXpaSuKgBgHiOItHzGDwCY57LqzuO0AKb7WHUXpKTe - VwDAXEYQabmMHwAw12nVnclpfagApvLiAwCwFM9DpPkZPwBgGd25nNb4Q2yAqbqLUVL3FQCwHCOINC/j - BwAsZ7wG1Z3PSY3n/gDTePvdycmnCgBYlhFEOn7GDwBYltvQPwYwjQ9gcu9BAFgLI4h0vIwfALC88RpU - d06nNf4gG2CKu6q7ECUFAKyHEUQ6fMYPAFiP7qxOa/xBNsAU45eh7kKU0rcKAFgXI4h0uIwfALAu47Wo - 7sxOavxBNsDRvam6i1BStxUAsD5GEOn1GT8AYH3Ga1HduZ3UeI4CcHTnVXcRSuqiAgDWyQgivTzjBwCs - 03gtqju70xp/mA1wVDdVdwFKyi+FALBuRhDp+Rk/AGC93lXd+Z3W+MNsgKN6qLoLUFIAwPoZQaSnZ/wA - gPXrzvC0xh9mAxxVd/FJygcuAcB2GEGk32f8AIBt+FJ1Z3lS4w+zAY7mrOouPkldVQDAdhhBpJ9n/ACA - 7RivSXXneVoAR3NddReepN5XAMC2GEGkHzN+AMC2+MPkx8bXAeAovHgAAGyV5zHS3xk/AGCbunM9rfEH - 2gBH0V10krqvAIDtMoJIxg8A2LLxGRjd+Z7UeE4PcHCnVXfRSepjBQBsmxFEyRk/AGDbPlXdGZ8WwMFd - Vt0FJ6kPFQCwfUYQJWb8AIDt+6Pqzvm03lUAB/W56i44SQEA+2EEUVLGDwDYj+6sT+uiAjio8UtTd8FJ - 6VsFAOyLEUQJGT8AYF/SX6MbjT/UBjio7mKT1G0FAOyPEUR7zvgBAPvjLi2Pz3EADsb9Bb21DgD2zAii - PWb8AIB98jm9jwEczKequ9Ak5ZdHANg3I4j2lPEDAPbrtOrO/7TGH2wDHMRD1V1okgIA9s8Ioj1k/ACA - /eueA6Q1/mAb4CC6i0xSdxUAkMEIoi1n/ACADJ6zPv7BNsCrva+6i0xSVxUAkMMvlNpixg8AyHFddc8H - 0gJ4NRfUxxEIAMhiBNGWMn4AQJazqntOkJbX7IBX88s/AJDK8yBtIeMHAGTqnhek5a4twKt1F5ek7isA - IJcRRGvO+AEAucZnYHTPD5Lyub3Aq7yruotLUh8rACCbEURrzPgBANluqu45QloAL3ZRdReWpD5UAABG - EK0p4wcAcF51zxPS8pwIeLHPVXdhSQoA4C9GEK0h4wcAMIznA91zhbTGEATwIuOXq+7CktK3CgDgn4wg - WjLjBwDwT93zhbRuK4AX6S4qSbmAAgAdI4iWyPgBAPzX+BDw7nlDUv6AGXiRP6ruopKUt9ABAD9jBNHM - jB8AQOeq6p47pAXwbJ+q7oKSlF8yAYBfMYJoRsYPAOBnTqvu+UNaHyqAZ7mvugtKUgAAv2ME0TEzfgAA - v9M9h0jrYwXwLN3FJKlxD0UAgKcwgugYGT8AgKfwR8yPXwOAJ3tfdReTpMY9FAEAnsoIokNm/AAAnspt - 7B8DeDIfoPR4D0UAgOcwgugQGT8AgOcYn3/RPadIy2t5wJN9qboLSVIAAC9hBNFrMn4AAC/RPa9I67IC - eJLuIpKU+wYCAK9hBNFLMn4AAC/1reqeXyTl83yBJ3lXdReRpD5WAACvYQTRczJ+AACvcVt1zzGSGs+n - AH7rououIkmNeycCALyWEURPyfgBALyW1/Mee1MB/JLFGADgcIwg+lXGDwDgENzR5bHzCuCX0u8ZOP79 - AQAOyQiiLuMHAHBI3fONtG4qgF/qLh5JjXfAAAAcmhFE/8z4AQAc2peqe96R1EMF8FPjsy+6i0dS3ioH - AByLEUQj4wcAcAzXVffcIy2An/pUdReOpPwyCgAckxEkO+MHAHAs76vu+UdaZxVA677qLhxJAQAcmxEk - M+MHAHBs3XOQtMY7YQBa3UUjqbsKAGAGI0hWxg8AYIbxGRjdc5GkxvNsgB94m9zJyVUFADCLESQj4wcA - MMtN1T0fSQvgB+PF/+6CkdRpBQAwkxFk3xk/AICZzqvuOUla7yqAfxm3f+ouGEkBACzBCLLPjB8AwGxv - qu55SVoXFcC/dBeLpMYHwAMALMUIsq+MHwDAUsbzkO75SVKfK4D/M3456y4WSX2sAACWZATZR8YPAGBJ - 7vLy+HwM4P+Mt4V1F4ukPlQAAEszgmw74wcAsLTLqnuekhbA/7mtugtFUgAAa2EE2WbGDwBgDU6r7rlK - Wn9UAP/zreouFCmNf38AgDUxgmwr4wcAsCbd85W0PlUA/9NdJJIa74ABAFgbI8g2Mn4AAGtzX3XPW5J6 - qAD+99kX3UUiqfMKAGCNjCDrzvgBAKzRx6p77pIWgAti5ZdWAGDNjCDrzPgBAKzVWdU9f0nrfQWE85Y4 - AID1M4KsK+MHALB23XOYtK4qIFx3cUjqrgIA2AIjyDoyfgAAW/Ct6p7LJPWlAoKdVt3FIanLCgBgK4wg - y2b8AAC24rbqns+kBQQbL/53F4akxggEALAlRpBlMn4AAFtyXnXPadLy/A2Cjds/dReGpAAAtsgIMjfj - BwCwNeO5S/e8Jq2LCgjVXRSSGh8ADwCwVUaQORk/AICt6p7bpDVuBQYEsgKfnHysAAC2zAhy3IwfAMCW - ufvL44fBA4HcB/Dk5EMFALB1RpDjZPwAALbuquqe56QFBBpv/+ouCEkBAOyFEeSwGT8AgD14X3XPddLy - R9AQ6KHqLggpefsbALA3RpDDZPwAAPake76TltvgQ6DuYpCUD0ACAPbICPK6jB8AwN6k/xH06L4Cgoy3 - fXUXg6TGZ6AAAOyREeRlGT8AgD36VHXPfdICgoy3fXUXgqT8cgsA7JkR5HkZPwCAvfqj6p7/pHVaASHG - 2766C0FK4xdcAIC9M4I8LeMHALB33XOgtC4rIER3EUjqrgIASGAE+XXGDwAgwXjO0z0XSsrrgRBivN2r - uwgkdVUBAKQwgvQZPwCAFJ+r7vlQUu4IAyHG2726i0BS7vkHAKQxgvw74wcAkOSi6p4TpeX5HwSw+AIA - ZDKCPGb8AADSvKu650VpnVfAzqXf8298ADwAQKr0EcT4AQCk6p4bpXVTATs2ftnrHvxJfawAAJKljiDG - DwAg2Zeqe46U1EMF7Nh4m1f34E/qrAIASJc2ghg/AIB011X3PCktYMfG27y6B35SAAA8ShlBjB8AAI9/ - FNw9V0rLH0fDjo23eXUP/JS8zQ0A4N/2PoIYPwAA/tY9X0prvBMG2KnuQZ/UbQUAwL/tdQQxfgAA/Fv6 - H0ePxnNfYIe8ze3xM1AAAPjR3kYQ4wcAwI/cHv8xYIc+Vt0DPqk3FQAAvb2MIMYPAIDe+OPg7vlTWqcV - sDN7v7/z7xq/CAMA8Gtbf85o/AAA+LnxPKl7DpXWRQXsTPdgT+quAgDg97Y6ghg/AAB+bzxn6p5LJfW5 - AnZkvK2re7AndVkBAPA0X6ruOdVaM34AADzN+CPh7vlUUu4UAzszXvzvHuxJubcfAMDzbOWX428VAABP - 43XCx4AdGW/r6h7oSQEA8Hw3Vffcai3dVwAAPJ07xTz2RwXsRPq9/fxiDADwcudV9xxr6cY4AwDA83XP - rdL6VAE70T3Ik/pYAQDwOmv5cPRxy6sPFQAALzP+WLh7npWUP5iGnVjrX+zNzC/IAACHMZ5bLvnuYn/Y - AgDweuM5VfdcKy1gB9Z+3+YZAQBwWOPDM2cOIW53BQBwOOOPhbvnXGm9r4CNe6i6B3hK498fAIDjGO8I - Odatscatrq4rAAAOr3v+ldZVBWxc9+BOyl8LAgDMMd4V8qXqnpM9tXEv5nFLhtMKAIDjGX9s0j0fS2o8 - dwU27KzqHtxJjb9KBABgrjFg/FGNd3B8rsYvl+OdImPgGI3/8/h//1RdVG4/AAAw123VvZaWFrBh4xfO - 7oGd1NsKAAAAAPjb+COU7rW0tN5VwEYd637MW2l8MCcAAAAA8G/jhf/u9bS0xhAEbFT3oE7qrgIAAAAA - ftS9npbWuBUYsEFW3McP4gQAAAAAfjQ+p617TS2p8WHwwAa5j9/jh28CAAAAAD+6qrrX1NICNuhz1T2g - kwIAAAAAemdV95paWh8qYGPGB4B3D+iUxgfAAwAAAAA/172ultbHCtiY7sGclAsXAAAAAPzaQ9W9tpbU - fQVsyB9V92BOylvXAAAAAODXPlXda2tpARviwgUAAAAA/I4/pH7stAI2Iv2ta+PfHwAAAAD4ve71tbSu - KmAjugdxUjcVAAAAAPB736vuNbak7ipgA86q7kGc1HkFAAAAAPze56p7jS2pMQIBG3BddQ/ipN5WAAAA - AMDvXVbda2xpeU0RNuBL1T2AU7LWAgAAAMDTjQ8A715nS8tdZWADugdvUu7XBwAAAADP073OlpbPFYaV - e1d1D96kxlv2AAAAAICn+1p1r7Ul9VABK3ZRdQ/epMZb9gAAAACAp/O5wo8BK3ZbdQ/cpAAAAACA5zmr - utfa0hpfB2ClvlXdAzel8VY9AAAAAOD5utfb0vpYASvVPWiTcoECAAAAgJcZn4HRveaWlD+whpX6o+oe - tEl5ixoAAAAAvMxN1b3mlhawQp+q7gGbFAAAAADwMudV95pbWqcVsDLpb1Eb//4AAAAAwMu8qbrX3dK6 - rICV6R6sSY236AEAAAAAL9e97pbW5wpYkfdV92BNarxFDwAAAAB4ubuqe+0tqe8VsCJXVfdgTeptBQAA - AAC8nNcZHwNW5EvVPVBTssoCAAAAwOuNDwDvXn9L648KWInuQZqU+/IBAAAAwGF0r7+l5fOGYSXGrZ+6 - B2lSlxUAAAAA8Hr3VfcaXFIPFbACF1X3IE1qvDUPAAAAAHi9T1X3GlxawArcVt0DNCkAAAAA4DA+VN1r - cGmdVcDCvlXdAzSlrxUAAAAAcDjd63BpXVfAwroHZ1IfKwAAAADgcNL/6Hr0pQIW5O1o3ooGAAAAAIfm - tvuPAQsa737oHphJAQAAAACHdVF1r8Wl9a4CFnJfdQ/MlMZb8QAAAACAwxov/Hevx6U1hiBgId2DMqmb - CgAAAAA4vO71uLTGrcCABZxW3YMyqfMKAAAAADi88SHg3WtySbkDDSzkquoelEm9qQAAAACAw7uuutfk - 0gIWcFd1D8iUvlcAAAAAwHG8r7rX5dL6UAGTdQ/GpMYABAAAAAAcT/e6XFofK2Cit1X3YEzqsgIAAAAA - jueh6l6bS+q+AiYaH/7dPRiTGh8CDwAAAAAcz03VvTaXFjDRbdU9EJMCAAAAAI7LH2I/5o+xYaJvVfdA - TOlrBQAAAAAc15uqe30urasKmKR7ECZ1XQEAAAAAx/e96l6jS+quAib4UHUPwqTOKgAAAADg+MaL/91r - dGkBE3ysugdgUgAAAADAHJdV9xpdWuN2YMCR3VfdAzClhwoAAAAAmGN8AHj3Ol1a4wPhgSPrHnxJ3VQA - AAAAwDzd63RpeV0SjszaamkFAAAAgNnS70ozcmcaODL323OvPQAAAACYzecSPwYc0V3VPfBS+l4BAAAA - AHOdVd3rdWmNrwNwJGMA6B54KY0BCAAAAACYr3u9Lq3xThjgCN5W3YMuqXELMAAAAABgvm9V95pdUl8r - 4AjGh393D7qkxofAAwAAAADz3Vbda3ZpAUdwU3UPuKQAAAAAgGX4A+3H3lXAgT1U3QMuJW8vAwAAAIDl - uEX/Y27TD0fQPdiS8gFDAAAAALCs7nW7tD5XwAGdVd2DLanxNQAAAAAAlnNXda/dJfW9Ag5ovPuhe7Al - BQAAAAAs66rqXrtLCzig8fkX3QMtpfH5JwAAAADAst5X3et3af1RAQfSPciSuqkAAAAAgOV1r9+l9akC - DuC06h5kSZ1XAAAAAMDyxt1autfwknLHGjiQy6p7kCX1pgIAAAAAljfe/dC9hpcWcAB3VfcAS+l7BQAA - AACsw/j8i+51vLTG56EArzQGgO4BltLnCgAAAABYj+51vLSuK+AVxq2fugdXUuMWYAAAAADAeqT/0fbo - SwW8wvjw7+7BldS7CgAAAABYj3HXlu61vLSAV7ipugdWUgAAAADAulxU3Wt5afnjbXiFh6p7YKX0tQIA - AAAA1mW88N+9npfWGIKAF+oeVEn5ICEAAAAAWKfu9by0bivgBc6q7kGV1PgaAAAAAADrMz4EvHtNL6lv - FfAC490P3YMqKQAAAABgnbx++RjwAuPzL7oHVErj808AAAAAgHVyB5vHPlTAM3UPpqRuKgAAAABgvbrX - 9dL6VAHPcFp1D6akzisAAAAAYL3GXVy61/aSuq+AZ7iougdTUm8qAAAAAGC9xl1cutf20gKe4XPVPZBS - +l4BAAAAAOs27uLSvb6X1vsKeKIxAHQPpJTGAAQAAAAArNvbqnt9L62rCnii7kGU1GUFAAAAAKxf+h9z - j+4q4An+qLoHUVLjQ+ABAAAAgPUbL/53r/GlBTyBDw4CAAAAALZi3M2le40vrXE7MOA3HqruAZTS1woA - AAAA2IZxN5fudb60xgfCA7/RPXiSuq4AAAAAgO3oXudL67YCfuF91T14kjqrAAAAAIDtuK+61/qSGnf2 - AX5hvPuhe/AkBQAAAABsy8eqe60vLeAXvlTdAyclKykAAAAAbM+Hqnu9L63xdQB+onvQJHVTAQAAAADb - 073el9Z4JwzQeFd1D5qkzisAAAAAYHu+Vd1rfkl9rYDGRdU9aJICAAAAALbptupe80sLaHyuugdMSt8r - AAAAAGCb/IH3Y6cV8B9jAOgeMCmNAQgAAAAA2Ca3+H/ssgL+o3uwJOXCAAAAAADb1r3ul9ZdBfzDH1X3 - YEnKW8MAAAAAYNu+VN1rf0m51T/8x6eqe7AkBQAAAABs21XVvfaX1psK+NND1T1QUvpaAQAAAADbdlZ1 - r/+ldV4Bf+oeJEldVwAAAADA9nWv/6V1UwHlfdU9SJIayzAAAAAAsH3pd7sZja8BUNwXDwAAAADYC593 - /BhQvlTdAyQlaygAAAAA7McfVfc6YFruegOle3Ak5X54AAAAALAv3euAafncY+K9q7oHR1JjEQYAAAAA - 9uN71b0WmNTXCqJdVN2DIykAAAAAYF8+V91rgWlBtNuqe2CkNJZgAAAAAGBfLqvu9cC0xh2AINa3qntg - pDSWYAAAAABgX06r7vXAtMYdgCBW96BIaizBAAAAAMD+dK8HpuUPwIn1oeoeFEmNJRgAAAAA2J/xIeDd - a4JJ+QgAYn2qugdFUgAAAADAPl1X3WuCaUGk+6p7QKT0pQIAAAAA9ums6l4XTOuPCuJ0D4akxgIMAAAA - AOxX97pgWuNOQBDlfdU9GJIaCzAAAAAAsF8PVffaYFLjawBRrqruwZAUAAAAALBvN1X32mBaEOWu6h4I - KVk9AQAAAGD/zqvu9cG0xh2BIEb3IEjKfe8AAAAAYP/eVN3rg2mNOwJBhLdV9yBI6o8KAAAAANi/7vXB - tMYdgSCCt30BAAAAACnSPw7gryDCbdU9AFL6XgEAAAAAGcbtn7rXCdMadwaC3ftWdQ+AlD5XAAAAAECG - 06p7nTCtcWcg2L3uhz+piwoAAAAAyNG9TpjWuDMQ7NqHqvvhT+pdBQAAAADkuK+61wqTGncGgl37WHU/ - /EkBAAAAAFk+Vd1rhWnBrqUvnV8rAAAAACCLO+M8Nr4OsFvdD31S1xUAAAAAkKd7vTCtcYcg2KXTqvuh - T+qsAgAAAADyjM/A6F4zTGrcIQh26arqfuiTAgAAAAAy3Vbda4ZpwS7dVd0PfEoPFQAAAACQ6aLqXjdM - a9wpCHbne9X9wKf0qQIAAAAAMr2rutcN07qsYFfeVN0Pe1J/VAAAAABAru51w7TGnYJgV86r7oc9KQAA - AAAg25eqe+0wqXGnINiVm6r7YU/JgxoAAAAAuK661w/TGncMgt0YHwDe/aCn9LkCAAAAALK9r7rXD9Ma - dwyC3eh+yJO6qAAAAAAAutcP0xp3DIJd+FB1P+RJvasAAAAAANLvljMaXwPYhY9V90OeFAAAAADAkP55 - yX8Fu/C16n7AUxr//gAAAAAAw/j8i+51xLTOKti87oc7qesKAAAAAGB4U3WvI6bldVM277TqfriTel8B - AAAAAPzle9W9lpiUO+eweZdV98OdFAAAAADAP91V3WuJacGmpT+QHyoAAAAAgH/yh+OPvatgs9LfynVT - AQAAAAD8k48OeOyigk3yYT4nJ39UAAAAAAD/1b2emNbnCjbpvOp+qJMCAAAAAOjcV91rikmNOwjBJo3b - P3U/1Cl58AIAAAAAP/Ox6l5XTAs2aXwAePcDnZK3bwEAAAAAP3NWda8rpuVjBNik7oc5KR/gAwAAAAD8 - Sve6YlqfKtgU6+XJybsKAAAAAOBnvlXda4tJjTsJwaZcV90Pc1IAAAAAAL9yW3WvLaYFm/K16n6QU/pS - AQAAAAD8ynnVvb6Y1vsKNqP7IU5qvAMGAAAAAOBX3lbd64tpXVWwCadV90OclMUSAAAAAHiK7vXFtO4q - 2ITLqvshTgoAAAAA4CnGi//da4xpwSZ8rrof4JQeKgAAAACApxi3f+peZ0xr3A4MVu971f0Ap/SpAgAA - AAB4inE7/e51xrQuKli97oc3qT8qAAAAAICn6l5nTOu2glUbL/53P7xJAQAAAAA8x7itfvdaY1LfKli1 - cfun7oc3pXH7LwAAAACA5xjvfuheb0wLVs1SKUmSJEmSJEl6SR8qWK3uh1aSJEmSJEmSpN/1sYJVOqu6 - H1pJkiRJ+v/t3S1TZckShtH5Ue1wWCwKj8Bi8a1a4rAobFscEtMWjcbxA25WxHTciYnsIc/3ztprRTzi - zrWFqbfPLkmSJOmr3iJYpPsoO7SSJEmSJEmSJFWCRfoVZQdWkiRJkiRJkqRKFxEsTnZYJUmSJEmSJEmq - 9j2CRTmPssMqSZIkSZIkSVK1lwgW5S7KDqskSZIkSZIkSdU+I1iU5yg7rJIkSZIkSZIkbdJZBIsxVrns - oEqSJEmSJEmStEm3ESxGdkglSZIkSZIkSdq0pwgW4SbKDqkkSZIkSZIkSZv2HsEiPEbZIZUkSZIkSZIk - aZtgEd6i7IBKkiRJkiRJkrRNVxGcXHY4JUmSJEmSJEnatvsITmqscNnhlCRJkiRJkiRp235FcFJjhcsO - pyRJkiRJkiRJuwQn9RplB1OSJEmSJEmSpF26iOBkskMpSZIkSZIkSdKu3UVwEudRdiglSZIkSZIkSdq1 - 5whOYqxv2aGUJEmSJEmSJGnXPiM4iZ9RdiglSZIkSZIkSdpHcBIfUXYgJUmSJEmSJEnaRzcRHF12GCVJ - kiRJkiRJ2lePERzVdZQdRkmSJEmSJEmS9tVbBEc1VrfsMEqSJEmSJEmStM/gqMbqlh1ESZIkSZIkSZL2 - 2WUER5MdQkmSJEmSJEmS9t2PCI5irG3ZIZQkSZIkSZIkad+9RnAUY23LDqEkSZIkSZIkSYcIjuIlyg6g - JEmSJEmSJEmH6CyCg8sOnyRJkiRJkiRJh+ougoMaK1t2+CRJkiRJkiRJOlQ/IziosbJlh0+SJEmSJEmS - pEP1EcFBjZUtO3ySJEmSJEmSJB0yOKixsmUHT5IkSZIkSZKkQ3YdwcFkh06SJEmSJEmSpEP3EMFBjHUt - O3SSJEmSJEmSJB269wgOYqxr2aGTJEmSJEmSJOkYjXeqYe/eouzASZIkSZIkSZJ0jH5FsHfZYZMkSZIk - SZIk6Vj5DBZ7dxFlh02SJEmSJEmSpGMGe/Ujyg6aJEmSJEmSJEnH7D6CvfH+hyRJkiRJkiRpCX1EsDfZ - IZMkSZIkSZIk6RSNZxtgZ9+j7IBJkiRJkiRJknSKniLY2a8oO2CSJEmSJEmSJJ2izwh2lh0uSZIkSZIk - SZJO2XkEW7uOsoMlSZIkSZIkSdIpG883wNYeo+xgSZIkSZIkSZJ0ysbzDbC19yg7WJIkSZIkSZIknTrY - WnagJEmSJEmSJElaQuMZB9iY9z8kSZIkSZIkSUvuIYKN/YiyAyVJkiRJkiRJ0hJ6jWBjP6PsQEmSJEmS - JEmStJRgY29RdpgkSZIkSZIkSVpKsLHsIEmSJEmSJEmStKQuIthIdpAkSZIkSZIkSVpStxGUnUfZQZIk - SZIkSZIkaUn9iKBs/GQoO0iSJEmSJEmSJC2pxwjKrqLsIEmSJEmSJEmStKR+RlB2E2UHSZIkSZIkSZKk - JfUSQdldlB0kSZIkSZIkSZKWlAGEjXyPsoO0li4lSZIkSZIkqVGvUXbXuYZ+RVC29gEEAAAAAKCT8Q5G - dte5hgwgbMQAAgAAAADQhwEEigwgAAAAAAB9GECgyAACAAAAANCHAQSKDCAAAAAAAH0YQKDIAAIAAAAA - 0IcBBIoMIAAAAAAAfRhAoMgAAgAAAADQhwEEigwgAAAAAAB9GECgyAACAAAAANCHAQSKDCAAAAAAAH0Y - QKDIAAIAAAAA0IcBBIoMIAAAAAAAfRhAoMgAAgAAAADQhwEEigwgAAAAAAB9GECgyAACAAAAANCHAQSK - DCAAAAAAAH0YQKDIAAIAAAAA0IcBBIoMIAAAAAAAfRhAoMgAAgAAAADQhwEEigwgAAAAAAB9GECgyAAC - AAAAANCHAQSKDCAAAAAAAH0YQKDIAAIAAAAA0IcBBIoMIAAAAAAAfRhAoMgAAgAAAADQhwEEigwgAAAA - AAB9GECgyAACAAAAANCHAQSKDCAAAAAAAH0YQKDIAAIAAAAA0IcBBIoMIAAAAAAAfRhAoMgAAgAAAADQ - hwEEigwgAAAAAAB9GECgyAACAAAAANCHAQSKDCAAAAAAAH0YQKDIAAIAAAAA0IcBBIoMIAAAAAAAfRhA - oMgAAgAAAADQhwEEigwgAAAAAAB9GECgyAACAAAAANCHAQSKDCAAAAAAAH0YQKDIAAIAAAAA0IcBBIoM - IAAAAAAAfRhAoMgAAgAAAADQhwEEigwgAAAAAAB9GECgyAACAAAAANCHAQSKDCAAAAAAAH0YQKDIAAIA - AAAA0IcBBIoMIAAAAAAAfRhAoMgAAgAAAADQhwEEigwgAAAAAAB9GECgyAACAAAAANCHAQSKDCAAAAAA - AH0YQKDIAAIAAAAA0IcBBIoMIAAAAAAAfRhAoMgAAgAAAADQhwEEigwgAAAAAAB9GECgyAACAAAAANCH - AQSKDCAAAAAAAH0YQKDIAAIAAAAA0IcBBIoMIAAAAAAAfRhAoMgAAgAAAADQhwEEigwgAAAAAAB9GECg - yAACAAAAANCHAQSKDCAAAAAAAH0YQKDIAAIAAAAA0IcBBIoMIAAAAAAAfRhAoMgAAgAAAADQhwEEigwg - AAAAAAB9GECgyAACAAAAANCHAQSKDCAAAAAAAH0YQKDIAAIAAAAA0IcBBIoMIAAAAAAAfRhAoMgAAgAA - AADQhwEEigwgAAAAAAB9GECgyAACAAAAANCHAQSKDCAAAAAAAH0YQKDIAAIAAAAA0IcBBIoMIAAAAAAA - fRhAoMgAAgAAAADQhwEEigwgAAAAAAB9GECgyAACAAAAANCHAQSKDCAAAAAAAH0YQKDIAAIAAAAA0IcB - BIoMIAAAAAAAfRhAoMgAAgAAAADQhwEEigwgAAAAAAB9GECgyAACAAAAANCHAQSKDCAAAAAAAH0YQKDI - AAIAAAAA0IcBBIoMIAAAAAAAfRhAoMgAAgAAAADQhwEEigwgAAAAAAB9GECgyAACAAAAANCHAQSKDCAA - AAAAdHAWXf7ddXTzd1d//7eL6FsEszOAQJEBBAAAAIClGMPGffQcvUXZfU61j2hclj5F4w5sjCQwAwMI - FBlAAAAAADiF8+hH9BJ9RtndzSEaw8i4QL6NoCMDCBQZQAAAAAA4lvHJqnF5e8zB46veo8dofEILOjCA - QJEBBAAAAIBDGp+1Gp+0yu5mltYYZh6i8d4ILJUBBIoMIAAAAAAcwnjLY0m/9Ni08QaJz2SxRAYQKDKA - AAAAALAv45cTs13OjhFnvFUCS2EAgSIDCAAAAAC7GsNHl89c7dL4VQucmgEEigwgAAAAAOxibZex4xch - 404NTsUAAkUGEAAAAAC2Me6VOr/xsWvjjZCLCI7NAAJFBhAAAAAANjEu/d+j7K5ljY3LaDgmAwgUGUAA - AAAAqHqKsjuWtTd+CXMbwTEYQKDIAAIAAADAV8Yj53718XV+DcIxGECgyAACAAAAwH+5i7J7FeWNoWgM - RnAoBhAoMoAAAAAA8CdrvmjdtTEcwSEYQKDIAAIAAABAxievdm+8mQL7ZgCBIgMIAAAAAP80Pt/0EWV3 - Kdq85wj2yQACRQYQAAAAAH47jz6j7B5F2+fSln0ygECRAQQAAACA4SrK7k+0n8YnxWAfDCBQZAABAAAA - wPhxnIwg7IMBBIoMIAAAAADrdhFl9yY6TEYQdmUAgSIDCAAAAMB6fYu8+XH8XiPYlgEEigwgAAAAAOv1 - EWV3Jjp8LxFswwACRQYQAAAAgHUan2LK7kt0vJ4i2JQBBIoMIAAAAADrM359kN2V6PjdRrAJAwgUGUAA - AAAA1mXt90FLbLzFAlUGECgygAAAAACsx0WU3ZHotI3PkUGVAQSKDCAAAAAA6+HR8+U2LrWhwgACRQYQ - AAAAgHXw7sfyu4ngKwYQKDKAAAAAAMzvOsruRrSsPiP4igEEigwgAAAAAPPz6as+PUXwXwwgUGQAAQAA - AJjbQ5Tdi2i5jcfq4U8MIFBkAAEAAACY17couxPRsnuL4E8MIFBkAAEAAACY12uU3Ylo+d1FkDGAQJEB - BAAAAGBOV1F2H6IeeRCdPzGAQJEBBAAAAGBO4zNK2X2I+vQjgn8zgECRAQQAAABgPtdRdheiXvkVCBkD - CBQZQAAAAADm49cf8zTu7+CfDCBQZAABAAAAmMtFlN2DqGcfEfyTAQSKDCAAAAAAc3mOsnsQ9W180gx+ - M4BAkQEEAAAAYC7ZHYh69xrBbwYQKDKAAAAAAMxj7Xc9Mwe/GUCgyAACAAAAMI/3KLsDUf/uIxgMIFBk - AAEAAACYw1mU3X9ojsa4BYMBBIoMIAAAAABzGL8QyO4/NE9j5AIDCBQZQAAAAADm8BFl9x+aJ5/BYjCA - QJEBBAAAAGAO2d2H5uotAgMIFBlAAAAAAPq7i7K7D80XGECgyAACAAAA0N9zlN19aL6uI9bNAAJFBhAA - AACA/j6j7O5D8/UYsW4GECgygAAAAAD0l917aM7eI9bNAAJFBhAAAACA3m6i7N5D88a6GUCgyAACAAAA - 0Nt9lN17aN7OI9bLAAJFBhAAAACA3l6i7N5D83YbsV4GECgygAAAAAD05gH09fUQsV4GECgygAAAAAD0 - lt15aO6eI9bLAAJFBhAAAACA3rI7D83de8R6GUCgyAACAAAA0NdllN15aP5YLwMIFBlAAAAAAPq6jrI7 - D80f62UAgSIDCAAAAEBfd1F256H5Y70MIFBkAAEAAADo60eU3Xlo/s4i1skAAkUGEAAAAIC+7qPszkPz - dx6xTgYQKDKAAAAAAPT1EGV3Hpq/i4h1MoBAkQEEAAAAoK/HKLvz0PxdRqyTAQSKDCAAAAAAfRlA1psB - ZL0MIFBkAAEAAADoywCy3nwCa70MIFBkAAEAAADoyyPo680j6OtlAIEiAwgAAABAXwaQ9XYWsU4GECgy - gAAAAAD0dRdldx6aP9bLAAJFBhAAAACAvm6i7M5D88d6GUCgyAACAAAA0NdVlN15aP5YLwMIFBlAAAAA - APoa70Bkdx6au/eI9TKAQJEBBAAAAKC37M5Dc/cSsV4GECgygAAAAAD09hll9x6at8eI9TKAQJEBBAAA - AKC3cSGY3Xto3m4j1ssAAkUGEAAAAIDeHqLs3kPzdhGxXgYQKDKAAAAAAPQ2fg2Q3Xto3lg3AwgUGUAA - AAAAejuLsnsPzdlHxLoZQKDIAAIAAADQX3bvoTl7ilg3AwgUGUAAAAAA+nuJsrsPzZcH0DGAQJEBBAAA - AKC/td/xrCkwgECRAQQAAACgP++ArKP3CAwgUGQAAQAAAJjDeBw7u//QPD1EYACBIgMIAAAAwBweo+z+ - Q/N0EYEBBIoMIAAAAABzGJfj2f2H5ugzgsEAAkUGEAAAAIB5jEvy7A5E/Ru/8IHBAAJFBhAAAACAedxH - 2R2I+ncewWAAgSIDCAAAAMBcsjsQ9e49gt8MIFBkAAEAAACYy2uU3YOob3cR/GYAgSIDCAAAAMBcrqPs - HkQ98/g5/2YAgSIDCAAAAMB8xieTsrsQ9Wu86wL/ZACBIgMIAAAAwHxuo+wuRP2CfzOAQJEBBAAAAGBO - H1F2H6I+PUbwbwYQKDKAAAAAAMzJr0D6BxkDCBQZQAAAAADm5S2Qvnn7gz8xgECRAQQAAABgXpdRdiei - ZTc+XwZ/YgCBIgMIAAAAwNzWfFnatasI/sQAAkUGEAAAAID5fUbZ3YiW10sE/8UAAkUGEAAAAID53UXZ - 3YiWF3zFAAJFBhAAAACAdXiLsvsRLacfEXzFAAJFBhAAAACA9fAprOX2GkGFAQSKDCAAAAAA63ETZXck - Om1jmIIqAwgUGUAAAAAA1uUxyu5JdLouI6gygECRAQQAAABgfbwHspzuI9iEAQSKDCAAAAAA6+Q9kNPn - 3Q+2YQCBIgMIAAAAwDqdR9l9iY7T+BUObMMAAkUGEAAAAID1uoqyOxMdtvcItmUAgSIDCAAAAMC63UTZ - vYkO0/j0GOzCAAJFBhAAAAAA1n5HdKzG+PEtgl0YQKDIAAIAAADAYAQ5bGP8GO+uwK4MIFBkAAEAAADg - t9sou0PRbnnzg30ygECRAQQAAACAf/Iw+n57i2CfDCBQZAABAAAA4N/Gp5rGJ5uy+xTVe41g3wwgUGQA - AQAAAOBPxq8XsjsVfd1TBIdgAIEiAwgAAAAA/2Vc5Gf3Ksobv5y5juBQDCBQZAABAAAA4CvjQt8nsb7O - ex8cgwEEigwgAAAAAFSNy8fsjkV//fUQwTEYQKDIAAIAAADAJu4ivwb5f+NXH+PReDgWAwgUGUAAAAAA - 2Mba3wYZI9AYg+DYDCBQZAABAAAAYFsX0XuU3bvM3LiAhlMxgECRAQQAAACAXd1EaxhCnqOzCE7JAAJF - BhAAAAAA9mXWIWQMH975YCkMIFBkAAEAAABg3y6jlyi7j+nSeOPjIYKlMYBAkQEEAAAAgEP6EXX6Vchr - NH7JAktlAIEiAwgAAAAAxzDezriPljiGjNHjLoIODCBQZAABAAAA4BRuo3GR+xFl9zaH7C16jK4i6MYA - AkUGEAAAAACW4Doan8saD47v81ciY+x4isYvPMbbJNCdAQSKDCAAAAAALNl5NH6pMd7lGCPGGElG44Hy - 8Umt3/97/H9jRBkjx/jcFszKAAJFBhAAAAAAgD4MIFBkAAEAAAAA6MMAAkUGEAAAAACAPgwgUGQAAQAA - AADowwACRQYQAAAAAIA+DCBQZAABAAAAAOjDAAJFBhAAAAAAgD4MIFBkAAEAAAAA6MMAAkUGEAAAAACA - PgwgUGQAAQAAAADowwACRQYQAAAAAIA+DCBQZAABAAAAAOjDAAJFBhAAAAAAgD4MIFBkAAEAAAAA6MMA - AkUGEAAAAACAPgwgUGQAAQAAAADowwACRQYQAAAAAIA+DCBQZAABAAAAAOjDAAJFBhAAAAAAgD4MIFBk - AAEAAAAA6MMAAkUGEAAAAACAPgwgUGQAAQAAAADowwACRQYQAAAAAIA+DCBQZAABAAAAAOjDAAJFBhAA - AAAAgD4MIFBkAAEAAAAA6MMAAkUGEAAAAACAPgwgUGQAAQAAAADowwACRQYQAAAAAIA+DCBQZAABAAAA - AOjDAAJFBhAAAAAAgD4MIFBkAAEAAAAA6MMAAkUGEAAAAACAPgwgUGQAAQAAAADowwACRQYQAAAAAIA+ - DCBQZAABAAAAAOjDAAJFBhAAAAAAgD4MIFBkAAEAAAAA6MMAAkUGEAAAAACAPgwgUGQAAQAAAADowwAC - RQYQAAAAAIA+DCBQZAABAAAAAOjDAAJFBhAAAAAAgD4MIFBkAAEAAAAA6MMAAkUGEAAAAACAPgwgUGQA - AQAAAADowwACRQYQAAAAAIA+DCBQZAABAAAAAOjDAAJFBhAAAAAAgD4MIFBkAAEAAAAA6MMAAkUGEAAA - AACAPgwgUGQAAQAAAADowwACRQYQAAAAAIA+DCBQZAABAAAAAOjDAAJFBhAAAAAAgD4MIFBkAAEAAAAA - 6MMAAkUGEAAAAACAPgwgUGQAAQAAAADowwACRQYQAAAAAIA+DCBQZAABAAAAAOjDAAJFBhAAAAAAgD4M - IFBkAAEAAAAA6MMAAkUGEAAAAACAPgwgUGQAAQAAAADowwACRQYQAAAAAIA+DCBQZAABAAAAAOjDAAJF - BhAAAAAAgD4MIFBkAAEAAAAA6MMAAkUGEAAAAACAPgwgUGQAAQAAAADowwACRQYQAAAAAIA+DCBQZAAB - AAAAAOjDAAJFBhAAAAAAgD4MIFBkAAEAAAAA6MMAAkUGEAAAAACAPgwgUGQAAQAAAADowwACRQYQAAAA - AIA+DCBQZAABAAAAAOjDAAJFBhAAAAAAgD4MIFBkAAEAAAAA6MMAAkUGEAAAAACAPgwgUGQAAQAAAADo - wwACRQYQAAAAAIA+DCBQZAABAAAAAOjDAAJFBhAAAAAAgD4MIFBkAAEAAAAA6MMAAkUGEAAAAACAPgwg - UGQAAQAAAADowwACRQYQAAAAAIA+DCBQZAABAAAAAOjDAAJFBhAAAAAAgD4MIFBkAAEAAAAA6MMAAkUG - EAAAAACAPgwgUGQAAQAAAADowwACRWsfQL5JkiRJkiRJUqNeouyucw0ZQNjIXZQdJEmSJEmSJEmSltRr - BGUGEEmSJEmSJElSh8avX6DsNsoOkiRJkiRJkiRJS+o5grLrKDtIkiRJkiRJkiQtqfEAPJRdRtlBkiRJ - kiRJkiRpST1EUHYWZQdJkiRJkiRJkqQl9T2CjWQHSZIkSZIkSZKkJTXetIaNZAdJkiRJkiRJkqQlNZ50 - gI28R9lhkiRJkiRJkiRpKcHGXqLsMEmSJEmSJEmStJRgY/dRdpgkSZIkSZIkSVpCbxFs7DrKDpQkSZIk - SZIkSUvoZwQbO4uyAyVJkiRJkiRJ0hL6HsFWPqPsUEmSJEmSJEmSdOouItjKc5QdKkmSJEmSJEmSTh1s - bfx8KDtUkiRJkiRJkiSdstcItuYdEEmSJEmSJEnSEvP+Bzv7iLLDJUmSJEmSJEnSqRr/gB928hRlh0uS - JEmSJEmSpFM0/uE+7Owyyg6YJEmSJEmSJEmn6CGCvfiMskMmSZIkSZIkSdKxO49gL8aalh0ySZIkSZIk - SZKOmc9fsVfjMZnsoEmSJEmSJEmSdMy+R7BXv6LssEmSJEmSJEmSdKxg726j7LBJkiRJkiRJknSMfkZw - EOPbatmhkyRJkiRJkiTp0I3nGuAgxrfVskMnSZIkSZIkSdIhe47goD6j7PBJkiRJkiRJknSoziM4KL8C - kSRJkiRJkiQds5cIjsKvQCRJkiRJkiRJx8qvPzia2yg7hJIkSZIkSZIk7TNvf3B0v6LsMEqSJEmSJEmS - tK/g6L5F2WGUJEmSJEmSJGkf3UVwEg9RdiglSZIkSZIkSdqltwhO6iPKDqckSZIkSZIkSdt2EcFJXUbZ - 4ZQkSZIkSZIkaZvG14dgEe6j7JBKkiRJkiRJkrRJvyJYlHEos8MqSZIkSZIkSVKlzwgWaRzO7NBKkiRJ - kiRJkvRVVxEskvdAJEmSJEmSJEnb5N0PFu97lB1eSZIkSZIkSZKyniNowaPokiRJkiRJkqRKHj2nnZ9R - dpglSZIkSZIkSRq9RdDSS5QdakmSJEmSJEnSuvuIoLXXKDvckiRJkiRJkqR19hmdRdDeeMAmO+SSJEmS - JEmSpHX1HsFUnqLssEuSJEmSJEmS1pE3P5jWfZQdekmSJEmSJEnS3I3nEmBqd1F2+CVJkiRJkiRJczae - SYBVOI/GC//ZH4IkSZIkSZIkaZ7GP4qH1XmJsj8ISZIkSZIkSVLvxmPn4x/Dw2r9iLI/DkmSJEmSJElS - z3zyCv52EY01MPtDkSRJkiRJkiT16DPyyStIfI+yPxpJkiRJkiRJ0rL7GQFfGD+Pyv6AJEmSJEmSJEnL - anzdZ3zlByi6inwWS5IkSZIkSZKW2fjc1fiqD7ClMYS8RdkfmCRJkiRJkiTpuBk+YM/GEPIryv7gJEmS - JEmSJEmH7SPywDkc0PiW3HhMJ/sDlCRJkiRJkiTtt/EP028i4IjG2ujzWJIkSZIkSZK038avPe6jswg4 - sfHNudco+2OVJEmSJEmSJP1379FDNL7CAyzUeC9k/KF6M0SSJEmSJEmS8sbg8Rj5vBU0Nn6mNf6Ixyjy - HPlsliRJkiRJkqS1NIaOl2iMHeNZAb/wgBX5Fo0/+tGlJEmSJEmSJDXs9x2ndzsAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAA6Omvv/4HGziIzB1SPPcAAAAASUVORK5CYII= - - - - 180, 22 - - - Installation - - - False - - - - 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 - - - - 180, 22 - - - FAQ - - - 177, 6 - - - Alt+S - - - 180, 22 - - - Settings - - - 44, 20 - - - Help - - - 24, 44 - - - 1016, 24 - - - 2 - - - MainMenuStrip - - - menuStrip - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - 298, 17 + + 182, 92 + + + contextMenuMetaTree + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x + DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 + jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC + + + + 181, 22 + + + Add Entry + 160, 22 @@ -4179,20 +2196,6 @@ Add ANIM Entry - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x - DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 - jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC - - - - 181, 22 - - - Add Entry - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -4228,14 +2231,128 @@ Edit All Entries - - 182, 92 + + openTab - - contextMenuMetaTree + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabControl + + + 0 + + + editorTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + tabControl + + + 1 + + + Fill + + + 20, 30 + + + 0, 0, 0, 0 + + + 1024, 600 + + + 0 + + + tabControl + + + MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 4 + + + pckOpen + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + openTab + + + 2 + + + label5 + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + openTab + + + 3 + + + labelVersion + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + openTab + + + 4 + + + ChangelogRichTextBox + + + System.Windows.Forms.RichTextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + openTab + + + 5 + + + 4, 38 + + + 18, 30, 20, 5 + + + 1016, 558 + + + 1 + + + openTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + tabControl + + + 0 None @@ -5347,33 +3464,120 @@ 5 - - 4, 38 - - - 18, 30, 20, 5 - - - 1016, 558 - - - 1 - - - openTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - tabControl - - - 0 - + + True + None + + pckFileLabel + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 2 + + + labelImageSize + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 3 + + + fileEntryCountLabel + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 4 + + + PropertiesTabControl + + + MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 5 + + + label11 + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 6 + + + treeViewMain + + + System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + editorTab + + + 7 + + + previewPictureBox + + + PckStudio.ToolboxItems.InterpolationPictureBox, PCK-Studio, Version=7.0.0.0, Culture=neutral, PublicKeyToken=null + + + editorTab + + + 9 + + + 4, 38 + + + 5, 50, 5, 7 + + + 1016, 558 + + + 0 + + + editorTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + tabControl + + + 1 + 3, 17 @@ -5452,6 +3656,138 @@ Top, Bottom, Right + + MetaTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + PropertiesTabControl + + + 0 + + + 338, 277 + + + 671, 282 + + + 11 + + + PropertiesTabControl + + + MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 5 + + + metroLabel2 + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 2 + + + treeMeta + + + System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MetaTab + + + 3 + + + entryTypeTextBox + + + MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 4 + + + entryDataTextBox + + + MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 5 + + + buttonEdit + + + MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 6 + + + metroLabel1 + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 7 + + + 4, 38 + + + 3, 3, 3, 3 + + + 663, 240 + + + 0 + + + Properties + + + MetaTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + PropertiesTabControl + + + 0 + Top, Right @@ -5653,54 +3989,6 @@ 7 - - 4, 38 - - - 3, 3, 3, 3 - - - 663, 240 - - - 0 - - - Properties - - - MetaTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - PropertiesTabControl - - - 0 - - - 338, 277 - - - 671, 282 - - - 11 - - - PropertiesTabControl - - - MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 5 - True @@ -5803,57 +4091,6 @@ 9 - - 4, 38 - - - 5, 50, 5, 7 - - - 1016, 558 - - - 0 - - - editorTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - tabControl - - - 1 - - - Fill - - - 20, 30 - - - 0, 0, 0, 0 - - - 1024, 600 - - - 0 - - - tabControl - - - MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - $this - - - 4 - Top, Right @@ -8792,54 +7029,12 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - addEntryToolStripMenuItem + + helpToolStripMenuItem - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - addEntryToolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - addBOXEntryToolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - addANIMEntryToolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - addMultipleEntriesToolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - deleteEntryToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - editAllEntriesToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - imageList - - - System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - aboutToolStripMenuItem @@ -8924,24 +7119,6 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolStripSeparator2 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - installationToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - fAQToolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - toolStripSeparator3 @@ -8954,12 +7131,54 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - helpToolStripMenuItem + + addEntryToolStripMenuItem - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + addEntryToolStripMenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + addBOXEntryToolStripMenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + addANIMEntryToolStripMenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + addMultipleEntriesToolStripMenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + deleteEntryToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + editAllEntriesToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + imageList + + + System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + MainForm From 16d666444297ad3e02a77630287468fec7dbd80c Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 28 Aug 2023 14:01:28 +0200 Subject: [PATCH 22/36] MainForm.cs - Updated PckManager to bring to front when re-opening --- PCK-Studio/MainForm.cs | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index 2749d8a4..d0b8826a 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -682,32 +682,32 @@ namespace PckStudio /// True if the remove should be canceled, otherwise False private bool BeforeFileRemove(PckFile.FileData file) { - string itemPath = "res/textures/items/"; + string itemPath = "res/textures/items/"; - // warn the user about deleting compass.png and clock.png - if (file.Filetype == PckFile.FileData.FileType.TextureFile && - (file.Filename == itemPath + "compass.png" || file.Filename == itemPath + "clock.png")) - { + // warn the user about deleting compass.png and clock.png + if (file.Filetype == PckFile.FileData.FileType.TextureFile && + (file.Filename == itemPath + "compass.png" || file.Filename == itemPath + "clock.png")) + { if (MessageBox.Show("Are you sure want to delete this file? If \"compass.png\" or \"clock.png\" are missing, your game will crash upon loading this pack.", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) return true; - } + } - // remove loc key if its a skin/cape - if (file.Filetype == PckFile.FileData.FileType.SkinFile || file.Filetype == PckFile.FileData.FileType.CapeFile) - { - if (TryGetLocFile(out LOCFile locFile)) - { + // remove loc key if its a skin/cape + if (file.Filetype == PckFile.FileData.FileType.SkinFile || file.Filetype == PckFile.FileData.FileType.CapeFile) + { + if (TryGetLocFile(out LOCFile locFile)) + { locFile.RemoveLocKey(file.Properties.GetPropertyValue("THEMENAMEID")); locFile.RemoveLocKey(file.Properties.GetPropertyValue("DISPLAYNAMEID")); - TrySetLocFile(locFile); - } - } + TrySetLocFile(locFile); + } + } return false; } private void deleteFileToolStripMenuItem_Click(object sender, EventArgs e) - { + { var node = treeViewMain.SelectedNode; if (node == null) return; @@ -2183,7 +2183,10 @@ namespace PckStudio e.Cancel = true; }; if (!PckManager.Visible) + { PckManager.Show(); + PckManager.BringToFront(); + } if (PckManager.Focus()) PckManager.BringToFront(); } From 68705baa49c707a4f789db839022247d7cfab9df Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 28 Aug 2023 21:36:11 +0200 Subject: [PATCH 23/36] Updated OMI submodule --- .../Extensions/PckFileDataExtensions.cs | 22 +- PCK-Studio/Extensions/PckFileExtensions.cs | 4 +- PCK-Studio/Features/WiiUPanel.cs | 2 +- .../Forms/Additional-Popups/AddFilePrompt.cs | 2 +- PCK-Studio/Forms/Editor/AudioEditor.cs | 4 +- PCK-Studio/Forms/Editor/BehaviourEditor.cs | 4 +- PCK-Studio/Forms/Editor/COLEditor.cs | 4 +- PCK-Studio/Forms/Editor/GameRuleFileEditor.cs | 4 +- PCK-Studio/Forms/Editor/LOCEditor.cs | 4 +- PCK-Studio/Forms/Editor/MaterialsEditor.cs | 4 +- PCK-Studio/Forms/Editor/TextureAtlasEditor.cs | 8 +- .../Forms/Skins-And-Textures/AddNewSkin.cs | 10 +- .../Skins-And-Textures/AdvancedOptions.cs | 12 +- .../Forms/Skins-And-Textures/generateModel.cs | 6 +- .../Utilities/TextureConverterUtility.cs | 12 +- PCK-Studio/Forms/Utilities/pckCenterOpen.cs | 14 +- PCK-Studio/Helper/AnimationHelper.cs | 4 +- PCK-Studio/Internal/PckNodeSorter.cs | 10 +- PCK-Studio/MainForm.cs | 304 +++++++++--------- Vendor/OMI-Lib | 2 +- 20 files changed, 218 insertions(+), 218 deletions(-) diff --git a/PCK-Studio/Extensions/PckFileDataExtensions.cs b/PCK-Studio/Extensions/PckFileDataExtensions.cs index 0c2f4bc9..9488fdcb 100644 --- a/PCK-Studio/Extensions/PckFileDataExtensions.cs +++ b/PCK-Studio/Extensions/PckFileDataExtensions.cs @@ -18,11 +18,11 @@ namespace PckStudio.Extensions private static Image EmptyImage = new Bitmap(1, 1, PixelFormat.Format32bppArgb); - internal static Image GetTexture(this PckFile.FileData file) + internal static Image GetTexture(this PckFileData file) { - if (file.Filetype != PckFile.FileData.FileType.SkinFile && - file.Filetype != PckFile.FileData.FileType.CapeFile && - file.Filetype != PckFile.FileData.FileType.TextureFile) + if (file.Filetype != PckFileType.SkinFile && + file.Filetype != PckFileType.CapeFile && + file.Filetype != PckFileType.TextureFile) { throw new Exception("File is not suitable to contain image data."); } @@ -41,7 +41,7 @@ namespace PckStudio.Extensions } } - internal static void SetData(this PckFile.FileData file, IDataFormatWriter writer) + internal static void SetData(this PckFileData file, IDataFormatWriter writer) { using (var stream = new MemoryStream()) { @@ -50,11 +50,11 @@ namespace PckStudio.Extensions } } - internal static void SetData(this PckFile.FileData file, Image image, ImageFormat imageFormat) + internal static void SetData(this PckFileData file, Image image, ImageFormat imageFormat) { - if (file.Filetype != PckFile.FileData.FileType.SkinFile && - file.Filetype != PckFile.FileData.FileType.CapeFile && - file.Filetype != PckFile.FileData.FileType.TextureFile) + if (file.Filetype != PckFileType.SkinFile && + file.Filetype != PckFileType.CapeFile && + file.Filetype != PckFileType.TextureFile) { throw new Exception("File is not suitable to contain image data."); } @@ -66,7 +66,7 @@ namespace PckStudio.Extensions } } - internal static bool IsMipmappedFile(this PckFile.FileData file) + internal static bool IsMipmappedFile(this PckFileData file) { // We only want to test the file name itself. ex: "terrainMipMapLevel2" string name = Path.GetFileNameWithoutExtension(file.Filename); @@ -81,7 +81,7 @@ namespace PckStudio.Extensions return true; } - internal static string GetNormalPath(this PckFile.FileData file) + internal static string GetNormalPath(this PckFileData file) { if (!file.IsMipmappedFile()) return file.Filename; diff --git a/PCK-Studio/Extensions/PckFileExtensions.cs b/PCK-Studio/Extensions/PckFileExtensions.cs index f24df276..45eca6a9 100644 --- a/PCK-Studio/Extensions/PckFileExtensions.cs +++ b/PCK-Studio/Extensions/PckFileExtensions.cs @@ -11,7 +11,7 @@ namespace PckStudio.Extensions { internal static class PckFileExtensions { - internal static PckFile.FileData CreateNewFileIf(this PckFile pck, bool condition, string filename, PckFile.FileData.FileType filetype, IDataFormatWriter writer) + internal static PckFileData CreateNewFileIf(this PckFile pck, bool condition, string filename, PckFileType filetype, IDataFormatWriter writer) { if (condition) { @@ -20,7 +20,7 @@ namespace PckStudio.Extensions return null; } - internal static PckFile.FileData CreateNewFile(this PckFile pck, string filename, PckFile.FileData.FileType filetype, IDataFormatWriter writer) + internal static PckFileData CreateNewFile(this PckFile pck, string filename, PckFileType filetype, IDataFormatWriter writer) { var file = pck.CreateNewFile(filename, filetype); file.SetData(writer); diff --git a/PCK-Studio/Features/WiiUPanel.cs b/PCK-Studio/Features/WiiUPanel.cs index d81bae23..ce438ab0 100644 --- a/PCK-Studio/Features/WiiUPanel.cs +++ b/PCK-Studio/Features/WiiUPanel.cs @@ -236,7 +236,7 @@ namespace PckStudio.Features var reader = new PckFileReader(); currentPCK = reader.FromFile(filepath); if (currentPCK is null) return string.Empty; - return currentPCK.TryGetFile("0", PckFile.FileData.FileType.InfoFile, out var file) + return currentPCK.TryGetFile("0", PckFileType.InfoFile, out var file) ? file.Properties.GetPropertyValue("PACKID") : string.Empty; } diff --git a/PCK-Studio/Forms/Additional-Popups/AddFilePrompt.cs b/PCK-Studio/Forms/Additional-Popups/AddFilePrompt.cs index 0a1d9d73..29d80d57 100644 --- a/PCK-Studio/Forms/Additional-Popups/AddFilePrompt.cs +++ b/PCK-Studio/Forms/Additional-Popups/AddFilePrompt.cs @@ -12,7 +12,7 @@ namespace PckStudio.Popups /// otherwise /// public string Filepath => DialogResult == DialogResult.OK ? InputTextBox.Text : string.Empty; - public PckFile.FileData.FileType Filetype => (PckFile.FileData.FileType)FileTypeComboBox.SelectedIndex; + public PckFileType Filetype => (PckFileType)FileTypeComboBox.SelectedIndex; public AddFilePrompt(string initialText) : this(initialText, -1) { } diff --git a/PCK-Studio/Forms/Editor/AudioEditor.cs b/PCK-Studio/Forms/Editor/AudioEditor.cs index 9ed7e8dd..7c04fa28 100644 --- a/PCK-Studio/Forms/Editor/AudioEditor.cs +++ b/PCK-Studio/Forms/Editor/AudioEditor.cs @@ -29,7 +29,7 @@ namespace PckStudio.Forms.Editor { public string defaultType = "yes"; PckAudioFile audioFile = null; - PckFile.FileData audioPCK; + PckFileData audioPCK; bool _isLittleEndian = false; MainForm parent = null; @@ -63,7 +63,7 @@ namespace PckStudio.Forms.Editor return (PckAudioFile.AudioCategory.EAudioType)Categories.IndexOf(category); } - public AudioEditor(PckFile.FileData file, bool isLittleEndian) + public AudioEditor(PckFileData file, bool isLittleEndian) { InitializeComponent(); diff --git a/PCK-Studio/Forms/Editor/BehaviourEditor.cs b/PCK-Studio/Forms/Editor/BehaviourEditor.cs index 2342f4e5..5e4dddde 100644 --- a/PCK-Studio/Forms/Editor/BehaviourEditor.cs +++ b/PCK-Studio/Forms/Editor/BehaviourEditor.cs @@ -20,7 +20,7 @@ namespace PckStudio.Forms.Editor public partial class BehaviourEditor : MetroForm { // Behaviours File Format research by Miku and MattNL - private readonly PckFile.FileData _file; + private readonly PckFileData _file; BehaviourFile behaviourFile; private readonly JObject EntityJSONData = JObject.Parse(Properties.Resources.entityData); @@ -61,7 +61,7 @@ namespace PckStudio.Forms.Editor treeView1.EndUpdate(); } - public BehaviourEditor(PckFile.FileData file) + public BehaviourEditor(PckFileData file) { InitializeComponent(); diff --git a/PCK-Studio/Forms/Editor/COLEditor.cs b/PCK-Studio/Forms/Editor/COLEditor.cs index f7f38fc1..611eaafb 100644 --- a/PCK-Studio/Forms/Editor/COLEditor.cs +++ b/PCK-Studio/Forms/Editor/COLEditor.cs @@ -19,14 +19,14 @@ namespace PckStudio.Forms.Editor ColorContainer colourfile; ColorContainer.Color clipboard_color; - private readonly PckFile.FileData _file; + private readonly PckFileData _file; List colorCache = new List(); List waterCache = new List(); List underwaterCache = new List(); List fogCache = new List(); - public COLEditor(PckFile.FileData file) + public COLEditor(PckFileData file) { InitializeComponent(); diff --git a/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs b/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs index cdee39b6..7e412717 100644 --- a/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs +++ b/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs @@ -36,7 +36,7 @@ namespace PckStudio.Forms.Editor { public partial class GameRuleFileEditor : MetroFramework.Forms.MetroForm { - private PckFile.FileData _pckfile; + private PckFileData _pckfile; private GameRuleFile _file; private GameRuleFile.CompressionType compressionType; private GameRuleFile.CompressionLevel compressionLevel; @@ -69,7 +69,7 @@ namespace PckStudio.Forms.Editor } } - public GameRuleFileEditor(PckFile.FileData file) : this() + public GameRuleFileEditor(PckFileData file) : this() { _pckfile = file; using (var stream = new MemoryStream(file.Data)) diff --git a/PCK-Studio/Forms/Editor/LOCEditor.cs b/PCK-Studio/Forms/Editor/LOCEditor.cs index d830e9ea..d19c067c 100644 --- a/PCK-Studio/Forms/Editor/LOCEditor.cs +++ b/PCK-Studio/Forms/Editor/LOCEditor.cs @@ -19,9 +19,9 @@ namespace PckStudio.Forms.Editor { DataTable tbl; LOCFile currentLoc; - PckFile.FileData _file; + PckFileData _file; - public LOCEditor(PckFile.FileData file) + public LOCEditor(PckFileData file) { InitializeComponent(); _file = file; diff --git a/PCK-Studio/Forms/Editor/MaterialsEditor.cs b/PCK-Studio/Forms/Editor/MaterialsEditor.cs index 24623953..88bb11e8 100644 --- a/PCK-Studio/Forms/Editor/MaterialsEditor.cs +++ b/PCK-Studio/Forms/Editor/MaterialsEditor.cs @@ -18,7 +18,7 @@ namespace PckStudio.Forms.Editor public partial class MaterialsEditor : MetroForm { // Materials File Format research by PhoenixARC - private readonly PckFile.FileData _file; + private readonly PckFileData _file; MaterialContainer materialFile; private readonly JObject EntityJSONData = JObject.Parse(Properties.Resources.entityData); @@ -50,7 +50,7 @@ namespace PckStudio.Forms.Editor treeView1.EndUpdate(); } - public MaterialsEditor(PckFile.FileData file) + public MaterialsEditor(PckFileData file) { InitializeComponent(); _file = file; diff --git a/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs b/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs index a8743487..1e254701 100644 --- a/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs +++ b/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs @@ -107,7 +107,7 @@ namespace PckStudio.Forms.Editor private bool AcquireColorTable(PckFile pckFile) { - if (pckFile.TryGetFile("colours.col", PckFile.FileData.FileType.ColourTableFile, out var colFile) && + if (pckFile.TryGetFile("colours.col", PckFileType.ColourTableFile, out var colFile) && colFile.Size > 0) { using var ms = new MemoryStream(colFile.Data); @@ -148,7 +148,7 @@ namespace PckStudio.Forms.Editor selectTilePictureBox.UseBlendColor = applyColorMaskToolStripMenuItem.Checked; bool hasAnimation = - _pckFile.Files.TryGetValue($"res/textures/{_atlasType}/{_selectedTile.Tile.InternalName}.png", PckFile.FileData.FileType.TextureFile, out var animationFile); + _pckFile.Files.TryGetValue($"res/textures/{_atlasType}/{_selectedTile.Tile.InternalName}.png", PckFileType.TextureFile, out var animationFile); animationButton.Text = hasAnimation ? "Edit Animation" : "Create Animation"; replaceButton.Enabled = !hasAnimation; @@ -397,10 +397,10 @@ namespace PckStudio.Forms.Editor bool isNewFile; if (isNewFile = !_pckFile.Files.TryGetValue( $"res/textures/{_atlasType}/{_selectedTile.Tile.InternalName}.png", - PckFile.FileData.FileType.TextureFile, out var file + PckFileType.TextureFile, out var file )) { - file = new PckFile.FileData($"res/textures/{_atlasType}/{_selectedTile.Tile.InternalName}.png", PckFile.FileData.FileType.TextureFile); + file = new PckFileData($"res/textures/{_atlasType}/{_selectedTile.Tile.InternalName}.png", PckFileType.TextureFile); } var animation = AnimationHelper.GetAnimationFromFile(file); diff --git a/PCK-Studio/Forms/Skins-And-Textures/AddNewSkin.cs b/PCK-Studio/Forms/Skins-And-Textures/AddNewSkin.cs index ba43f2f8..3f34cb3d 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/AddNewSkin.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/AddNewSkin.cs @@ -17,13 +17,13 @@ namespace PckStudio.Popups { public partial class AddNewSkin : MetroFramework.Forms.MetroForm { - public PckFile.FileData SkinFile => skin; - public PckFile.FileData CapeFile => cape; + public PckFileData SkinFile => skin; + public PckFileData CapeFile => cape; public bool HasCape => cape is not null; private LOCFile currentLoc; - private PckFile.FileData skin = new PckFile.FileData("dlcskinXYXYXYXY", PckFile.FileData.FileType.SkinFile); - private PckFile.FileData cape; + private PckFileData skin = new PckFileData("dlcskinXYXYXYXY", PckFileType.SkinFile); + private PckFileData cape; private SkinANIM anim = new SkinANIM(); private Random rng = new Random(); @@ -224,7 +224,7 @@ namespace PckStudio.Popups return; } capePictureBox.Image = Image.FromFile(ofd.FileName); - cape ??= new PckFile.FileData("dlccapeXYXYXYXY", PckFile.FileData.FileType.CapeFile); + cape ??= new PckFileData("dlccapeXYXYXYXY", PckFileType.CapeFile); cape.SetData(File.ReadAllBytes(ofd.FileName)); contextMenuCape.Items[0].Text = "Replace"; capeLabel.Visible = false; diff --git a/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs b/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs index 9c9f3071..202a4500 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs @@ -46,10 +46,10 @@ namespace PckStudio.Popups private void applyBulkProperties(FileCollection files, int index) { - foreach (PckFile.FileData file in files) + foreach (PckFileData file in files) { - if (file.Filetype == PckFile.FileData.FileType.TexturePackInfoFile || - file.Filetype == PckFile.FileData.FileType.SkinDataFile) + if (file.Filetype == PckFileType.TexturePackInfoFile || + file.Filetype == PckFileType.SkinDataFile) { try { @@ -65,15 +65,15 @@ namespace PckStudio.Popups } } - if (index == -1 || (Enum.IsDefined(typeof(PckFile.FileData.FileType), index) && (int)file.Filetype == index)) + if (index == -1 || (Enum.IsDefined(typeof(PckFileType), index) && (int)file.Filetype == index)) { file.Properties.Add(propertyKeyTextBox.Text, propertyValueTextBox.Text); } } - if (Enum.IsDefined(typeof(PckFile.FileData.FileType), index)) + if (Enum.IsDefined(typeof(PckFileType), index)) { - MessageBox.Show($"Data added to {(PckFile.FileData.FileType)index} entries"); + MessageBox.Show($"Data added to {(PckFileType)index} entries"); return; } MessageBox.Show("Data added to all entries"); diff --git a/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs b/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs index aa9a0d93..64e7dadb 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs @@ -39,7 +39,7 @@ namespace PckStudio.Forms left, } - private PckFile.FileData _file; + private PckFileData _file; private SkinANIM _ANIM; private static Color _backgroundColor = Color.FromArgb(0xff, 0x50, 0x50, 0x50); @@ -126,7 +126,7 @@ namespace PckStudio.Forms } } - public generateModel(PckFile.FileData file) + public generateModel(PckFileData file) { MessageBox.Show(this, "This feature is now considered deprecated and will no longer recieve updates. A better alternative is currently under development. Use at your own risk.", "Deprecated Feature", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); InitializeComponent(); @@ -149,7 +149,7 @@ namespace PckStudio.Forms return sWhitespace.Replace(input, replacement); } - private void LoadData(PckFile.PCKProperties properties) + private void LoadData(PckFileProperties properties) { comboParent.Enabled = properties.GetProperties("BOX").All(kv => { var box = SkinBOX.FromString(kv.Value); diff --git a/PCK-Studio/Forms/Utilities/TextureConverterUtility.cs b/PCK-Studio/Forms/Utilities/TextureConverterUtility.cs index 336f0045..f71875cf 100644 --- a/PCK-Studio/Forms/Utilities/TextureConverterUtility.cs +++ b/PCK-Studio/Forms/Utilities/TextureConverterUtility.cs @@ -314,13 +314,13 @@ namespace PckStudio.Forms.Utilities switch (tn.Text) { case ("terrain.png"): - Terrain = Image.FromStream(new MemoryStream(((PckFile.FileData)(tn.Tag)).Data)); + Terrain = Image.FromStream(new MemoryStream(((PckFileData)(tn.Tag)).Data)); break; case ("items.png"): - Items = Image.FromStream(new MemoryStream(((PckFile.FileData)(tn.Tag)).Data)); + Items = Image.FromStream(new MemoryStream(((PckFileData)(tn.Tag)).Data)); break; case ("art"): - painting = Image.FromStream(new MemoryStream(((PckFile.FileData)(tn.Nodes[0].Tag)).Data)); + painting = Image.FromStream(new MemoryStream(((PckFileData)(tn.Nodes[0].Tag)).Data)); break; case ("mob"): EntityNode = tn; @@ -426,7 +426,7 @@ namespace PckStudio.Forms.Utilities string Outpath = "assets\\minecraft\\textures\\"; - foreach (PckFile.FileData mf in Pck.Files) + foreach (PckFileData mf in Pck.Files) { FileInfo file = new FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.Filename); file.Directory.Create(); // If the directory already exists, this method does nothing. @@ -451,7 +451,7 @@ namespace PckStudio.Forms.Utilities string Outpath = "assets\\minecraft\\textures\\"; - foreach (PckFile.FileData mf in Pck.Files) + foreach (PckFileData mf in Pck.Files) { FileInfo file = new FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.Filename); file.Directory.Create(); // If the directory already exists, this method does nothing. @@ -476,7 +476,7 @@ namespace PckStudio.Forms.Utilities string Outpath = "assets\\minecraft\\textures\\"; - foreach (PckFile.FileData mf in Pck.Files) + foreach (PckFileData mf in Pck.Files) { FileInfo file = new FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.Filename); file.Directory.Create(); // If the directory already exists, this method does nothing. diff --git a/PCK-Studio/Forms/Utilities/pckCenterOpen.cs b/PCK-Studio/Forms/Utilities/pckCenterOpen.cs index 0afe5b6e..a7cf3a09 100644 --- a/PCK-Studio/Forms/Utilities/pckCenterOpen.cs +++ b/PCK-Studio/Forms/Utilities/pckCenterOpen.cs @@ -137,11 +137,11 @@ namespace PckStudio.Forms //MessageBox.Show(root);//debug thingy to make sure filepath is correct //add all skins to a list - List skinsList = new List(); - List capesList = new List(); + List skinsList = new List(); + List capesList = new List(); var reader = new PckFileReader(); PckFile currentPCK = reader.FromFile(Program.AppData + "/PCK-Center/myPcks/" + mod + ".pck"); - foreach (PckFile.FileData skin in currentPCK.Files) + foreach (PckFileData skin in currentPCK.Files) { if (skin.Filename.Count() == 19) { @@ -175,7 +175,7 @@ namespace PckStudio.Forms writeSkins.WriteLine(" \"skins\": ["); int skinAmount = 0; - foreach (PckFile.FileData newSkin in skinsList) + foreach (PckFileData newSkin in skinsList) { skinAmount += 1; string skinName = "skinName"; @@ -232,7 +232,7 @@ namespace PckStudio.Forms { writeSkins.WriteLine("{"); int newSkinCount = 0; - foreach (PckFile.FileData newSkin in skinsList) + foreach (PckFileData newSkin in skinsList) { newSkinCount += 1; @@ -1020,7 +1020,7 @@ namespace PckStudio.Forms } //adds skin textures - foreach (PckFile.FileData skinTexture in skinsList) + foreach (PckFileData skinTexture in skinsList) { var ms = new MemoryStream(skinTexture.Data); Bitmap saveSkin = new Bitmap(Image.FromStream(ms)); @@ -1049,7 +1049,7 @@ namespace PckStudio.Forms } //adds cape textures - foreach (PckFile.FileData capeTexture in capesList) + foreach (PckFileData capeTexture in capesList) { File.WriteAllBytes(root + "/" + capeTexture.Filename, capeTexture.Data); } diff --git a/PCK-Studio/Helper/AnimationHelper.cs b/PCK-Studio/Helper/AnimationHelper.cs index 9f08dad3..a9714d15 100644 --- a/PCK-Studio/Helper/AnimationHelper.cs +++ b/PCK-Studio/Helper/AnimationHelper.cs @@ -15,7 +15,7 @@ namespace PckStudio.Helper { internal static class AnimationHelper { - internal static void SaveAnimationToFile(PckFile.FileData file, Animation animation) + internal static void SaveAnimationToFile(PckFileData file, Animation animation) { string anim = animation.BuildAnim(); file.Properties.SetProperty("ANIM", anim); @@ -23,7 +23,7 @@ namespace PckStudio.Helper file.SetData(texture, ImageFormat.Png); } - internal static Animation GetAnimationFromFile(PckFile.FileData file) + internal static Animation GetAnimationFromFile(PckFileData file) { _ = file ?? throw new ArgumentNullException(nameof(file)); if (file.Size > 0) diff --git a/PCK-Studio/Internal/PckNodeSorter.cs b/PCK-Studio/Internal/PckNodeSorter.cs index 55d419f1..03cfd111 100644 --- a/PCK-Studio/Internal/PckNodeSorter.cs +++ b/PCK-Studio/Internal/PckNodeSorter.cs @@ -15,8 +15,8 @@ namespace PckStudio.Internal private bool CheckForSkinAndCapeFiles(TreeNode node) { - return node.TryGetTagData(out PckFile.FileData file) && - (file.Filetype == PckFile.FileData.FileType.SkinFile || file.Filetype == PckFile.FileData.FileType.CapeFile); + return node.TryGetTagData(out PckFileData file) && + (file.Filetype == PckFileType.SkinFile || file.Filetype == PckFileType.CapeFile); } public int Compare(object x, object y) @@ -29,7 +29,7 @@ namespace PckStudio.Internal public int Compare(TreeNode x, TreeNode y) { int result = InternalCompare(x, y); - Debug.WriteLine(result); + //Debug.WriteLine(result); if (Descending && result != 0) { result = 2 % result + 1; @@ -39,9 +39,9 @@ namespace PckStudio.Internal private int InternalCompare(TreeNode first, TreeNode second) { - if (first.IsTagOfType() && !second.IsTagOfType()) + if (first.IsTagOfType() && !second.IsTagOfType()) return -1; - if (!first.IsTagOfType() && second.IsTagOfType()) + if (!first.IsTagOfType() && second.IsTagOfType()) return 1; if (CheckForSkinAndCapeFiles(first)) diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index d0b8826a..ff876c47 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -45,24 +45,24 @@ namespace PckStudio bool isSelectingTab = false; - readonly Dictionary> pckFileTypeHandler; + readonly Dictionary> pckFileTypeHandler; public MainForm() { InitializeComponent(); - skinToolStripMenuItem1.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.SkinFile); - capeToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.CapeFile); - textureToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.TextureFile); - languagesFileLOCToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.LocalisationFile); - gameRulesFileGRFToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.GameRulesFile); - audioPCKFileToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.AudioFile); - coloursCOLFileToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.ColourTableFile); - gameRulesHeaderGRHToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.GameRulesHeader); - skinsPCKToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.SkinDataFile); - modelsFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.ModelsFile); - behavioursFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.BehavioursFile); - entityMaterialsFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckFile.FileData.FileType.MaterialFile); + skinToolStripMenuItem1.Click += (sender, e) => SetFileType(PckFileType.SkinFile); + capeToolStripMenuItem.Click += (sender, e) => SetFileType(PckFileType.CapeFile); + textureToolStripMenuItem.Click += (sender, e) => SetFileType(PckFileType.TextureFile); + languagesFileLOCToolStripMenuItem.Click += (sender, e) => SetFileType(PckFileType.LocalisationFile); + gameRulesFileGRFToolStripMenuItem.Click += (sender, e) => SetFileType(PckFileType.GameRulesFile); + audioPCKFileToolStripMenuItem.Click += (sender, e) => SetFileType(PckFileType.AudioFile); + coloursCOLFileToolStripMenuItem.Click += (sender, e) => SetFileType(PckFileType.ColourTableFile); + gameRulesHeaderGRHToolStripMenuItem.Click += (sender, e) => SetFileType(PckFileType.GameRulesHeader); + skinsPCKToolStripMenuItem.Click += (sender, e) => SetFileType(PckFileType.SkinDataFile); + modelsFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckFileType.ModelsFile); + behavioursFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckFileType.BehavioursFile); + entityMaterialsFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckFileType.MaterialFile); treeViewMain.TreeViewNodeSorter = new PckNodeSorter(); @@ -73,23 +73,23 @@ namespace PckStudio labelVersion.Text = $"{Application.ProductName}: {Application.ProductVersion}"; ChangelogRichTextBox.Text = Resources.CHANGELOG; - pckFileTypeHandler = new Dictionary>(15) + pckFileTypeHandler = new Dictionary>(15) { - [PckFile.FileData.FileType.SkinFile] = HandleSkinFile, - [PckFile.FileData.FileType.CapeFile] = null, - [PckFile.FileData.FileType.TextureFile] = HandleTextureFile, - [PckFile.FileData.FileType.UIDataFile] = _ => throw new NotSupportedException("unused in-game"), - [PckFile.FileData.FileType.InfoFile] = null, - [PckFile.FileData.FileType.TexturePackInfoFile] = null, - [PckFile.FileData.FileType.LocalisationFile] = HandleLocalisationFile, - [PckFile.FileData.FileType.GameRulesFile] = HandleGameRuleFile, - [PckFile.FileData.FileType.AudioFile] = HandleAudioFile, - [PckFile.FileData.FileType.ColourTableFile] = HandleColourFile, - [PckFile.FileData.FileType.GameRulesHeader] = HandleGameRuleFile, - [PckFile.FileData.FileType.SkinDataFile] = null, - [PckFile.FileData.FileType.ModelsFile] = HandleModelsFile, - [PckFile.FileData.FileType.BehavioursFile] = HandleBehavioursFile, - [PckFile.FileData.FileType.MaterialFile] = HandleMaterialFile, + [PckFileType.SkinFile] = HandleSkinFile, + [PckFileType.CapeFile] = null, + [PckFileType.TextureFile] = HandleTextureFile, + [PckFileType.UIDataFile] = _ => throw new NotSupportedException("unused in-game"), + [PckFileType.InfoFile] = null, + [PckFileType.TexturePackInfoFile] = null, + [PckFileType.LocalisationFile] = HandleLocalisationFile, + [PckFileType.GameRulesFile] = HandleGameRuleFile, + [PckFileType.AudioFile] = HandleAudioFile, + [PckFileType.ColourTableFile] = HandleColourFile, + [PckFileType.GameRulesHeader] = HandleGameRuleFile, + [PckFileType.SkinDataFile] = null, + [PckFileType.ModelsFile] = HandleModelsFile, + [PckFileType.BehavioursFile] = HandleBehavioursFile, + [PckFileType.MaterialFile] = HandleMaterialFile, }; } @@ -195,7 +195,7 @@ namespace PckStudio private void CheckForPasswordAndRemove() { - if (currentPCK.TryGetFile("0", PckFile.FileData.FileType.InfoFile, out PckFile.FileData file)) + if (currentPCK.TryGetFile("0", PckFileType.InfoFile, out PckFileData file)) { file.Properties.RemoveAll(t => t.Key.Equals("LOCK")); } @@ -306,7 +306,7 @@ namespace PckStudio TreeNode node = BuildNodeTreeBySeperator(root, file.Filename, '/'); node.Tag = file; if (Settings.Default.LoadSubPcks && - (file.Filetype == PckFile.FileData.FileType.SkinDataFile || file.Filetype == PckFile.FileData.FileType.TexturePackInfoFile) && + (file.Filetype == PckFileType.SkinDataFile || file.Filetype == PckFileType.TexturePackInfoFile) && file.Size > 0) { using (var stream = new MemoryStream(file.Data)) @@ -340,7 +340,7 @@ namespace PckStudio treeViewMain.Nodes.Clear(); BuildPckTreeView(treeViewMain.Nodes, currentPCK); - if (isTemplateFile && currentPCK.HasFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile)) + if (isTemplateFile && currentPCK.HasFile("Skins.pck", PckFileType.SkinDataFile)) { TreeNode skinsNode = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); TreeNode folderNode = CreateNode("Skins"); @@ -359,9 +359,9 @@ namespace PckStudio } } - private void HandleTextureFile(PckFile.FileData file) + private void HandleTextureFile(PckFileData file) { - _ = file.IsMipmappedFile() && currentPCK.Files.TryGetValue(file.GetNormalPath(), PckFile.FileData.FileType.TextureFile, out file); + _ = file.IsMipmappedFile() && currentPCK.Files.TryGetValue(file.GetNormalPath(), PckFileType.TextureFile, out file); if (file.Size <= 0) { @@ -398,33 +398,33 @@ namespace PckStudio } } - private void HandleGameRuleFile(PckFile.FileData file) + private void HandleGameRuleFile(PckFileData file) { using GameRuleFileEditor grfEditor = new GameRuleFileEditor(file); wasModified = grfEditor.ShowDialog(this) == DialogResult.OK; UpdateRichPresence(); } - private void HandleAudioFile(PckFile.FileData file) + private void HandleAudioFile(PckFileData file) { using AudioEditor audioEditor = new AudioEditor(file, LittleEndianCheckBox.Checked); wasModified = audioEditor.ShowDialog(this) == DialogResult.OK; } - private void HandleLocalisationFile(PckFile.FileData file) + private void HandleLocalisationFile(PckFileData file) { using LOCEditor locedit = new LOCEditor(file); wasModified = locedit.ShowDialog(this) == DialogResult.OK; UpdateRichPresence(); } - private void HandleColourFile(PckFile.FileData file) + private void HandleColourFile(PckFileData file) { using COLEditor diag = new COLEditor(file); wasModified = diag.ShowDialog(this) == DialogResult.OK; } - public void HandleSkinFile(PckFile.FileData file) + public void HandleSkinFile(PckFileData file) { if (file.Properties.HasProperty("BOX")) { @@ -443,18 +443,18 @@ namespace PckStudio skinViewer.ShowDialog(this); } - public void HandleModelsFile(PckFile.FileData file) + public void HandleModelsFile(PckFileData file) { MessageBox.Show("Models.bin support has not been implemented. You can use the Spark Editor for the time being to edit these files.", "Not implemented yet."); } - public void HandleBehavioursFile(PckFile.FileData file) + public void HandleBehavioursFile(PckFileData file) { using BehaviourEditor edit = new BehaviourEditor(file); wasModified = edit.ShowDialog(this) == DialogResult.OK; } - public void HandleMaterialFile(PckFile.FileData file) + public void HandleMaterialFile(PckFileData file) { using MaterialsEditor edit = new MaterialsEditor(file); wasModified = edit.ShowDialog(this) == DialogResult.OK; @@ -467,7 +467,7 @@ namespace PckStudio buttonEdit.Visible = false; previewPictureBox.Image = Resources.NoImageFound; viewFileInfoToolStripMenuItem.Visible = false; - if (e.Node.TryGetTagData(out PckFile.FileData file)) + if (e.Node.TryGetTagData(out PckFileData file)) { viewFileInfoToolStripMenuItem.Visible = true; if (file.Properties.HasProperty("BOX")) @@ -484,9 +484,9 @@ namespace PckStudio switch (file.Filetype) { - case PckFile.FileData.FileType.SkinFile: - case PckFile.FileData.FileType.CapeFile: - case PckFile.FileData.FileType.TextureFile: + case PckFileType.SkinFile: + case PckFileType.CapeFile: + case PckFileType.TextureFile: { // TODO: Add tga support if (Path.GetExtension(file.Filename) == ".tga") break; @@ -514,7 +514,7 @@ namespace PckStudio if ((file.Filename.StartsWith("res/textures/blocks/") || file.Filename.StartsWith("res/textures/items/")) && - file.Filetype == PckFile.FileData.FileType.TextureFile + file.Filetype == PckFileType.TextureFile && !file.IsMipmappedFile()) { buttonEdit.Text = "EDIT TILE ANIMATION"; @@ -523,22 +523,22 @@ namespace PckStudio } break; - case PckFile.FileData.FileType.LocalisationFile: + case PckFileType.LocalisationFile: buttonEdit.Text = "EDIT LOC"; buttonEdit.Visible = true; break; - case PckFile.FileData.FileType.AudioFile: + case PckFileType.AudioFile: buttonEdit.Text = "EDIT MUSIC CUES"; buttonEdit.Visible = true; break; - case PckFile.FileData.FileType.ColourTableFile when file.Filename == "colours.col": + case PckFileType.ColourTableFile when file.Filename == "colours.col": buttonEdit.Text = "EDIT COLORS"; buttonEdit.Visible = true; break; - case PckFile.FileData.FileType.BehavioursFile when file.Filename == "behaviours.bin": + case PckFileType.BehavioursFile when file.Filename == "behaviours.bin": buttonEdit.Text = "EDIT BEHAVIOURS"; buttonEdit.Visible = true; break; @@ -554,7 +554,7 @@ namespace PckStudio var node = treeViewMain.SelectedNode; if (node == null) return; - if (node.TryGetTagData(out PckFile.FileData file)) + if (node.TryGetTagData(out PckFileData file)) { using SaveFileDialog exFile = new SaveFileDialog(); exFile.FileName = Path.GetFileName(file.Filename); @@ -586,7 +586,7 @@ namespace PckStudio { GetAllChildNodes(node.Nodes).ForEach(fileNode => { - if (fileNode.TryGetTagData(out PckFile.FileData file)) + if (fileNode.TryGetTagData(out PckFileData file)) { Directory.CreateDirectory($"{extractPath}/{Path.GetDirectoryName(file.Filename)}"); File.WriteAllBytes($"{extractPath}/{file.Filename}", file.Data); @@ -643,7 +643,7 @@ namespace PckStudio private void replaceToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.Tag is PckFile.FileData file) + if (treeViewMain.SelectedNode.Tag is PckFileData file) { using var ofd = new OpenFileDialog(); // Suddenly, and randomly, this started throwing an exception because it wasn't formatted correctly? So now it's formatted correctly and now displays the file type name in the dialog. @@ -652,7 +652,7 @@ namespace PckStudio switch (file.Filetype) { - case PckFile.FileData.FileType.TextureFile: + case PckFileType.TextureFile: if (Path.GetExtension(file.Filename) == ".png") extra_extensions = ";*.tga"; else if (Path.GetExtension(file.Filename) == ".tga") extra_extensions = ";*.png"; break; @@ -680,12 +680,12 @@ namespace PckStudio /// /// File to remove /// True if the remove should be canceled, otherwise False - private bool BeforeFileRemove(PckFile.FileData file) + private bool BeforeFileRemove(PckFileData file) { string itemPath = "res/textures/items/"; // warn the user about deleting compass.png and clock.png - if (file.Filetype == PckFile.FileData.FileType.TextureFile && + if (file.Filetype == PckFileType.TextureFile && (file.Filename == itemPath + "compass.png" || file.Filename == itemPath + "clock.png")) { if (MessageBox.Show("Are you sure want to delete this file? If \"compass.png\" or \"clock.png\" are missing, your game will crash upon loading this pack.", "Warning", @@ -694,7 +694,7 @@ namespace PckStudio } // remove loc key if its a skin/cape - if (file.Filetype == PckFile.FileData.FileType.SkinFile || file.Filetype == PckFile.FileData.FileType.CapeFile) + if (file.Filetype == PckFileType.SkinFile || file.Filetype == PckFileType.CapeFile) { if (TryGetLocFile(out LOCFile locFile)) { @@ -714,7 +714,7 @@ namespace PckStudio string path = node.FullPath; - if (node.TryGetTagData(out PckFile.FileData file)) + if (node.TryGetTagData(out PckFileData file)) { if (!BeforeFileRemove(file) && currentPCK.Files.Remove(file)) { @@ -743,7 +743,7 @@ namespace PckStudio if (diag.ShowDialog(this) == DialogResult.OK) { - if (node.Tag is PckFile.FileData file) + if (node.Tag is PckFileData file) { file.Filename = diag.NewText; } @@ -752,7 +752,7 @@ namespace PckStudio node.Text = diag.NewText; foreach (var childNode in GetAllChildNodes(node.Nodes)) { - if (childNode.Tag is PckFile.FileData folderFile) + if (childNode.Tag is PckFileData folderFile) { folderFile.Filename = childNode.FullPath; } @@ -775,14 +775,14 @@ namespace PckStudio if (add.ShowDialog() == DialogResult.OK) { - if (currentPCK.HasFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile)) // Prioritize Skins.pck + if (currentPCK.HasFile("Skins.pck", PckFileType.SkinDataFile)) // Prioritize Skins.pck { TreeNode subPCK = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); if (subPCK.Nodes.ContainsKey("Skins")) add.SkinFile.Filename = add.SkinFile.Filename.Insert(0, "Skins/"); add.SkinFile.Filename = add.SkinFile.Filename.Insert(0, "Skins.pck/"); TreeNode newNode = new TreeNode(Path.GetFileName(add.SkinFile.Filename)); newNode.Tag = add.SkinFile; - SetNodeIcon(newNode, PckFile.FileData.FileType.SkinFile); + SetNodeIcon(newNode, PckFileType.SkinFile); subPCK.Nodes.Add(newNode); RebuildSubPCK(newNode.FullPath); } @@ -793,14 +793,14 @@ namespace PckStudio } if (add.HasCape) { - if (currentPCK.HasFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile)) // Prioritize Skins.pck + if (currentPCK.HasFile("Skins.pck", PckFileType.SkinDataFile)) // Prioritize Skins.pck { TreeNode subPCK = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); if (subPCK.Nodes.ContainsKey("Skins")) add.CapeFile.Filename = add.CapeFile.Filename.Insert(0, "Skins/"); add.CapeFile.Filename = add.CapeFile.Filename.Insert(0, "Skins.pck/"); TreeNode newNode = new TreeNode(Path.GetFileName(add.CapeFile.Filename)); newNode.Tag = add.CapeFile; - SetNodeIcon(newNode, PckFile.FileData.FileType.SkinFile); + SetNodeIcon(newNode, PckFileType.SkinFile); subPCK.Nodes.Add(newNode); RebuildSubPCK(newNode.FullPath); } @@ -817,20 +817,20 @@ namespace PckStudio } } - private static PckFile.FileData CreateNewAudioFile(bool isLittle) + private static PckFileData CreateNewAudioFile(bool isLittle) { PckAudioFile audioPck = new PckAudioFile(); audioPck.AddCategory(PckAudioFile.AudioCategory.EAudioType.Overworld); audioPck.AddCategory(PckAudioFile.AudioCategory.EAudioType.Nether); audioPck.AddCategory(PckAudioFile.AudioCategory.EAudioType.End); - PckFile.FileData pckFileData = new PckFile.FileData("audio.pck", PckFile.FileData.FileType.AudioFile); + PckFileData pckFileData = new PckFileData("audio.pck", PckFileType.AudioFile); pckFileData .SetData(new PckAudioFileWriter(audioPck, isLittle ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); return pckFileData; } private void audiopckToolStripMenuItem_Click(object sender, EventArgs e) { - if (currentPCK.Files.Contains("audio.pck", PckFile.FileData.FileType.AudioFile)) + if (currentPCK.Files.Contains("audio.pck", PckFileType.AudioFile)) { // the chance of this happening is really really slim but just in case MessageBox.Show("There is already a file in this PCK named \"audio.pck\"!", "Can't create audio.pck"); @@ -858,9 +858,9 @@ namespace PckStudio if (diag.ShowDialog(this) != DialogResult.OK) return; - var file = new PckFile.FileData( + var file = new PckFileData( $"res/textures/{Animation.GetCategoryName(diag.Category)}/{diag.SelectedTile}.png", - PckFile.FileData.FileType.TextureFile); + PckFileType.TextureFile); var animation = AnimationHelper.GetAnimationFromFile(file); @@ -912,9 +912,9 @@ namespace PckStudio foreach (var node in s) { TreeNode parent = treeViewMain.Nodes.Find(node, true)[0]; - if (parent.TryGetTagData(out PckFile.FileData f) && - (f.Filetype is PckFile.FileData.FileType.TexturePackInfoFile || - f.Filetype is PckFile.FileData.FileType.SkinDataFile)) + if (parent.TryGetTagData(out PckFileData f) && + (f.Filetype is PckFileType.TexturePackInfoFile || + f.Filetype is PckFileType.SkinDataFile)) return parent; } @@ -931,17 +931,17 @@ namespace PckStudio Debug.WriteLine(parent.Name); if (parent == null) return; - PckFile.FileData parent_file = parent.Tag as PckFile.FileData; - if (parent_file.Filetype is PckFile.FileData.FileType.TexturePackInfoFile || parent_file.Filetype is PckFile.FileData.FileType.SkinDataFile) + PckFileData parent_file = parent.Tag as PckFileData; + if (parent_file.Filetype is PckFileType.TexturePackInfoFile || parent_file.Filetype is PckFileType.SkinDataFile) { Debug.WriteLine("Rebuilding " + parent_file.Filename); - PckFile newPCKFile = new PckFile(3, parent_file.Filetype is PckFile.FileData.FileType.SkinDataFile); + PckFile newPCKFile = new PckFile(3, parent_file.Filetype is PckFileType.SkinDataFile); foreach (TreeNode node in GetAllChildNodes(parent.Nodes)) { - if (node.Tag is PckFile.FileData node_file) + if (node.Tag is PckFileData node_file) { - PckFile.FileData new_file = newPCKFile.CreateNewFile(node_file.Filename.Replace(parent_file.Filename + "/", String.Empty), node_file.Filetype); + 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); new_file.SetData(node_file.Data); } @@ -956,7 +956,7 @@ namespace PckStudio private void treeViewMain_DoubleClick(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckFile.FileData file)) + if (treeViewMain.SelectedNode.TryGetTagData(out PckFileData file)) { if (file.Size <= 0) { @@ -979,14 +979,14 @@ namespace PckStudio private void treeMeta_DoubleClick(object sender, EventArgs e) { if (treeMeta.SelectedNode is TreeNode subnode && subnode.Tag is KeyValuePair property && - treeViewMain.SelectedNode is TreeNode node && node.Tag is PckFile.FileData file) + treeViewMain.SelectedNode is TreeNode node && node.Tag is PckFileData file) { int i = file.Properties.IndexOf(property); if (i != -1) { switch (property.Key) { - case "ANIM" when file.Filetype == PckFile.FileData.FileType.SkinFile: + case "ANIM" when file.Filetype == PckFileType.SkinFile: try { using ANIMEditor diag = new ANIMEditor(property.Value); @@ -1007,7 +1007,7 @@ namespace PckStudio } break; - case "BOX" when file.Filetype == PckFile.FileData.FileType.SkinFile: + case "BOX" when file.Filetype == PckFileType.SkinFile: try { using BoxEditor diag = new BoxEditor(property.Value, IsSubPCKNode(treeViewMain.SelectedNode.FullPath)); @@ -1059,11 +1059,11 @@ namespace PckStudio if (diag.ShowDialog(this) == DialogResult.OK) { - if (node.Tag is PckFile.FileData file) + if (node.Tag is PckFileData file) { TreeNode newNode = new TreeNode(); newNode.Text = Path.GetFileName(diag.NewText); - var newFile = new PckFile.FileData(diag.NewText, file.Filetype); + var newFile = new PckFileData(diag.NewText, file.Filetype); file.Properties.ForEach(newFile.Properties.Add); newFile.SetData(file.Data); newFile.Filename = diag.NewText; @@ -1095,7 +1095,7 @@ namespace PckStudio private void deleteEntryToolStripMenuItem_Click(object sender, EventArgs e) { if (treeMeta.SelectedNode is TreeNode t && t.Tag is KeyValuePair property && - treeViewMain.SelectedNode is TreeNode main && main.Tag is PckFile.FileData file && + treeViewMain.SelectedNode is TreeNode main && main.Tag is PckFileData file && file.Properties.Remove(property)) { treeMeta.SelectedNode.Remove(); @@ -1108,7 +1108,7 @@ namespace PckStudio { treeMeta.Nodes.Clear(); if (treeViewMain.SelectedNode is TreeNode node && - node.Tag is PckFile.FileData file) + node.Tag is PckFileData file) { foreach (var property in file.Properties) { @@ -1120,7 +1120,7 @@ namespace PckStudio private void addEntryToolStripMenuItem_Click_1(object sender, EventArgs e) { if (treeViewMain.SelectedNode is TreeNode t && - t.Tag is PckFile.FileData file) + t.Tag is PckFileData file) { using AddPropertyPrompt addProperty = new AddPropertyPrompt(); if (addProperty.ShowDialog() == DialogResult.OK) @@ -1168,15 +1168,15 @@ namespace PckStudio { var pack = new PckFile(3); - var zeroFile = pack.CreateNewFile("0", PckFile.FileData.FileType.InfoFile); + var zeroFile = pack.CreateNewFile("0", PckFileType.InfoFile); zeroFile.Properties.Add("PACKID", packId.ToString()); zeroFile.Properties.Add("PACKVERSION", packVersion.ToString()); var locFile = new LOCFile(); locFile.InitializeDefault(packName); - pack.CreateNewFile("localisation.loc", PckFile.FileData.FileType.LocalisationFile, new LOCFileWriter(locFile, 2)); + pack.CreateNewFile("localisation.loc", PckFileType.LocalisationFile, new LOCFileWriter(locFile, 2)); - pack.CreateNewFileIf(createSkinsPCK, "Skins.pck", PckFile.FileData.FileType.SkinDataFile, new PckFileWriter(new PckFile(3, true), + pack.CreateNewFileIf(createSkinsPCK, "Skins.pck", PckFileType.SkinDataFile, new PckFileWriter(new PckFile(3, true), LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); @@ -1190,13 +1190,13 @@ namespace PckStudio PckFile infoPCK = new PckFile(3); - var icon = infoPCK.CreateNewFile("icon.png", PckFile.FileData.FileType.TextureFile); + var icon = infoPCK.CreateNewFile("icon.png", PckFileType.TextureFile); icon.SetData(Resources.TexturePackIcon, ImageFormat.Png); - var comparison = infoPCK.CreateNewFile("comparison.png", PckFile.FileData.FileType.TextureFile); + var comparison = infoPCK.CreateNewFile("comparison.png", PckFileType.TextureFile); comparison.SetData(Resources.Comparison, ImageFormat.Png); - var texturepackInfo = pack.CreateNewFile($"{res}/{res}Info.pck", PckFile.FileData.FileType.TexturePackInfoFile); + var texturepackInfo = pack.CreateNewFile($"{res}/{res}Info.pck", PckFileType.TexturePackInfoFile); texturepackInfo.Properties.Add("PACKID", "0"); texturepackInfo.Properties.Add("DATAPATH", $"{res}Data.pck"); @@ -1209,7 +1209,7 @@ namespace PckStudio private PckFile InitializeMashUpPack(int packId, int packVersion, string packName, string res) { var pack = InitializeTexturePack(packId, packVersion, packName, res, true); - var gameRuleFile = pack.CreateNewFile("GameRules.grf", PckFile.FileData.FileType.GameRulesFile); + var gameRuleFile = pack.CreateNewFile("GameRules.grf", PckFileType.GameRulesFile); var grfFile = new GameRuleFile(); grfFile.AddRule("MapOptions", new KeyValuePair("seed", "0"), @@ -1299,12 +1299,12 @@ namespace PckStudio switch (e.KeyCode) { case Keys.Delete: - deleteFileToolStripMenuItem_Click(sender, e); + deleteFileToolStripMenuItem_Click(sender, e); break; case Keys.F2: renameFileToolStripMenuItem_Click(sender, e); break; - } + } } private void treeViewMain_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) @@ -1345,7 +1345,7 @@ namespace PckStudio MessageBoxButtons.OK, MessageBoxIcon.Error); } } - foreach (PckFile.FileData file in pckfile.Files) + foreach (PckFileData file in pckfile.Files) { string filepath = $"{sfd.SelectedPath}/{file.Filename}"; FileInfo fileinfo = new FileInfo(filepath); @@ -1409,19 +1409,19 @@ namespace PckStudio return; } // creates variable to indicate wether current pck skin structure is mashup or regular skin - bool hasSkinsPck = currentPCK.HasFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile); + bool hasSkinsPck = currentPCK.HasFile("Skins.pck", PckFileType.SkinDataFile); foreach (var fullfilename in Directory.GetFiles(contents.SelectedPath, "*.png")) { string filename = Path.GetFileNameWithoutExtension(fullfilename); // sets file type based on wether its a cape or skin - PckFile.FileData.FileType pckfiletype = filename.StartsWith("dlccape", StringComparison.OrdinalIgnoreCase) - ? PckFile.FileData.FileType.CapeFile - : PckFile.FileData.FileType.SkinFile; + PckFileType pckfiletype = filename.StartsWith("dlccape", StringComparison.OrdinalIgnoreCase) + ? PckFileType.CapeFile + : PckFileType.SkinFile; string pckfilepath = (hasSkinsPck ? "Skins/" : string.Empty) + filename + ".png"; - PckFile.FileData newFile = new PckFile.FileData(pckfilepath, pckfiletype); + PckFileData newFile = new PckFileData(pckfilepath, pckfiletype); byte[] filedata = File.ReadAllBytes(fullfilename); newFile.SetData(filedata); @@ -1455,7 +1455,7 @@ namespace PckStudio } if (hasSkinsPck) { - var skinsfile = currentPCK.GetFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile); + var skinsfile = currentPCK.GetFile("Skins.pck", PckFileType.SkinDataFile); using (var ms = new MemoryStream(skinsfile.Data)) { var reader = new PckFileReader(LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); @@ -1478,8 +1478,8 @@ namespace PckStudio private bool TryGetLocFile(out LOCFile locFile) { - if (!currentPCK.TryGetFile("localisation.loc", PckFile.FileData.FileType.LocalisationFile, out PckFile.FileData locdata) && - !currentPCK.TryGetFile("languages.loc", PckFile.FileData.FileType.LocalisationFile, out locdata)) + if (!currentPCK.TryGetFile("localisation.loc", PckFileType.LocalisationFile, out PckFileData locdata) && + !currentPCK.TryGetFile("languages.loc", PckFileType.LocalisationFile, out locdata)) { locFile = null; return false; @@ -1504,8 +1504,8 @@ namespace PckStudio private bool TrySetLocFile(in LOCFile locFile) { - if (!currentPCK.TryGetFile("localisation.loc", PckFile.FileData.FileType.LocalisationFile, out PckFile.FileData locdata) && - !currentPCK.TryGetFile("languages.loc", PckFile.FileData.FileType.LocalisationFile, out locdata)) + if (!currentPCK.TryGetFile("localisation.loc", PckFileType.LocalisationFile, out PckFileData locdata) && + !currentPCK.TryGetFile("languages.loc", PckFileType.LocalisationFile, out locdata)) { return false; } @@ -1535,7 +1535,7 @@ namespace PckStudio { string skinNameImport = Path.GetFileName(contents.FileName); byte[] data = File.ReadAllBytes(contents.FileName); - PckFile.FileData mfNew = currentPCK.CreateNewFile(skinNameImport, PckFile.FileData.FileType.SkinFile); + PckFileData mfNew = currentPCK.CreateNewFile(skinNameImport, PckFileType.SkinFile); mfNew.SetData(data); string propertyFile = Path.GetFileNameWithoutExtension(contents.FileName) + ".txt"; if (File.Exists(propertyFile)) @@ -1593,9 +1593,9 @@ namespace PckStudio TreeNodeCollection nodeCollection = treeViewMain.Nodes; if (treeViewMain.SelectedNode is TreeNode node) { - if (node.Tag is PckFile.FileData fd && - (fd.Filetype != PckFile.FileData.FileType.TexturePackInfoFile && - fd.Filetype != PckFile.FileData.FileType.SkinDataFile)) + if (node.Tag is PckFileData fd && + (fd.Filetype != PckFileType.TexturePackInfoFile && + fd.Filetype != PckFileType.SkinDataFile)) { if (node.Parent is TreeNode parentNode) { @@ -1749,63 +1749,63 @@ namespace PckStudio SaveTemplate(); } - private void SetNodeIcon(TreeNode node, PckFile.FileData.FileType type) + private void SetNodeIcon(TreeNode node, PckFileType type) { switch (type) { - case PckFile.FileData.FileType.AudioFile: + case PckFileType.AudioFile: node.ImageIndex = 1; node.SelectedImageIndex = 1; break; - case PckFile.FileData.FileType.LocalisationFile: + case PckFileType.LocalisationFile: node.ImageIndex = 3; node.SelectedImageIndex = 3; break; - case PckFile.FileData.FileType.TexturePackInfoFile: + case PckFileType.TexturePackInfoFile: node.ImageIndex = 4; node.SelectedImageIndex = 4; break; - case PckFile.FileData.FileType.ColourTableFile: + case PckFileType.ColourTableFile: node.ImageIndex = 6; node.SelectedImageIndex = 6; break; - case PckFile.FileData.FileType.ModelsFile: + case PckFileType.ModelsFile: node.ImageIndex = 8; node.SelectedImageIndex = 8; break; - case PckFile.FileData.FileType.SkinDataFile: + case PckFileType.SkinDataFile: node.ImageIndex = 7; node.SelectedImageIndex = 7; break; - case PckFile.FileData.FileType.GameRulesFile: + case PckFileType.GameRulesFile: node.ImageIndex = 9; node.SelectedImageIndex = 9; break; - case PckFile.FileData.FileType.GameRulesHeader: + case PckFileType.GameRulesHeader: node.ImageIndex = 10; node.SelectedImageIndex = 10; break; - case PckFile.FileData.FileType.InfoFile: + case PckFileType.InfoFile: node.ImageIndex = 11; node.SelectedImageIndex = 11; break; - case PckFile.FileData.FileType.SkinFile: + case PckFileType.SkinFile: node.ImageIndex = 12; node.SelectedImageIndex = 12; break; - case PckFile.FileData.FileType.CapeFile: + case PckFileType.CapeFile: node.ImageIndex = 13; node.SelectedImageIndex = 13; break; - case PckFile.FileData.FileType.TextureFile: + case PckFileType.TextureFile: node.ImageIndex = 14; node.SelectedImageIndex = 14; break; - case PckFile.FileData.FileType.BehavioursFile: + case PckFileType.BehavioursFile: node.ImageIndex = 15; node.SelectedImageIndex = 15; break; - case PckFile.FileData.FileType.MaterialFile: + case PckFileType.MaterialFile: node.ImageIndex = 16; node.SelectedImageIndex = 16; break; @@ -1816,9 +1816,9 @@ namespace PckStudio } } - private void SetFileType(PckFile.FileData.FileType type) + private void SetFileType(PckFileType type) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckFile.FileData file)) + if (treeViewMain.SelectedNode.TryGetTagData(out PckFileData file)) { Debug.WriteLine($"Setting {file.Filetype} to {type}"); file.Filetype = type; @@ -1837,7 +1837,7 @@ namespace PckStudio renamePrompt.LabelText = "Path"; if (renamePrompt.ShowDialog() == DialogResult.OK && !string.IsNullOrEmpty(renamePrompt.NewText)) { - var file = currentPCK.CreateNewFile(renamePrompt.NewText, PckFile.FileData.FileType.TextureFile); + var file = currentPCK.CreateNewFile(renamePrompt.NewText, PckFileType.TextureFile); file.SetData(File.ReadAllBytes(fileDialog.FileName)); BuildMainTreeView(); wasModified = true; @@ -1847,7 +1847,7 @@ namespace PckStudio private void viewFileInfoToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.Tag is PckFile.FileData file) + if (treeViewMain.SelectedNode.Tag is PckFileData file) { MessageBox.Show( "File path: " + file.Filename + @@ -1860,7 +1860,7 @@ namespace PckStudio private void generateMipMapTextureToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.Tag is PckFile.FileData file && file.Filetype == PckFile.FileData.FileType.TextureFile) + if (treeViewMain.SelectedNode.Tag is PckFileData file && file.Filetype == PckFileType.TextureFile) { string textureDirectory = Path.GetDirectoryName(file.Filename); string textureName = Path.GetFileNameWithoutExtension(file.Filename); @@ -1886,9 +1886,9 @@ namespace PckStudio { string mippedPath = $"{textureDirectory}/{textureName}MipMapLevel{i}{textureExtension}"; Debug.WriteLine(mippedPath); - if (currentPCK.HasFile(mippedPath, PckFile.FileData.FileType.TextureFile)) - currentPCK.Files.Remove(currentPCK.GetFile(mippedPath, PckFile.FileData.FileType.TextureFile)); - PckFile.FileData MipMappedFile = new PckFile.FileData(mippedPath, PckFile.FileData.FileType.TextureFile); + if (currentPCK.HasFile(mippedPath, PckFileType.TextureFile)) + currentPCK.Files.Remove(currentPCK.GetFile(mippedPath, PckFileType.TextureFile)); + PckFileData MipMappedFile = new PckFileData(mippedPath, PckFileType.TextureFile); Image originalTexture = Image.FromStream(new MemoryStream(file.Data)); @@ -1916,12 +1916,12 @@ namespace PckStudio private void colourscolToolStripMenuItem_Click(object sender, EventArgs e) { - if (currentPCK.TryGetFile("colours.col", PckFile.FileData.FileType.ColourTableFile, out _)) + if (currentPCK.TryGetFile("colours.col", PckFileType.ColourTableFile, out _)) { MessageBox.Show("A color table file already exists in this PCK and a new one cannot be created.", "Operation aborted"); return; } - var newColorFile = currentPCK.CreateNewFile("colours.col", PckFile.FileData.FileType.ColourTableFile); + var newColorFile = currentPCK.CreateNewFile("colours.col", PckFileType.ColourTableFile); newColorFile.SetData(Resources.tu69colours); BuildMainTreeView(); } @@ -1933,8 +1933,8 @@ namespace PckStudio private void as3DSTextureFileToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckFile.FileData file) && - file.Filetype == PckFile.FileData.FileType.SkinFile) + if (treeViewMain.SelectedNode.TryGetTagData(out PckFileData file) && + file.Filetype == PckFileType.SkinFile) { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "3DS Texture|*.3dst"; @@ -1953,7 +1953,7 @@ namespace PckStudio private void addMultipleEntriesToolStripMenuItem1_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckFile.FileData file)) + if (treeViewMain.SelectedNode.TryGetTagData(out PckFileData file)) { using (var input = new MultiTextPrompt()) { @@ -1976,8 +1976,8 @@ namespace PckStudio private void correctSkinDecimalsToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckFile.FileData file) && - file.Filetype == PckFile.FileData.FileType.SkinFile) + 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")) { @@ -2009,7 +2009,7 @@ namespace PckStudio switch (prompt) { case DialogResult.Yes: - if (!currentPCK.TryGetFile("0", PckFile.FileData.FileType.InfoFile, out PckFile.FileData file) || + if (!currentPCK.TryGetFile("0", PckFileType.InfoFile, out PckFileData file) || string.IsNullOrEmpty(file.Properties.GetPropertyValue("PACKID"))) { MessageBox.Show(this, @@ -2076,13 +2076,13 @@ namespace PckStudio private void CreateSkinsPCKToolStripMenuItem1_Click(object sender, EventArgs e) { - if (currentPCK.TryGetFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile, out _)) + if (currentPCK.TryGetFile("Skins.pck", PckFileType.SkinDataFile, out _)) { MessageBox.Show("A Skins.pck file already exists in this PCK and a new one cannot be created.", "Operation aborted"); return; } - currentPCK.CreateNewFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile, new PckFileWriter(new PckFile(3, true), + currentPCK.CreateNewFile("Skins.pck", PckFileType.SkinDataFile, new PckFileWriter(new PckFile(3, true), LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); BuildMainTreeView(); @@ -2096,7 +2096,7 @@ namespace PckStudio private void editAllEntriesToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckFile.FileData file)) + if (treeViewMain.SelectedNode.TryGetTagData(out PckFileData file)) { var props = file.Properties.Select(p => p.Key + " " + p.Value); using (var input = new MultiTextPrompt(props.ToArray())) @@ -2131,7 +2131,7 @@ namespace PckStudio using AddFilePrompt diag = new AddFilePrompt("res/" + Path.GetFileName(ofd.FileName)); if (diag.ShowDialog(this) == DialogResult.OK) { - PckFile.FileData file = currentPCK.CreateNewFile( + PckFileData file = currentPCK.CreateNewFile( diag.Filepath, diag.Filetype, () => File.ReadAllBytes(ofd.FileName)); @@ -2148,24 +2148,24 @@ namespace PckStudio private void behavioursbinToolStripMenuItem_Click(object sender, EventArgs e) { - if (currentPCK.TryGetFile("behaviours.bin", PckFile.FileData.FileType.BehavioursFile, out _)) + if (currentPCK.TryGetFile("behaviours.bin", PckFileType.BehavioursFile, out _)) { MessageBox.Show("A behaviours file already exists in this PCK and a new one cannot be created.", "Operation aborted"); return; } - currentPCK.CreateNewFile("behaviours.bin", PckFile.FileData.FileType.BehavioursFile, BehaviourResources.BehaviourFileInitializer); + currentPCK.CreateNewFile("behaviours.bin", PckFileType.BehavioursFile, BehaviourResources.BehaviourFileInitializer); BuildMainTreeView(); } private void entityMaterialsbinToolStripMenuItem_Click(object sender, EventArgs e) { - if (currentPCK.TryGetFile("entityMaterials.bin", PckFile.FileData.FileType.MaterialFile, out _)) + if (currentPCK.TryGetFile("entityMaterials.bin", PckFileType.MaterialFile, out _)) { MessageBox.Show("A behaviours file already exists in this PCK and a new one cannot be created.", "Operation aborted"); return; } - currentPCK.CreateNewFile("entityMaterials.bin", PckFile.FileData.FileType.MaterialFile, MaterialResources.MaterialsFileInitializer); + currentPCK.CreateNewFile("entityMaterials.bin", PckFileType.MaterialFile, MaterialResources.MaterialsFileInitializer); BuildMainTreeView(); } @@ -2232,7 +2232,7 @@ namespace PckStudio private void addBOXEntryToolStripMenuItem1_Click(object sender, EventArgs e) { - if(treeViewMain.SelectedNode is TreeNode t && t.Tag is PckFile.FileData file) + if(treeViewMain.SelectedNode is TreeNode t && t.Tag is PckFileData file) { using BoxEditor diag = new BoxEditor(SkinBOX.Empty, IsSubPCKNode(treeViewMain.SelectedNode.FullPath)); if (diag.ShowDialog(this) == DialogResult.OK) @@ -2248,7 +2248,7 @@ namespace PckStudio private void addANIMEntryToolStripMenuItem1_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckFile.FileData file)) + if (treeViewMain.SelectedNode.TryGetTagData(out PckFileData file)) { using ANIMEditor diag = new ANIMEditor(SkinANIM.Empty); if (diag.ShowDialog(this) == DialogResult.OK) diff --git a/Vendor/OMI-Lib b/Vendor/OMI-Lib index dae99efe..c4ea1bdd 160000 --- a/Vendor/OMI-Lib +++ b/Vendor/OMI-Lib @@ -1 +1 @@ -Subproject commit dae99efef9dc9fd2c98b82abb5ceca0a7aa4dd70 +Subproject commit c4ea1bdd85d97a1b6d629feb61a8086272f90ff5 From 4f0f0cf66f383ee40ce5b7b288aff2f9930dffae Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 28 Aug 2023 21:38:40 +0200 Subject: [PATCH 24/36] Configured Trace log file via app.config file --- PCK-Studio/App.config | 6 +++++- PCK-Studio/Internal/ApplicationScope.cs | 1 - PCK-Studio/Internal/Profiler.cs | 13 +++---------- PCK-Studio/Program.cs | 3 +-- 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/PCK-Studio/App.config b/PCK-Studio/App.config index db7ee6ab..fff538b6 100644 --- a/PCK-Studio/App.config +++ b/PCK-Studio/App.config @@ -12,7 +12,11 @@ - + + + + + diff --git a/PCK-Studio/Internal/ApplicationScope.cs b/PCK-Studio/Internal/ApplicationScope.cs index 171abb74..361ad2e4 100644 --- a/PCK-Studio/Internal/ApplicationScope.cs +++ b/PCK-Studio/Internal/ApplicationScope.cs @@ -19,7 +19,6 @@ namespace PckStudio.Internal internal static void Initialize() { - Profiler.Configure(Debug.Listeners[0]); Profiler.Start(); { _entityImages ??= Resources.entities_sheet.SplitHorizontal(32).ToArray(); diff --git a/PCK-Studio/Internal/Profiler.cs b/PCK-Studio/Internal/Profiler.cs index 1c503d26..f9daff27 100644 --- a/PCK-Studio/Internal/Profiler.cs +++ b/PCK-Studio/Internal/Profiler.cs @@ -28,19 +28,12 @@ namespace PckStudio.Internal internal static class Profiler { private static Stopwatch _stopwatch = new Stopwatch(); - private static TraceListener _listener; - - [Conditional("DEBUG")] - internal static void Configure(TraceListener listener) - { - _listener = listener; - } [Conditional("DEBUG")] internal static void Start([CallerMemberName] string caller = default!, [CallerFilePath] string source = default!, [CallerLineNumber] int line = default!) { - _listener?.WriteLine($"Stopwatch starts", category: nameof(Profiler)); - _listener?.WriteLine($"{source}@{caller}:{line}", category: nameof(Profiler)); + Debug.WriteLine($"Stopwatch starts", category: nameof(Profiler)); + Debug.WriteLine($"{source}@{caller}:{line}", category: nameof(Profiler)); _stopwatch.Restart(); } @@ -48,7 +41,7 @@ namespace PckStudio.Internal internal static void Stop([CallerMemberName] string caller = default!, [CallerFilePath] string source = default!, [CallerLineNumber] int line = default!) { _stopwatch.Stop(); - _listener?.WriteLine($"{caller} took {_stopwatch.ElapsedMilliseconds}ms", category: nameof(Profiler)); + Debug.WriteLine($"{caller} took {_stopwatch.ElapsedMilliseconds}ms", category: nameof(Profiler)); } } diff --git a/PCK-Studio/Program.cs b/PCK-Studio/Program.cs index c14667e5..644b6c70 100644 --- a/PCK-Studio/Program.cs +++ b/PCK-Studio/Program.cs @@ -23,9 +23,8 @@ namespace PckStudio [STAThread] static void Main(string[] args) { - using var traceFile = File.OpenWrite(Path.Combine(Application.StartupPath, "tarce.log")); - Trace.Listeners.Add(new TextWriterTraceListener(traceFile)); ApplicationScope.Initialize(); + Trace.TraceInformation("Startup"); RPC.Initialize(); MainInstance = new MainForm(); if (args.Length > 0 && File.Exists(args[0]) && args[0].EndsWith(".pck")) From 88b38a88deccc61bafeda769fb82813e414eb9fb Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Wed, 30 Aug 2023 16:09:31 +0200 Subject: [PATCH 25/36] Updated AnimationPictureBox.cs Lets hope it won't throw exceptions --- .../ToolboxItems/AnimationPictureBox.cs | 87 ++++++++----------- 1 file changed, 34 insertions(+), 53 deletions(-) diff --git a/PCK-Studio/ToolboxItems/AnimationPictureBox.cs b/PCK-Studio/ToolboxItems/AnimationPictureBox.cs index 5903520f..9a50fbd3 100644 --- a/PCK-Studio/ToolboxItems/AnimationPictureBox.cs +++ b/PCK-Studio/ToolboxItems/AnimationPictureBox.cs @@ -25,6 +25,7 @@ using System.Runtime.CompilerServices; using PckStudio.Extensions; using PckStudio.Internal; +using System.Drawing; namespace PckStudio.ToolboxItems { @@ -39,6 +40,13 @@ namespace PckStudio.ToolboxItems return _isPlaying; } } + private set + { + lock (l_playing) + { + _isPlaying = value; + } + } } private const int TickInMillisecond = 50; // 1 InGame tick @@ -55,14 +63,17 @@ namespace PckStudio.ToolboxItems { _animation = animation; cts = new CancellationTokenSource(); - Task.Run(DoAnimate, cts.Token); + IsPlaying = true; + Task.Run(DoAnimate, cts.Token); } public void Stop([CallerMemberName] string callerName = default!) { Debug.WriteLine($"{nameof(AnimationPictureBox.Stop)} called from {callerName}!"); + IsPlaying = false; cts.Cancel(); - } + cts.Token.WaitHandle.WaitOne(500); + } public void SelectFrame(Animation animation, int index) { @@ -73,15 +84,11 @@ namespace PckStudio.ToolboxItems currentFrame = SetAnimationFrame(index); } - private async void DoAnimate() + private void DoAnimate() { _ = _animation ?? throw new ArgumentNullException(nameof(_animation)); - lock (l_playing) - { - _isPlaying = true; - } Animation.Frame nextFrame; - while (!cts.IsCancellationRequested) + while (!cts.IsCancellationRequested && IsPlaying) { if (currentAnimationFrameIndex >= _animation.FrameCount) { @@ -100,53 +107,29 @@ namespace PckStudio.ToolboxItems currentFrame = _animation.GetFrame(currentAnimationFrameIndex++); if (_animation.Interpolate) { - await InterpolateFrame(currentFrame, nextFrame); + InterpolateFrame(currentFrame, nextFrame); continue; } SetAnimationFrame(currentFrame); - if (!await DelayAsync(TickInMillisecond * currentFrame.Ticks, cts.Token)) + if (cts.Token.WaitHandle.WaitOne(TickInMillisecond * currentFrame.Ticks)) + { + IsPlaying = false; break; - } - lock (l_playing) - { - _isPlaying = false; + } } } - private async Task InterpolateFrame(Animation.Frame currentFrame, Animation.Frame nextFrame) + private void InterpolateFrame(Animation.Frame currentFrame, Animation.Frame nextFrame) { for (int tick = 0; tick < currentFrame.Ticks && !cts.IsCancellationRequested; tick++) { double delta = 1.0f - tick / (double)currentFrame.Ticks; - if (!IsHandleCreated) - break; - lock (l_dispose) - { - Invoke(() => - { - Image = currentFrame.Texture.Interpolate(nextFrame.Texture, delta); - }); - } - - if (!await DelayAsync(TickInMillisecond, cts.Token)) + SetTexture(currentFrame.Texture.Interpolate(nextFrame.Texture, delta)); + if (cts.Token.WaitHandle.WaitOne(TickInMillisecond)) break; } } - private async Task DelayAsync(int millisecondsDelay, CancellationToken cancellationToken, [CallerMemberName] string caller = default!) - { - try - { - await Task.Delay(millisecondsDelay, cancellationToken); - } - catch - { - Debug.WriteLine($"Stoping {caller}"); - return false; - } - return true; - } - private Animation.Frame SetAnimationFrame(int frameIndex) { var frame = _animation.GetFrame(frameIndex); @@ -154,25 +137,23 @@ namespace PckStudio.ToolboxItems return frame; } + private void SetTexture(Image texture) + { + if (!IsHandleCreated || Disposing) + return; + Invoke(() => Image = texture); + } + private void SetAnimationFrame(Animation.Frame frame) { - if (!IsHandleCreated) - return; - lock (l_dispose) - { - Invoke(() => - { - Image = frame.Texture; - }); - } + SetTexture(frame.Texture); } protected override void Dispose(bool disposing) { - lock(l_dispose) - { - base.Dispose(disposing); - } + Stop(); + cts.Token.WaitHandle.WaitOne(500); + base.Dispose(disposing); } } } From 040962b1666ae0a5f05e9872ceabb1f351bf2dd0 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Wed, 30 Aug 2023 16:13:08 +0200 Subject: [PATCH 26/36] AnimationEditor.cs - Added 'UpdateTreeView' to reduce calls to 'LoadAnimationTreeView' --- PCK-Studio/Forms/Editor/AnimationEditor.cs | 79 ++++++++++++---------- 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.cs b/PCK-Studio/Forms/Editor/AnimationEditor.cs index 3ecbbf00..4638c6a3 100644 --- a/PCK-Studio/Forms/Editor/AnimationEditor.cs +++ b/PCK-Studio/Forms/Editor/AnimationEditor.cs @@ -83,33 +83,40 @@ namespace PckStudio.Forms.Editor } private void LoadAnimationTreeView() - { - if (_animation is null) - { + { + if (_animation is null) + { AnimationStartStopBtn.Enabled = false; return; - } + } AnimationStartStopBtn.Enabled = true; InterpolationCheckbox.Checked = _animation.Interpolate; - frameTreeView.Nodes.Clear(); - TextureIcons.Images.Clear(); - TextureIcons.Images.AddRange(_animation.GetTextures().ToArray()); - foreach (var frame in _animation.GetFrames()) - { - var imageIndex = _animation.GetTextureIndex(frame.Texture); - frameTreeView.Nodes.Add(new TreeNode($"for {frame.Ticks} ticks") - { - ImageIndex = imageIndex, - SelectedImageIndex = imageIndex, - }); - } - if (_animation.FrameCount > 0) - { - animationPictureBox.SelectFrame(_animation, 0); - } - } + TextureIcons.Images.Clear(); + TextureIcons.Images.AddRange(_animation.GetTextures().ToArray()); - private void frameTreeView_AfterSelect(object sender, TreeViewEventArgs e) + UpdateTreeView(); + + if (_animation.FrameCount > 0) + { + animationPictureBox.SelectFrame(_animation, 0); + } + } + + private void UpdateTreeView() + { + frameTreeView.Nodes.Clear(); + frameTreeView.Nodes.AddRange( + _animation.GetFrames() + .Select(frame => + { + var imageIndex = _animation.GetTextureIndex(frame.Texture); + return new TreeNode($"for {frame.Ticks} ticks", imageIndex, imageIndex); + }) + .ToArray() + ); + } + + private void frameTreeView_AfterSelect(object sender, TreeViewEventArgs e) { if (animationPictureBox.IsPlaying) AnimationStartStopBtn.Text = "Play Animation"; @@ -215,7 +222,7 @@ namespace PckStudio.Forms.Editor int draggedIndex = draggedNode.Index; int targetIndex = targetNode.Index; _animation.SwapFrames(draggedIndex, targetIndex); - LoadAnimationTreeView(); + UpdateTreeView(); } } } @@ -248,7 +255,7 @@ namespace PckStudio.Forms.Editor */ _animation.SetFrame(frameTreeView.SelectedNode.Index, diag.FrameTextureIndex, diag.FrameTime); - LoadAnimationTreeView(); + UpdateTreeView(); } } @@ -259,16 +266,16 @@ namespace PckStudio.Forms.Editor if (diag.ShowDialog(this) == DialogResult.OK) { _animation.AddFrame(diag.FrameTextureIndex, IsSpecialTile(_tileName) ? Animation.MinimumFrameTime : diag.FrameTime); - LoadAnimationTreeView(); + UpdateTreeView(); } } private void removeFrameToolStripMenuItem_Click(object sender, EventArgs e) { - if (frameTreeView.SelectedNode is TreeNode t && - _animation.RemoveFrame(t.Index)) + if (frameTreeView.SelectedNode is TreeNode t && _animation.RemoveFrame(t.Index)) + { frameTreeView.SelectedNode.Remove(); - + } } private void bulkAnimationSpeedToolStripMenuItem_Click(object sender, EventArgs e) @@ -279,7 +286,7 @@ namespace PckStudio.Forms.Editor if (animationPictureBox.IsPlaying) animationPictureBox.Stop(); _animation.SetFrameTicks(diag.Ticks); - LoadAnimationTreeView(); + UpdateTreeView(); } diag.Dispose(); } @@ -331,21 +338,21 @@ namespace PckStudio.Forms.Editor private void changeTileToolStripMenuItem_Click(object sender, EventArgs e) { using (ChangeTile diag = new ChangeTile()) - { + { if (diag.ShowDialog(this) != DialogResult.OK) return; - Debug.WriteLine(diag.SelectedTile); + Debug.WriteLine(diag.SelectedTile); _animation.Category = diag.Category; _tileName = diag.SelectedTile; - bulkAnimationSpeedToolStripMenuItem.Enabled = - importToolStripMenuItem.Enabled = - exportAsToolStripMenuItem.Enabled = + bulkAnimationSpeedToolStripMenuItem.Enabled = + importToolStripMenuItem.Enabled = + exportAsToolStripMenuItem.Enabled = InterpolationCheckbox.Visible = !IsSpecialTile(_tileName); - SetTileLabel(); - } + SetTileLabel(); + } } private void SetTileLabel() From 9f2acace409211c28166d6be94ccbaf40c32a5ec Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Wed, 30 Aug 2023 16:13:47 +0200 Subject: [PATCH 27/36] Updated OMI submodule --- Vendor/OMI-Lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Vendor/OMI-Lib b/Vendor/OMI-Lib index c4ea1bdd..9f9736fc 160000 --- a/Vendor/OMI-Lib +++ b/Vendor/OMI-Lib @@ -1 +1 @@ -Subproject commit c4ea1bdd85d97a1b6d629feb61a8086272f90ff5 +Subproject commit 9f9736fc5055b910518282015ce9d4b3a1e8140a From 44c9679bd7b4d36362dd1bbedaeddb349040d394 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Wed, 30 Aug 2023 16:15:27 +0200 Subject: [PATCH 28/36] Update Animation.cs to avoid cross thread access --- PCK-Studio/Internal/Animation.cs | 35 +++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/PCK-Studio/Internal/Animation.cs b/PCK-Studio/Internal/Animation.cs index 163ce6b7..21f6793e 100644 --- a/PCK-Studio/Internal/Animation.cs +++ b/PCK-Studio/Internal/Animation.cs @@ -74,7 +74,23 @@ namespace PckStudio.Internal public class Frame { public readonly Image Texture; - public int Ticks; + public int Ticks + { + get + { + return _ticks; + } + set + { + lock(l_ticks) + { + _ticks = value; + } + } + } + + private int _ticks; + private object l_ticks = new object(); public Frame(Image texture) : this(texture, MinimumFrameTime) { } @@ -169,7 +185,10 @@ namespace PckStudio.Internal public void SetFrame(int frameIndex, Frame frame) { - frames[frameIndex] = frame; + lock(frames) + { + frames[frameIndex] = frame; + } } public void SetFrame(int frameIndex, int textureIndex, int frameTime = MinimumFrameTime) @@ -196,15 +215,21 @@ namespace PckStudio.Internal internal void SetFrameTicks(int ticks) { - foreach (var frame in frames) + lock(frames) { - frame.Ticks = ticks; + foreach (var frame in frames) + { + frame.Ticks = ticks; + } } } internal void SwapFrames(int sourceIndex, int destinationIndex) { - frames.Swap(sourceIndex, destinationIndex); + lock(frames) + { + frames.Swap(sourceIndex, destinationIndex); + } } } } From 4ca35a5e92a02234de2d2dea3cc5a775c66a7ad3 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Wed, 30 Aug 2023 18:42:30 +0200 Subject: [PATCH 29/36] AnimationEditor - Added ability to export animation as gif --- PCK-Studio/Forms/Editor/AnimationEditor.cs | 49 +++++++--------------- PCK-Studio/Internal/Animation.cs | 32 +++++++++++++- PCK-Studio/PckStudio.csproj | 3 ++ 3 files changed, 50 insertions(+), 34 deletions(-) diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.cs b/PCK-Studio/Forms/Editor/AnimationEditor.cs index 4638c6a3..aae1adf3 100644 --- a/PCK-Studio/Forms/Editor/AnimationEditor.cs +++ b/PCK-Studio/Forms/Editor/AnimationEditor.cs @@ -34,6 +34,7 @@ using PckStudio.Properties; using PckStudio.Internal; using PckStudio.Internal.Json; using PckStudio.Helper; +using AnimatedGif; namespace PckStudio.Forms.Editor { @@ -291,7 +292,6 @@ namespace PckStudio.Forms.Editor diag.Dispose(); } - // Reworked import tool with new Animation classes by Miku private void importJavaAnimationToolStripMenuItem_Click(object sender, EventArgs e) { if (MessageBox.Show( @@ -483,40 +483,23 @@ namespace PckStudio.Forms.Editor LoadAnimationTreeView(); } - //[System.Runtime.InteropServices.DllImport("gdi32.dll")] - //public static extern bool DeleteObject(IntPtr hObject); - - private void gifToolStripMenuItem_Click(object sender, EventArgs e) + private void gifToolStripMenuItem_Click(object sender, EventArgs e) { - MessageBox.Show(this, "This feature is still under development", "Coming soon"); - return; + var fileDialog = new SaveFileDialog() + { + FileName = _tileName, + Filter = "GIF file|*.gif" + }; + if (fileDialog.ShowDialog(this) != DialogResult.OK) + return; - // TODO - //var fileDialog = new SaveFileDialog() - //{ - // Filter = "GIF file|*.gif" - //}; - //if (fileDialog.ShowDialog(this) != DialogResult.OK) - // return; - - //GifBitmapEncoder gifBitmapEncoder = new GifBitmapEncoder(); - - //foreach (Bitmap texture in currentAnimation.GetTextures()) - //{ - // var bmp = texture.GetHbitmap(); - // var src = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( - // bmp, - // IntPtr.Zero, - // System.Windows.Int32Rect.Empty, - // BitmapSizeOptions.FromWidthAndHeight(texture.Width, texture.Height)); - // gifBitmapEncoder.Frames.Add(BitmapFrame.Create(src)); - // DeleteObject(bmp); // recommended, handle memory leak - //} - - //using (var fs = fileDialog.OpenFile()) - //{ - // gifBitmapEncoder.Save(fs); - //} + using (var gifWriter = AnimatedGif.AnimatedGif.Create(fileDialog.FileName, Animation.GameTickInMilliseconds, repeat: 0)) + { + foreach (var frame in _animation.GetInterpolatedFrames()) + { + gifWriter.AddFrame(frame.Texture, frame.Ticks * Animation.GameTickInMilliseconds, GifQuality.Bit8); + } + } } private void frameTimeandTicksToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/PCK-Studio/Internal/Animation.cs b/PCK-Studio/Internal/Animation.cs index 21f6793e..2b877380 100644 --- a/PCK-Studio/Internal/Animation.cs +++ b/PCK-Studio/Internal/Animation.cs @@ -21,6 +21,7 @@ using System.Drawing; using PckStudio.Extensions; using System.Text; using System.Collections.ObjectModel; +using System.Linq; namespace PckStudio.Internal { @@ -28,6 +29,8 @@ namespace PckStudio.Internal { public const int MinimumFrameTime = 1; + public const int GameTickInMilliseconds = 50; + public static Animation Empty(AnimationCategory category) { var animation = new Animation(Array.Empty(), string.Empty); @@ -172,7 +175,34 @@ namespace PckStudio.Internal return new ReadOnlyCollection(frames); } - public IReadOnlyCollection GetTextures() + public IReadOnlyCollection GetInterpolatedFrames() + { + if (Interpolate) + { + return new ReadOnlyCollection(InternalGetInterpolatedFrames().ToList()); + } + return GetFrames(); + } + + private IEnumerable InternalGetInterpolatedFrames() + { + for (int i = 0; i < FrameCount; i++) + { + Frame currentFrame = frames[i]; + Frame nextFrame = frames[0]; + if (i + 1 < FrameCount) + nextFrame = frames[i + 1]; + for (int tick = 0; tick < currentFrame.Ticks; tick++) + { + double delta = 1.0f - tick / (double)currentFrame.Ticks; + yield return new Frame(currentFrame.Texture.Interpolate(nextFrame.Texture, delta)); + } + } + yield break; + } + + + public IReadOnlyCollection GetTextures() { return textures; } diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index 73092839..3e040c1d 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -691,6 +691,9 @@ + + 1.0.5 + 5.8.0-alpha0098 compile; runtime; build; native; contentfiles; analyzers; buildtransitive From d8d046c1102c0f30e62c702f159bbacc0341194c Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Wed, 30 Aug 2023 18:43:55 +0200 Subject: [PATCH 30/36] AnimationPictureBox - Removed 'TickInMillisecond' constant and use 'Animation.GameTickInMilliseconds' --- PCK-Studio/ToolboxItems/AnimationPictureBox.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/PCK-Studio/ToolboxItems/AnimationPictureBox.cs b/PCK-Studio/ToolboxItems/AnimationPictureBox.cs index 9a50fbd3..666650f6 100644 --- a/PCK-Studio/ToolboxItems/AnimationPictureBox.cs +++ b/PCK-Studio/ToolboxItems/AnimationPictureBox.cs @@ -49,8 +49,6 @@ namespace PckStudio.ToolboxItems } } - private const int TickInMillisecond = 50; // 1 InGame tick - private bool _isPlaying = false; private int currentAnimationFrameIndex = 0; private Animation.Frame currentFrame; @@ -111,7 +109,7 @@ namespace PckStudio.ToolboxItems continue; } SetAnimationFrame(currentFrame); - if (cts.Token.WaitHandle.WaitOne(TickInMillisecond * currentFrame.Ticks)) + if (cts.Token.WaitHandle.WaitOne(Animation.GameTickInMilliseconds * currentFrame.Ticks)) { IsPlaying = false; break; @@ -125,7 +123,7 @@ namespace PckStudio.ToolboxItems { double delta = 1.0f - tick / (double)currentFrame.Ticks; SetTexture(currentFrame.Texture.Interpolate(nextFrame.Texture, delta)); - if (cts.Token.WaitHandle.WaitOne(TickInMillisecond)) + if (cts.Token.WaitHandle.WaitOne(Animation.GameTickInMilliseconds)) break; } } From 993d62533046c54262d25979b38355498df85e4d Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Wed, 30 Aug 2023 18:44:59 +0200 Subject: [PATCH 31/36] TreeNodeExtensions - Added constraints to generic type --- PCK-Studio/Extensions/TreeNodeExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PCK-Studio/Extensions/TreeNodeExtensions.cs b/PCK-Studio/Extensions/TreeNodeExtensions.cs index 756ece05..0fab1fcd 100644 --- a/PCK-Studio/Extensions/TreeNodeExtensions.cs +++ b/PCK-Studio/Extensions/TreeNodeExtensions.cs @@ -9,12 +9,12 @@ namespace PckStudio.Extensions { internal static class TreeNodeExtensions { - internal static bool IsTagOfType(this TreeNode node) + internal static bool IsTagOfType(this TreeNode node) where T : class { return node.Tag is T; } - internal static bool TryGetTagData(this TreeNode node, out TOut tagData) + internal static bool TryGetTagData(this TreeNode node, out TOut tagData) where TOut : class { if (node?.Tag is TOut _data) { From 00669c1c456c7154a79a4bb639fd65bf53ed885e Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Wed, 30 Aug 2023 18:47:40 +0200 Subject: [PATCH 32/36] ItemSelectionPopUp - Changed accessibility to label text and button text --- .../Additional-Popups/ItemSelectionPopUp.Designer.cs | 4 ++-- .../Forms/Additional-Popups/ItemSelectionPopUp.cs | 11 +++++++++++ PCK-Studio/Forms/Editor/ANIMEditor.cs | 5 +++-- PCK-Studio/Forms/Editor/AudioEditor.cs | 2 +- PCK-Studio/Forms/Editor/GameRuleFileEditor.cs | 4 ++-- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/PCK-Studio/Forms/Additional-Popups/ItemSelectionPopUp.Designer.cs b/PCK-Studio/Forms/Additional-Popups/ItemSelectionPopUp.Designer.cs index 5ab86c78..85edf085 100644 --- a/PCK-Studio/Forms/Additional-Popups/ItemSelectionPopUp.Designer.cs +++ b/PCK-Studio/Forms/Additional-Popups/ItemSelectionPopUp.Designer.cs @@ -89,8 +89,8 @@ #endregion private System.Windows.Forms.Button cancelButton; - public System.Windows.Forms.Label label2; - public System.Windows.Forms.Button okBtn; private MetroFramework.Controls.MetroComboBox ComboBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button okBtn; } } \ No newline at end of file diff --git a/PCK-Studio/Forms/Additional-Popups/ItemSelectionPopUp.cs b/PCK-Studio/Forms/Additional-Popups/ItemSelectionPopUp.cs index efb7f1b0..c5017b39 100644 --- a/PCK-Studio/Forms/Additional-Popups/ItemSelectionPopUp.cs +++ b/PCK-Studio/Forms/Additional-Popups/ItemSelectionPopUp.cs @@ -7,6 +7,17 @@ namespace PckStudio.Forms.Additional_Popups { public string SelectedItem => DialogResult == DialogResult.OK ? ComboBox.Text : string.Empty; + public string LabelText + { + get => label2.Text; + set => label2.Text = value; + } + public string ButtonText + { + get => okBtn.Text; + set => okBtn.Text = value; + } + public ItemSelectionPopUp(params string[] items) { InitializeComponent(); diff --git a/PCK-Studio/Forms/Editor/ANIMEditor.cs b/PCK-Studio/Forms/Editor/ANIMEditor.cs index bd27d242..3184ae33 100644 --- a/PCK-Studio/Forms/Editor/ANIMEditor.cs +++ b/PCK-Studio/Forms/Editor/ANIMEditor.cs @@ -182,6 +182,7 @@ namespace PckStudio.Forms.Editor public ANIMEditor(SkinANIM skinANIM) : this() { + initialANIM = skinANIM; setDisplayAnim(skinANIM); ruleset.ApplyAnim(skinANIM); } @@ -345,8 +346,8 @@ namespace PckStudio.Forms.Editor private void templateButton_Click(object sender, EventArgs e) { var diag = new ItemSelectionPopUp(Templates.Keys.ToArray()); - diag.label2.Text = "Presets"; - diag.okBtn.Text = "Load"; + diag.ButtonText = "Presets"; + diag.ButtonText = "Load"; if (diag.ShowDialog() != DialogResult.OK) return; diff --git a/PCK-Studio/Forms/Editor/AudioEditor.cs b/PCK-Studio/Forms/Editor/AudioEditor.cs index 7c04fa28..3ac86ddc 100644 --- a/PCK-Studio/Forms/Editor/AudioEditor.cs +++ b/PCK-Studio/Forms/Editor/AudioEditor.cs @@ -577,7 +577,7 @@ namespace PckStudio.Forms.Editor if (available.Length > 0) { using ItemSelectionPopUp add = new ItemSelectionPopUp(available); - add.okBtn.Text = "Save"; + add.ButtonText = "Save"; if (add.ShowDialog() != DialogResult.OK) return; audioFile.RemoveCategory(category.audioType); diff --git a/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs b/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs index 7e412717..44b2175b 100644 --- a/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs +++ b/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs @@ -50,8 +50,8 @@ namespace PckStudio.Forms.Editor private void PromptForCompressionType() { ItemSelectionPopUp dialog = new ItemSelectionPopUp("Wii U, PS Vita", "PS3", "Xbox 360"); - dialog.label2.Text = "Type"; - dialog.okBtn.Text = "Ok"; + dialog.LabelText = "Type"; + dialog.ButtonText = "Ok"; if (dialog.ShowDialog() == DialogResult.OK) { switch(dialog.SelectedItem) From fd612fc8b3623cb1ba73766cec6a12652c8c7c76 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Wed, 30 Aug 2023 18:48:47 +0200 Subject: [PATCH 33/36] GameRuleFileEditor - Made copression select text const --- PCK-Studio/Forms/Editor/GameRuleFileEditor.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs b/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs index 44b2175b..ff2acc18 100644 --- a/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs +++ b/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs @@ -40,6 +40,11 @@ namespace PckStudio.Forms.Editor private GameRuleFile _file; private GameRuleFile.CompressionType compressionType; private GameRuleFile.CompressionLevel compressionLevel; + + private const string use_zlib = "Wii U, PS Vita"; + private const string use_deflate = "PS3"; + private const string use_xmem = "Xbox 360"; + public GameRuleFileEditor() { InitializeComponent(); @@ -49,20 +54,20 @@ namespace PckStudio.Forms.Editor private void PromptForCompressionType() { - ItemSelectionPopUp dialog = new ItemSelectionPopUp("Wii U, PS Vita", "PS3", "Xbox 360"); + ItemSelectionPopUp dialog = new ItemSelectionPopUp(use_zlib, use_deflate, use_xmem); dialog.LabelText = "Type"; dialog.ButtonText = "Ok"; if (dialog.ShowDialog() == DialogResult.OK) { switch(dialog.SelectedItem) { - case "Wii U, PS Vita": + case use_zlib: wiiUPSVitaToolStripMenuItem.Checked = true; break; - case "PS3": + case use_deflate: pS3ToolStripMenuItem.Checked = true; break; - case "Xbox 360": + case use_xmem: xbox360ToolStripMenuItem.Checked = true; break; } From a03a7a0fe583f5645fcdf446ac14275b1c720e59 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Sat, 2 Sep 2023 14:01:39 +0200 Subject: [PATCH 34/36] Update OMI submodule --- PCK-Studio/Features/WiiUPanel.cs | 2 +- PCK-Studio/Forms/Editor/TextureAtlasEditor.cs | 17 ++----- .../Skins-And-Textures/AdvancedOptions.cs | 6 +-- .../Utilities/TextureConverterUtility.cs | 6 +-- PCK-Studio/Forms/Utilities/pckCenterOpen.cs | 2 +- PCK-Studio/MainForm.cs | 48 +++++++++++-------- Vendor/OMI-Lib | 2 +- 7 files changed, 40 insertions(+), 43 deletions(-) diff --git a/PCK-Studio/Features/WiiUPanel.cs b/PCK-Studio/Features/WiiUPanel.cs index ce438ab0..ab6aa5f4 100644 --- a/PCK-Studio/Features/WiiUPanel.cs +++ b/PCK-Studio/Features/WiiUPanel.cs @@ -273,7 +273,7 @@ namespace PckStudio.Features client.UploadFile(ms, GetGameContentPath() + "/Common/Media/MediaWiiU.arc"); } archive.Clear(); - currentPCK?.Files.Clear(); + //currentPCK?.Files.Clear(); currentPCK = null; } GC.Collect(); diff --git a/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs b/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs index 1e254701..9bcb6cb0 100644 --- a/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs +++ b/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs @@ -148,7 +148,7 @@ namespace PckStudio.Forms.Editor selectTilePictureBox.UseBlendColor = applyColorMaskToolStripMenuItem.Checked; bool hasAnimation = - _pckFile.Files.TryGetValue($"res/textures/{_atlasType}/{_selectedTile.Tile.InternalName}.png", PckFileType.TextureFile, out var animationFile); + _pckFile.TryGetValue($"res/textures/{_atlasType}/{_selectedTile.Tile.InternalName}.png", PckFileType.TextureFile, out var animationFile); animationButton.Text = hasAnimation ? "Edit Animation" : "Create Animation"; replaceButton.Enabled = !hasAnimation; @@ -394,14 +394,10 @@ namespace PckStudio.Forms.Editor private void animationButton_Click(object sender, EventArgs e) { - bool isNewFile; - if (isNewFile = !_pckFile.Files.TryGetValue( + var file = _pckFile.GetOrCreate( $"res/textures/{_atlasType}/{_selectedTile.Tile.InternalName}.png", - PckFileType.TextureFile, out var file - )) - { - file = new PckFileData($"res/textures/{_atlasType}/{_selectedTile.Tile.InternalName}.png", PckFileType.TextureFile); - } + PckFileType.TextureFile + ); var animation = AnimationHelper.GetAnimationFromFile(file); @@ -412,11 +408,6 @@ namespace PckStudio.Forms.Editor } AnimationHelper.SaveAnimationToFile(file, animation); - - if (isNewFile) - { - _pckFile.Files.Add(file); - } } private void extractTileToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs b/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs index 202a4500..65f15c65 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs @@ -37,14 +37,14 @@ namespace PckStudio.Popups { if (fileTypeComboBox.SelectedIndex >= 0 && fileTypeComboBox.SelectedIndex <= 13) { - applyBulkProperties(_pckFile.Files, fileTypeComboBox.SelectedIndex - 1); + applyBulkProperties(_pckFile.GetFiles(), fileTypeComboBox.SelectedIndex - 1); DialogResult = DialogResult.OK; return; } MessageBox.Show("Please select a filetype before applying"); } - private void applyBulkProperties(FileCollection files, int index) + private void applyBulkProperties(IReadOnlyCollection files, int index) { foreach (PckFileData file in files) { @@ -56,7 +56,7 @@ namespace PckStudio.Popups var reader = new PckFileReader(_endianness); using var ms = new MemoryStream(file.Data); PckFile subPCK = reader.FromStream(ms); - applyBulkProperties(subPCK.Files, index); + applyBulkProperties(subPCK.GetFiles(), index); file.SetData(new PckFileWriter(subPCK, _endianness)); } catch (OverflowException ex) diff --git a/PCK-Studio/Forms/Utilities/TextureConverterUtility.cs b/PCK-Studio/Forms/Utilities/TextureConverterUtility.cs index f71875cf..f5e9f12b 100644 --- a/PCK-Studio/Forms/Utilities/TextureConverterUtility.cs +++ b/PCK-Studio/Forms/Utilities/TextureConverterUtility.cs @@ -426,7 +426,7 @@ namespace PckStudio.Forms.Utilities string Outpath = "assets\\minecraft\\textures\\"; - foreach (PckFileData mf in Pck.Files) + foreach (PckFileData mf in Pck.GetFiles()) { FileInfo file = new FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.Filename); file.Directory.Create(); // If the directory already exists, this method does nothing. @@ -451,7 +451,7 @@ namespace PckStudio.Forms.Utilities string Outpath = "assets\\minecraft\\textures\\"; - foreach (PckFileData mf in Pck.Files) + foreach (PckFileData mf in Pck.GetFiles()) { FileInfo file = new FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.Filename); file.Directory.Create(); // If the directory already exists, this method does nothing. @@ -476,7 +476,7 @@ namespace PckStudio.Forms.Utilities string Outpath = "assets\\minecraft\\textures\\"; - foreach (PckFileData mf in Pck.Files) + foreach (PckFileData mf in Pck.GetFiles()) { FileInfo file = new FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.Filename); file.Directory.Create(); // If the directory already exists, this method does nothing. diff --git a/PCK-Studio/Forms/Utilities/pckCenterOpen.cs b/PCK-Studio/Forms/Utilities/pckCenterOpen.cs index a7cf3a09..3bdc4fd7 100644 --- a/PCK-Studio/Forms/Utilities/pckCenterOpen.cs +++ b/PCK-Studio/Forms/Utilities/pckCenterOpen.cs @@ -141,7 +141,7 @@ namespace PckStudio.Forms List capesList = new List(); var reader = new PckFileReader(); PckFile currentPCK = reader.FromFile(Program.AppData + "/PCK-Center/myPcks/" + mod + ".pck"); - foreach (PckFileData skin in currentPCK.Files) + foreach (PckFileData skin in currentPCK.GetFiles()) { if (skin.Filename.Count() == 19) { diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index ff876c47..c50d57c1 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -203,7 +203,7 @@ namespace PckStudio private void LoadEditorTab() { - fileEntryCountLabel.Text = "Files:" + currentPCK.Files.Count; + fileEntryCountLabel.Text = "Files:" + currentPCK.FileCount; if (isTemplateFile) pckFileLabel.Text = "Unsaved File!"; else @@ -298,11 +298,11 @@ namespace PckStudio private void BuildPckTreeView(TreeNodeCollection root, PckFile pckFile, string parentPath = "") { - foreach (var file in pckFile.Files) + foreach (var file in pckFile.GetFiles()) { // fix any file paths that may be incorrect - if (file.Filename.StartsWith(parentPath)) - file.Filename = file.Filename.Remove(0, parentPath.Length); + //if (file.Filename.StartsWith(parentPath)) + // file.Filename = file.Filename.Remove(0, parentPath.Length); TreeNode node = BuildNodeTreeBySeperator(root, file.Filename, '/'); node.Tag = file; if (Settings.Default.LoadSubPcks && @@ -361,7 +361,7 @@ namespace PckStudio private void HandleTextureFile(PckFileData file) { - _ = file.IsMipmappedFile() && currentPCK.Files.TryGetValue(file.GetNormalPath(), PckFileType.TextureFile, out file); + _ = file.IsMipmappedFile() && currentPCK.TryGetValue(file.GetNormalPath(), PckFileType.TextureFile, out file); if (file.Size <= 0) { @@ -601,7 +601,7 @@ namespace PckStudio } else { - foreach (var _file in currentPCK.Files) + foreach (var _file in currentPCK.GetFiles()) { if (_file.Filename.StartsWith(selectedFolder)) { @@ -716,7 +716,7 @@ namespace PckStudio if (node.TryGetTagData(out PckFileData file)) { - if (!BeforeFileRemove(file) && currentPCK.Files.Remove(file)) + if (!BeforeFileRemove(file) && currentPCK.RemoveFile(file)) { node.Remove(); wasModified = true; @@ -726,7 +726,7 @@ namespace PckStudio MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) { string pckFolderDir = node.FullPath; - currentPCK.Files.RemoveAll(file => !BeforeFileRemove(file) && file.Filename.StartsWith(pckFolderDir)); + currentPCK.RemoveAll(file => !BeforeFileRemove(file) && file.Filename.StartsWith(pckFolderDir)); node.Remove(); wasModified = true; } @@ -789,7 +789,7 @@ namespace PckStudio else { if (treeViewMain.Nodes.ContainsKey("Skins")) add.SkinFile.Filename = add.SkinFile.Filename.Insert(0, "Skins/"); // Then Skins folder - currentPCK.Files.Add(add.SkinFile); + currentPCK.AddFile(add.SkinFile); } if (add.HasCape) { @@ -807,7 +807,7 @@ namespace PckStudio else { if (treeViewMain.Nodes.ContainsKey("Skins")) add.CapeFile.Filename = add.CapeFile.Filename.Insert(0, "Skins/"); // Then Skins folder - currentPCK.Files.Add(add.CapeFile); + currentPCK.AddFile(add.CapeFile); } } @@ -824,13 +824,13 @@ namespace PckStudio audioPck.AddCategory(PckAudioFile.AudioCategory.EAudioType.Nether); audioPck.AddCategory(PckAudioFile.AudioCategory.EAudioType.End); PckFileData pckFileData = new PckFileData("audio.pck", PckFileType.AudioFile); - pckFileData .SetData(new PckAudioFileWriter(audioPck, isLittle ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); + pckFileData.SetData(new PckAudioFileWriter(audioPck, isLittle ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); return pckFileData; } private void audiopckToolStripMenuItem_Click(object sender, EventArgs e) { - if (currentPCK.Files.Contains("audio.pck", PckFileType.AudioFile)) + if (currentPCK.Contains("audio.pck", PckFileType.AudioFile)) { // the chance of this happening is really really slim but just in case MessageBox.Show("There is already a file in this PCK named \"audio.pck\"!", "Can't create audio.pck"); @@ -846,7 +846,7 @@ namespace PckStudio AudioEditor diag = new AudioEditor(file, LittleEndianCheckBox.Checked); if(diag.ShowDialog(this) == DialogResult.OK) { - currentPCK.Files.Add(file); + currentPCK.AddFile(file); } diag.Dispose(); BuildMainTreeView(); @@ -858,6 +858,12 @@ namespace PckStudio if (diag.ShowDialog(this) != DialogResult.OK) return; + if (currentPCK.Contains($"res/textures/{Animation.GetCategoryName(diag.Category)}/{diag.SelectedTile}.png", PckFileType.TextureFile)) + { + MessageBox.Show($"{diag.SelectedTile} is already present.", "File already present"); + return; + } + var file = new PckFileData( $"res/textures/{Animation.GetCategoryName(diag.Category)}/{diag.SelectedTile}.png", PckFileType.TextureFile); @@ -869,7 +875,7 @@ namespace PckStudio { wasModified = true; AnimationHelper.SaveAnimationToFile(file, animation); - currentPCK.Files.Add(file); + currentPCK.AddFile(file); BuildMainTreeView(); ReloadMetaTreeView(); } @@ -960,7 +966,7 @@ namespace PckStudio { if (file.Size <= 0) { - Trace.WriteLine($"'{file.Filename}' has no data attached.", category: nameof(HandleTextureFile)); + Trace.WriteLine($"'{file.Filename}' has no data attached.", category: nameof(treeViewMain_DoubleClick)); return; } pckFileTypeHandler[file.Filetype]?.Invoke(file); @@ -1084,7 +1090,7 @@ namespace PckStudio if (node.Parent == null) treeViewMain.Nodes.Insert(node.Index + 1, newNode); //adds generated file node else node.Parent.Nodes.Insert(node.Index + 1, newNode);//adds generated file node to selected folder - if (!IsSubPCKNode(node.FullPath)) currentPCK.Files.Insert(node.Index + 1, newFile); + if (!IsSubPCKNode(node.FullPath)) currentPCK.InsertFile(node.Index + 1, newFile); else RebuildSubPCK(node.FullPath); BuildMainTreeView(); wasModified = true; @@ -1345,7 +1351,7 @@ namespace PckStudio MessageBoxButtons.OK, MessageBoxIcon.Error); } } - foreach (PckFileData file in pckfile.Files) + foreach (PckFileData file in pckfile.GetFiles()) { string filepath = $"{sfd.SelectedPath}/{file.Filename}"; FileInfo fileinfo = new FileInfo(filepath); @@ -1460,7 +1466,7 @@ namespace PckStudio { var reader = new PckFileReader(LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); var skinspck = reader.FromStream(ms); - skinspck.Files.Add(newFile); + skinspck.AddFile(newFile); ms.Position = 0; var writer = new PckFileWriter(skinspck, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); writer.WriteToStream(ms); @@ -1468,7 +1474,7 @@ namespace PckStudio } continue; } - currentPCK.Files.Add(newFile); + currentPCK.AddFile(newFile); } BuildMainTreeView(); wasModified = true; @@ -1887,7 +1893,7 @@ namespace PckStudio string mippedPath = $"{textureDirectory}/{textureName}MipMapLevel{i}{textureExtension}"; Debug.WriteLine(mippedPath); if (currentPCK.HasFile(mippedPath, PckFileType.TextureFile)) - currentPCK.Files.Remove(currentPCK.GetFile(mippedPath, PckFileType.TextureFile)); + currentPCK.RemoveFile(currentPCK.GetFile(mippedPath, PckFileType.TextureFile)); PckFileData MipMappedFile = new PckFileData(mippedPath, PckFileType.TextureFile); @@ -1907,7 +1913,7 @@ namespace PckStudio MipMappedFile.SetData(mippedTexture, ImageFormat.Png); - currentPCK.Files.Insert(currentPCK.Files.IndexOf(file) + i - 1, MipMappedFile); + currentPCK.InsertFile(currentPCK.IndexOfFile(file) + i - 1, MipMappedFile); } BuildMainTreeView(); } diff --git a/Vendor/OMI-Lib b/Vendor/OMI-Lib index 9f9736fc..a154ce2b 160000 --- a/Vendor/OMI-Lib +++ b/Vendor/OMI-Lib @@ -1 +1 @@ -Subproject commit 9f9736fc5055b910518282015ce9d4b3a1e8140a +Subproject commit a154ce2b8987ddcc625b6314cfa5aa26972e790d From db11c0d3e0f1325c84dc5ce49c0f22ac406edf2a Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Sun, 3 Sep 2023 17:53:59 +0200 Subject: [PATCH 35/36] Updated GRF Editor and OMI submodule --- PCK-Studio/Forms/Editor/GameRuleFileEditor.cs | 4 ++-- Vendor/OMI-Lib | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs b/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs index ff2acc18..d4daade9 100644 --- a/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs +++ b/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs @@ -132,7 +132,7 @@ namespace PckStudio.Forms.Editor private void SetCompressionLevel() { - switch (_file.FileHeader.CompressionLevel) + switch (_file.Header.CompressionLevel) { case GameRuleFile.CompressionLevel.None: noneToolStripMenuItem.Checked = true; @@ -263,7 +263,7 @@ namespace PckStudio.Forms.Editor private void saveToolStripMenuItem_Click(object sender, EventArgs e) { - if (_file.FileHeader.unknownData[3] != 0) + if (_file.Header.unknownData[3] != 0) { MessageBox.Show("World grf saving is currently unsupported"); return; diff --git a/Vendor/OMI-Lib b/Vendor/OMI-Lib index a154ce2b..c33a6ada 160000 --- a/Vendor/OMI-Lib +++ b/Vendor/OMI-Lib @@ -1 +1 @@ -Subproject commit a154ce2b8987ddcc625b6314cfa5aa26972e790d +Subproject commit c33a6adafe24d7dbbbc2503e5470d348b6bdb1c4 From 2e8a4316bad854c2be897db80f80532b31326212 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Sat, 23 Sep 2023 18:21:15 +0200 Subject: [PATCH 36/36] TextureAtlasEditor - Fixed combo box being disabled when color mask is supported --- PCK-Studio/Forms/Editor/TextureAtlasEditor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs b/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs index 9bcb6cb0..1d71098f 100644 --- a/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs +++ b/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs @@ -161,7 +161,7 @@ namespace PckStudio.Forms.Editor return; } - if (variantLabel.Visible = variantComboBox.Visible = _selectedTile.Tile.HasColourEntry && _selectedTile.Tile.ColourEntry.Variants.Length > 1) + if (variantComboBox.Enabled = variantLabel.Visible = variantComboBox.Visible = _selectedTile.Tile.HasColourEntry && _selectedTile.Tile.ColourEntry.Variants.Length > 1) { variantComboBox.Items.AddRange(_selectedTile.Tile.ColourEntry.Variants); variantComboBox.SelectedItem = _selectedTile.Tile.ColourEntry.DefaultName;