From 56b6473fcb27d17e87fa12c38aaa002f70cc140c Mon Sep 17 00:00:00 2001 From: AdAstra-LD <76622070+AdAstra-LD@users.noreply.github.com> Date: Tue, 30 Aug 2022 00:07:38 +0200 Subject: [PATCH] Added an error message to Script Editor for missing usescript references + Script save file functions now return true when everything was saved correctly, false otherwise + Return value of the script save functions is checked to determine whether or not to mark current script file as changed --- DS_Map/Main Window.cs | 7 ++++--- DS_Map/ROMFiles/RomFile.cs | 10 ++++++---- DS_Map/ROMFiles/ScriptFile.cs | 18 ++++++++++++------ 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/DS_Map/Main Window.cs b/DS_Map/Main Window.cs index 2f534b0..11ed39f 100644 --- a/DS_Map/Main Window.cs +++ b/DS_Map/Main Window.cs @@ -6876,9 +6876,10 @@ namespace DSPRE { } else if (userEdited.fileID == int.MaxValue) { MessageBox.Show("This " + typeof(ScriptFile).Name + " is couldn't be saved since it's empty.", "Can't save", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { //check if ScriptFile instance was created succesfully - userEdited.SaveToFileDefaultDir(selectScriptFileComboBox.SelectedIndex); - currentScriptFile = userEdited; - ScriptEditorSetClean(); + if (userEdited.SaveToFileDefaultDir(selectScriptFileComboBox.SelectedIndex)) { + currentScriptFile = userEdited; + ScriptEditorSetClean(); + } } } private void clearCurrentLevelScriptButton_Click(object sender, EventArgs e) { diff --git a/DS_Map/ROMFiles/RomFile.cs b/DS_Map/ROMFiles/RomFile.cs index cec1628..6125277 100644 --- a/DS_Map/ROMFiles/RomFile.cs +++ b/DS_Map/ROMFiles/RomFile.cs @@ -6,12 +6,12 @@ using static DSPRE.RomInfo; namespace DSPRE.ROMFiles { public abstract class RomFile { public abstract byte[] ToByteArray(); - public void SaveToFile(string path, bool showSuccessMessage = true) { + public bool SaveToFile(string path, bool showSuccessMessage = true) { byte[] romFileToByteArray = ToByteArray(); if (romFileToByteArray is null) { Console.WriteLine(GetType().Name + " couldn't be saved!"); - return; + return false; } File.WriteAllBytes(path, romFileToByteArray); @@ -19,10 +19,12 @@ namespace DSPRE.ROMFiles { if (showSuccessMessage) { MessageBox.Show(GetType().Name + " saved successfully!", "", MessageBoxButtons.OK, MessageBoxIcon.Information); } + + return true; } - protected internal void SaveToFileDefaultDir(DirNames dir, int IDtoReplace, bool showSuccessMessage = true) { + protected internal bool SaveToFileDefaultDir(DirNames dir, int IDtoReplace, bool showSuccessMessage = true) { string path = RomInfo.gameDirs[dir].unpackedDir + "\\" + IDtoReplace.ToString("D4"); - this.SaveToFile(path, showSuccessMessage); + return this.SaveToFile(path, showSuccessMessage); } protected internal void SaveToFileExplorePath(string fileType, string fileExtension, string suggestedFileName, bool showSuccessMessage = true) { fileExtension = "*." + fileExtension; diff --git a/DS_Map/ROMFiles/ScriptFile.cs b/DS_Map/ROMFiles/ScriptFile.cs index b26861f..e425306 100644 --- a/DS_Map/ROMFiles/ScriptFile.cs +++ b/DS_Map/ROMFiles/ScriptFile.cs @@ -700,6 +700,12 @@ namespace DSPRE.ROMFiles { AddReference(ref refList, (ushort)currentCmd.id, parameterList, (int)writer.BaseStream.Position, currentFunction); } } else { + int functionUsescript = currentFunction.usedScript - 1; + if (functionUsescript >= scriptOffsets.Count) { + MessageBox.Show($"Function #{currentFunction.manualUserID} refers to Script {currentFunction.usedScript}, which does not exist.\n" + + $"This Script File can't be saved.", "Can't resolve UseScript reference", MessageBoxButtons.OK, MessageBoxIcon.Error); + return null; + } functionOffsets.Add(new ContainerReference() { ID = currentFunction.manualUserID, offsetInFile = scriptOffsets[currentFunction.usedScript - 1].offsetInFile @@ -749,9 +755,9 @@ namespace DSPRE.ROMFiles { if (refList[i].typeOfInvoked is containerTypes.Action) { //isApplyMovement result = actionOffsets.Find(entry => entry.ID == refList[i].invokedID); - if (result.Equals((0, 0))) + if (result.Equals(default(ContainerReference))) { undeclaredActions.Add(refList[i].invokedID); - else { + } else { int relativeOffset = (int)(result.offsetInFile - refList[i].invokedAt - 4); writer.Write(relativeOffset); unreferencedActions.Remove(refList[i].invokedID); @@ -759,9 +765,9 @@ namespace DSPRE.ROMFiles { } else { result = functionOffsets.Find(entry => entry.ID == refList[i].invokedID); - if (result.Equals((0, 0))) + if (result.Equals(default(ContainerReference))) { undeclaredFuncs.Add(refList[i].invokedID); - else { + } else { int relativeOffset = (int)(result.offsetInFile - refList[i].invokedAt - 4); writer.Write(relativeOffset); @@ -871,8 +877,8 @@ namespace DSPRE.ROMFiles { return false; } - public void SaveToFileDefaultDir(int IDtoReplace, bool showSuccessMessage = true) { - SaveToFileDefaultDir(DirNames.scripts, IDtoReplace, showSuccessMessage); + public bool SaveToFileDefaultDir(int IDtoReplace, bool showSuccessMessage = true) { + return SaveToFileDefaultDir(DirNames.scripts, IDtoReplace, showSuccessMessage); } public void SaveToFileExplorePath(string suggestedFileName, bool blindmode) { SaveFileDialog sf = new SaveFileDialog {