Added PCK Endianness conversion features

This commit is contained in:
MattN-L
2023-12-11 21:02:14 -05:00
parent 01bea15cfb
commit 565dabf38a
3 changed files with 1871 additions and 1594 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -184,14 +184,14 @@ namespace PckStudio
}
catch (OverflowException ex)
{
MessageBox.Show("Failed to open pck\n" +
MessageBox.Show("Failed to open PCK\n" +
$"Try {(LittleEndianCheckBox.Checked ? "unchecking" : "checking")} the 'Open/Save as Switch/Vita/PS4 pck' check box in the upper right corner.",
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
Debug.WriteLine(ex.Message);
}
catch
{
MessageBox.Show("Failed to open pck. There's two common reasons for this:\n" +
MessageBox.Show("Failed to open PCK. There's two common reasons for this:\n" +
"1. The file is audio/music cues PCK file. Please use the specialized editor while inside of a pck file.\n" +
"2. We're aware of an issue where a pck file might fail to load because it contains multiple entries with the same path.",
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
@@ -302,15 +302,13 @@ namespace PckStudio
return BuildNodeTreeBySeperator(subNode.Nodes, subPath, seperator);
}
private void BuildPckTreeView(TreeNodeCollection root, PckFile pckFile, string parentPath = "")
private void BuildPckTreeView(TreeNodeCollection root, PckFile pckFile, bool isSubPCK)
{
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);
TreeNode node = BuildNodeTreeBySeperator(root, file.Filename, '/');
node.Tag = file;
SetNodeIcon(node, file.Filetype);
if (Settings.Default.LoadSubPcks &&
(file.Filetype == PckFileType.SkinDataFile || file.Filetype == PckFileType.TexturePackInfoFile) &&
file.Size > 0)
@@ -321,19 +319,29 @@ namespace PckStudio
{
var reader = new PckFileReader(LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian);
PckFile subPCKfile = reader.FromStream(stream);
// passes parent path to remove from sub pck filepaths
BuildPckTreeView(node.Nodes, subPCKfile, file.Filename + "/");
BuildPckTreeView(node.Nodes, subPCKfile, true);
}
catch (OverflowException ex)
{
MessageBox.Show("Failed to open pck\n" +
"Try checking the 'Open/Save as Switch/Vita/PS4 pck' checkbox in the upper right corner.",
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
Debug.WriteLine(ex.Message);
// i think i'm stupid of something because this is needs to be negated to work right... whatever.
if(!isSubPCK)
{
SetNodeIcon(node, file.Filetype);
MessageBox.Show($"Failed to open {file.Filename}\n" +
"This file's entries will not be shown in the tree and will crash the game if not resolved. Try right clicking the file and selecting one of the options inside of \"Misc. Functions/Set PCK Endianness\".",
"Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
Debug.WriteLine(ex.Message);
}
else
{
MessageBox.Show($"Failed to open PCK\n" +
"Try checking the 'Open/Save as Switch/Vita/PS4 pck' checkbox in the upper right corner.",
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
Debug.WriteLine(ex.Message);
}
}
}
}
SetNodeIcon(node, file.Filetype);
};
}
@@ -344,7 +352,7 @@ namespace PckStudio
previewPictureBox.Image = Resources.NoImageFound;
treeMeta.Nodes.Clear();
treeViewMain.Nodes.Clear();
BuildPckTreeView(treeViewMain.Nodes, currentPCK);
BuildPckTreeView(treeViewMain.Nodes, currentPCK, false);
if (isTemplateFile && currentPCK.HasFile("Skins.pck", PckFileType.SkinDataFile))
{
@@ -413,8 +421,18 @@ namespace PckStudio
private void HandleAudioFile(PckFileData file)
{
using AudioEditor audioEditor = new AudioEditor(file, LittleEndianCheckBox.Checked);
wasModified = audioEditor.ShowDialog(this) == DialogResult.OK;
try
{
using AudioEditor audioEditor = new AudioEditor(file, LittleEndianCheckBox.Checked);
wasModified = audioEditor.ShowDialog(this) == DialogResult.OK;
}
catch (Exception ex)
{
MessageBox.Show($"Failed to open {file.Filename}\n" +
"Try converting the file by right clicking the file and selecting one of the options inside of \"Misc. Functions/Set PCK Endianness\" and then try opening this file again.",
"Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
Debug.WriteLine(ex.Message);
}
}
private void HandleLocalisationFile(PckFileData file)
@@ -2334,5 +2352,48 @@ namespace PckStudio
private void moveUpToolStripMenuItem_Click(object sender, EventArgs e) => moveFile(-1);
[Obsolete]
private void moveDownToolStripMenuItem_Click(object sender, EventArgs e) => moveFile(1);
}
private void setPCKEndiannessStripMenuItem_Click(OMI.Endianness endianness)
{
try
{
if (treeViewMain.SelectedNode.Tag is PckFileData file && (file.Filetype is PckFileType.AudioFile || file.Filetype is PckFileType.SkinDataFile || file.Filetype is PckFileType.TexturePackInfoFile))
{
using (var WrittenStream = new MemoryStream())
{
dynamic reader = file.Filetype is PckFileType.AudioFile
? new PckAudioFileReader(endianness == OMI.Endianness.BigEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)
: new PckFileReader(endianness == OMI.Endianness.BigEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian);
var pck = reader.FromStream(new MemoryStream(file.Data));
dynamic writer = file.Filetype is PckFileType.AudioFile
? new PckAudioFileWriter(pck, endianness)
: new PckFileWriter(pck, endianness);
writer.WriteToStream(WrittenStream);
file.SetData(WrittenStream.ToArray());
}
BuildMainTreeView();
wasModified = true;
MessageBox.Show($"{file.Filename} converted to {(endianness == OMI.Endianness.LittleEndian ? "little" : "big")} endian.", "Converted PCK file");
}
}
catch (OverflowException ex)
{
MessageBox.Show(this, $"File was not a valid {(endianness != OMI.Endianness.LittleEndian ? "little" : "big")} endian PCK File.", "Not a valid PCK file");
return;
}
catch(Exception ex)
{
MessageBox.Show(this, ex.Message, "Not a valid PCK file");
return;
}
}
private void littleEndianToolStripMenuItem_Click(object sender, EventArgs e) => setPCKEndiannessStripMenuItem_Click(OMI.Endianness.LittleEndian);
private void bigEndianToolStripMenuItem_Click(object sender, EventArgs e) => setPCKEndiannessStripMenuItem_Click(OMI.Endianness.BigEndian);
private void refreshFileTreeToolStripMenuItem_Click(object sender, EventArgs e)
{
BuildMainTreeView();
}
}
}

File diff suppressed because it is too large Load Diff