public FilesystemEditorForm(MainForm main) { this.InitializeComponent(); this.Text = "Josh65536's File System Editor"; Icon = main.Icon; this.m_ROM = Program.m_ROM; ROMFileSelect.LoadFileList(this.tvFiles); this.DialogResult = DialogResult.Ignore; if (this.m_ROM.StartFilesystemEdit()) { return; } this.Close(); }
private void LoadROM(string filename) { if (!File.Exists(filename)) { MessageBox.Show("The specified file doesn't exist.", Program.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (Program.m_ROMPath != "") { while (Program.m_LevelEditors.Count > 0) { Program.m_LevelEditors[0].Close(); } lbxLevels.Items.Clear(); Program.m_ROM.EndRW(); } Program.m_ROMPath = filename; try { Program.m_ROM = new NitroROM(Program.m_ROMPath); } catch (Exception ex) { string msg; if (ex is IOException) { msg = "The ROM couldn't be opened. Close any program that may be using it and try again."; } else { msg = "The following error occured while loading the ROM:\n" + ex.Message; } MessageBox.Show(msg, Program.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); if (Program.m_ROM != null) { Program.m_ROM.EndRW(); } Program.m_ROMPath = ""; return; } Program.m_ROM.BeginRW(); if (Program.m_ROM.NeedsPatch()) { DialogResult res = MessageBox.Show( "This ROM needs to be patched before the editor can work with it.\n\n" + "Do you want to first make a backup of it in case the patching\n" + "operation goes wrong somehow?", Program.AppTitle, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (res == DialogResult.Yes) { sfdSaveFile.FileName = Program.m_ROMPath.Substring(0, Program.m_ROMPath.Length - 4) + "_bak.nds"; if (sfdSaveFile.ShowDialog(this) == DialogResult.OK) { Program.m_ROM.EndRW(); File.Copy(Program.m_ROMPath, sfdSaveFile.FileName, true); } } else if (res == DialogResult.Cancel) { Program.m_ROM.EndRW(); Program.m_ROMPath = ""; return; } // switch to buffered RW mode (faster for patching) Program.m_ROM.EndRW(); Program.m_ROM.BeginRW(true); try { Program.m_ROM.Patch(); } catch (Exception ex) { MessageBox.Show( "An error occured while patching your ROM.\n" + "No changes have been made to your ROM.\n" + "Try using a different ROM. If the error persists, report it to Mega-Mario, with the details below:\n\n" + ex.Message + "\n" + ex.StackTrace, Program.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); Console.WriteLine(ex.StackTrace); Program.m_ROM.EndRW(false); Program.m_ROMPath = ""; return; } } Program.m_ROM.LoadTables(); Program.m_ROM.EndRW(); // Program.m_ShaderCache = new ShaderCache(); lbxLevels.Items.AddRange(Strings.LevelNames); this.tvFileList.Nodes.Clear(); ROMFileSelect.LoadFileList(this.tvFileList); this.tvARM9Overlays.Nodes.Clear(); ROMFileSelect.LoadOverlayList(this.tvARM9Overlays); btnASMHacking.Enabled = true; btnTools.Enabled = true; btnMore.Enabled = true; }
private void importPatchToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog o = new OpenFileDialog(); o.Filter = "SM64DSe Patch|*.sp"; o.RestoreDirectory = true; if (o.ShowDialog() == DialogResult.OK) { //Each line. var s = File.ReadAllLines(o.FileName); string basePath = Path.GetDirectoryName(o.FileName) + "/"; foreach (var l in s) { //Get parameters. string t = l; if (t.Contains("#")) { t = t.Substring(0, t.IndexOf('#')); } var p = t.Split(' '); if (p.Length == 0) { continue; } //Switch command. switch (p[0].ToLower()) { //Replace file. case "replace": if (ushort.TryParse(p[1], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out _)) { Program.m_ROM.ReinsertFile(Program.m_ROM.GetFileIDFromInternalID(ushort.Parse(p[1], NumberStyles.HexNumber, CultureInfo.CurrentCulture)), File.ReadAllBytes(basePath + p[2])); } else { Program.m_ROM.ReinsertFile(Program.m_ROM.GetFileIDFromName(p[1]), File.ReadAllBytes(basePath + p[2])); } break; //Replace ARM9. case "replace_arm9": var r = Program.m_ROM; r.BeginRW(true); uint arm9addr = r.Read32(0x20); uint arm9size = r.Read32(0x2C); byte[] newArm9 = File.ReadAllBytes(basePath + p[1]); if (newArm9.Length > arm9size) { r.MakeRoom(arm9addr + arm9size, (uint)(newArm9.Length - arm9size)); r.AutoFix(0xFFFF, arm9addr + arm9size, (int)(newArm9.Length - arm9size)); } r.Write32(0x2C, (uint)newArm9.Length); r.WriteBlock(arm9addr, newArm9); r.EndRW(true); r.LoadROM(r.m_Path); break; //Replace overlay. case "replace_overlay": NitroOverlay n2 = new NitroOverlay(Program.m_ROM, uint.Parse(p[1])); n2.m_Data = File.ReadAllBytes(basePath + p[2]); n2.SaveChanges(); break; //Rename file. case "rename": if (Program.m_ROM.m_Version != NitroROM.Version.EUR) { MessageBox.Show("This is for EUR ROMs only!"); continue; } Program.m_ROM.StartFilesystemEdit(); ushort fileIdFromName; if (ushort.TryParse(p[1], NumberStyles.HexNumber, CultureInfo.CurrentCulture, out _)) { fileIdFromName = Program.m_ROM.GetFileIDFromInternalID(ushort.Parse(p[1], NumberStyles.HexNumber, CultureInfo.CurrentCulture)); } else { fileIdFromName = Program.m_ROM.GetFileIDFromName(p[1]); } string filename = Program.m_ROM.m_FileEntries[fileIdFromName].FullName; string newName = p[2]; int length = filename.LastIndexOf('/') + 1; string str1 = filename.Substring(0, length) + newName; Program.m_ROM.m_FileEntries[fileIdFromName].Name = newName; Program.m_ROM.m_FileEntries[fileIdFromName].FullName = str1; Program.m_ROM.SaveFilesystem(); this.tvFileList.Nodes.Clear(); ROMFileSelect.LoadFileList(this.tvFileList); this.tvARM9Overlays.Nodes.Clear(); ROMFileSelect.LoadOverlayList(this.tvARM9Overlays); break; //Import level XML. case "import_xml": Level lv = new Level(int.Parse(p[1])); try { LevelDataXML_Importer.ImportLevel(lv, basePath + p[2], true); } catch (InvalidDataException ex) { MessageBox.Show(ex.Message); } catch (Exception ex) { new ExceptionMessageBox("Error parsing level, changes have not been saved", ex).ShowDialog(); } Program.m_ROM.LoadROM(Program.m_ROM.m_Path); break; //Add overlay. case "add_overlay": if (Program.m_ROM.m_Version != NitroROM.Version.EUR) { MessageBox.Show("This is for EUR ROMs only!"); continue; } OverlayEditor oe = new OverlayEditor(); oe.AddOverlay(oe.Overlays.Count); var ov = oe.Overlays[oe.Overlays.Count - 1]; var overlayFile = File.ReadAllBytes(basePath + p[6]); ov.ID = (uint)(oe.Overlays.Count - 1); ov.RAMAddress = uint.Parse(p[1], NumberStyles.HexNumber, CultureInfo.CurrentCulture); ov.RAMSize = (uint)overlayFile.Length; ov.BSSSize = uint.Parse(p[4], NumberStyles.HexNumber, CultureInfo.CurrentCulture); ov.StaticInitStart = uint.Parse(p[2], NumberStyles.HexNumber, CultureInfo.CurrentCulture); ov.StaticInitEnd = uint.Parse(p[3], NumberStyles.HexNumber, CultureInfo.CurrentCulture); ov.Flags = uint.Parse(p[5], NumberStyles.HexNumber, CultureInfo.CurrentCulture); oe.Overlays[oe.Overlays.Count - 1] = ov; oe.saveChangesButton_Click(null, new EventArgs()); oe.closeButton_Click(null, new EventArgs()); NitroOverlay n = new NitroOverlay(Program.m_ROM, (uint)(oe.Overlays.Count - 1)); n.m_Data = overlayFile; n.SaveChanges(); this.tvFileList.Nodes.Clear(); ROMFileSelect.LoadFileList(this.tvFileList); this.tvARM9Overlays.Nodes.Clear(); ROMFileSelect.LoadOverlayList(this.tvARM9Overlays); break; //Edit overlay. case "edit_overlay": if (Program.m_ROM.m_Version != NitroROM.Version.EUR) { MessageBox.Show("This is for EUR ROMs only!"); continue; } Program.m_ROM.StartFilesystemEdit(); var ov2 = Program.m_ROM.m_OverlayEntries[int.Parse(p[1])]; ov2.RAMAddress = uint.Parse(p[2], NumberStyles.HexNumber, CultureInfo.CurrentCulture); ov2.BSSSize = uint.Parse(p[5], NumberStyles.HexNumber, CultureInfo.CurrentCulture); ov2.StaticInitStart = uint.Parse(p[3], NumberStyles.HexNumber, CultureInfo.CurrentCulture); ov2.StaticInitEnd = uint.Parse(p[4], NumberStyles.HexNumber, CultureInfo.CurrentCulture); ov2.Flags = uint.Parse(p[6], NumberStyles.HexNumber, CultureInfo.CurrentCulture); Program.m_ROM.m_OverlayEntries[int.Parse(p[1])] = ov2; Program.m_ROM.SaveFilesystem(); break; //Delete overlay. case "delete_overlay": if (Program.m_ROM.m_Version != NitroROM.Version.EUR) { MessageBox.Show("This is for EUR ROMs only!"); continue; } OverlayEditor oe2 = new OverlayEditor(); oe2.DeleteOverlay(int.Parse(p[1])); oe2.saveChangesButton_Click(null, new EventArgs()); oe2.closeButton_Click(null, new EventArgs()); break; } } } }