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();
 }
Пример #2
0
        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;
        }
Пример #3
0
        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;
                    }
                }
            }
        }