예제 #1
0
        private void compressBtn_Click(object sender, EventArgs e)
        {
            if (openZIPDialog.ShowDialog() == DialogResult.OK)
            {
                YAZ0         y       = new YAZ0();
                NARC         SzsArch = new NARC();
                SFSDirectory dir     = new SFSDirectory("", true);
                using (ZipFile z = ZipFile.Read(openZIPDialog.FileName)) {
                    for (int i = 0; i < z.Entries.Count; i++)
                    {
                        ZipEntry ze   = z.Entries.ToArray()[i];
                        SFSFile  file = new SFSFile(i, ze.FileName, dir);

                        MemoryStream data = new MemoryStream();
                        ze.Extract(data);
                        file.Data = data.ToArray();
                        data.Dispose();

                        dir.Files.Add(file);
                    }
                    foreach (ZipEntry ze in z)
                    {
                        Console.WriteLine(ze);
                    }
                }
                SzsArch.FromFileSystem(dir);
                if (saveSZSDialog.ShowDialog() == DialogResult.OK)
                {
                    File.WriteAllBytes(saveSZSDialog.FileName, y.Compress(SzsArch.Write()));
                    MessageBox.Show("Done!");
                }
            }
        }
예제 #2
0
 private void decompressBtn_Click(object sender, EventArgs e)
 {
     if (openSZSDialog.ShowDialog() == DialogResult.OK)
     {
         string of = openSZSDialog.FileName;
         if (IsYaz0(of))
         {
             if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
             {
                 string ep = folderBrowserDialog1.SelectedPath;
                 YAZ0   y  = new YAZ0();
                 NARC   f  = new NARC(y.Decompress(File.ReadAllBytes(of)));
                 foreach (SFSFile file in f.ToFileSystem().Files)
                 {
                     Console.WriteLine(file.FileName);
                     File.WriteAllBytes(ep + "\\" + file.FileName, file.Data);
                 }
                 MessageBox.Show("Done!");
             }
         }
         else
         {
             MessageBox.Show("The SZS file is not compressed with Yaz0.");
         }
     }
 }
예제 #3
0
        public void Save()
        {
            NARC.FromFileSystem(Fs);
            var dec_data = NARC.Write();
            var data     = NSMBeROM.LZ77_Compress(dec_data);

            ROMUtils.ROM.WriteFile(Name, data);
        }
예제 #4
0
 public MKDSEditor(
     NARC.DirectoryEntry Root1,
     NARC.DirectoryEntry Root2,
     NARC.DirectoryEntry RomRoot)
 {
     this.Root1    = Root1;
     this.Root2    = Root2;
     this.RomRoot  = RomRoot;
     this.nkm      = new MKDS_Course_Modifier.MKDS.NKM(Root1.GetFileByPath("\\course_map.nkm").Content);
     this.Main     = NARC.Unpack(Compression.LZ77Decompress(RomRoot.GetFileByPath("\\data\\Main\\MapObj.carc").Content));
     this.MainRace = NARC.Unpack(Compression.LZ77Decompress(RomRoot.GetFileByPath("\\data\\MainRace.carc").Content));
     this.nsbmd    = new MKDS_Course_Modifier.G3D_Binary_File_Format.NSBMD(Root1.GetFileByPath("\\course_model.nsbmd").Content);
     if (this.nsbmd.TexPlttSet == null)
     {
         try
         {
             this.nsbmd.TexPlttSet = new MKDS_Course_Modifier.G3D_Binary_File_Format.NSBTX(Root2.GetFileByPath("\\course_model.nsbtx").Content).TexPlttSet;
         }
         catch
         {
         }
     }
     if (Root1.GetFileByPath("\\course_model_V.nsbmd") != null)
     {
         this.nsbmd2 = new MKDS_Course_Modifier.G3D_Binary_File_Format.NSBMD(Root1.GetFileByPath("\\course_model_V.nsbmd").Content);
         if (this.nsbmd2.TexPlttSet == null)
         {
             this.nsbmd2.TexPlttSet = new MKDS_Course_Modifier.G3D_Binary_File_Format.NSBTX(Root2.GetFileByPath("\\course_model_V.nsbtx").Content).TexPlttSet;
         }
     }
     this.InitializeComponent();
     if (Root1.GetDirectoryByPath("\\MissionRun") != null)
     {
         foreach (NARC.FileEntry file in Root1.GetDirectoryByPath("\\MissionRun").Files)
         {
             this.toolStripSplitButton1.DropDownItems.Add(file.Name, (Image)null, new EventHandler(this.NKMClick));
         }
     }
     this.simpleOpenGlControl1.MouseWheel += new MouseEventHandler(this.simpleOpenGlControl1_MouseWheel);
 }
예제 #5
0
        /// <summary>
        /// Process data in an input file that contains a layout.
        /// </summary>
        /// <param name="filename"></param>
        bool ProcessData(string filename, byte[] inData)
        {
            EndianBinaryReader reader = null;

            // now we need to decide what they just opened
            if (inData == null && filename != "")
            {
                reader = new EndianBinaryReader(File.Open(filename, FileMode.Open), Encoding.GetEncoding(932));
            }
            else
            {
                reader = new EndianBinaryReader(inData);
            }

            string magic = "";

            // we have a Yaz0 compressed file
            if (reader.ReadStringFrom(0, 4) == "Yaz0")
            {
                // we have to close our reader so we can properly read this file as a Yaz0 stream
                reader.Close();

                MemoryStream ms = null;

                if (inData == null)
                {
                    ms = new Yaz0(File.Open(filename, FileMode.Open));
                }
                else
                {
                    ms = new Yaz0(new MemoryStream(inData));
                }

                reader = new EndianBinaryReader(ms);
                magic  = reader.ReadStringFrom(0, 4);
            }
            // we have a LZ compressed file
            else if (reader.ReadByteFrom(0) == 0x11)
            {
                LZ77   lzFile = new LZ77(ref reader);
                byte[] lzData = lzFile.getData();
                // close our current reader to open a new one with our input data
                reader.Close();
                reader = new EndianBinaryReader(lzData);
                magic  = reader.ReadStringFrom(0, 4);
            }
            // no compression
            else
            {
                // it is not yaz0 compressed, so we see the magic
                magic = reader.ReadStringFrom(0, 4);
            }

            // now we have to check our magic to see what kind of file it is
            switch (magic)
            {
            case "darc":
                mArchive = new DARC(ref reader);
                break;

            case "NARC":
                mArchive = new NARC(ref reader);
                break;

            case "SARC":
                mArchive = new SARC(ref reader);
                break;

            case "RARC":
                reader.SetEndianess(Endianess.Big);
                mArchive = new RARC(ref reader);
                break;

            case "U?8-":
                reader.SetEndianess(Endianess.Big);
                mArchive = new U8(ref reader);
                break;

            default:
                MessageBox.Show("Error. Unsupported format with magic: " + magic);
                break;
            }

            string layoutType = "";

            // some files have their string table nullified, which makes the names obfuscated
            // I've only seen this in SARCs from MK7, but there's probably more
            if (mArchive != null)
            {
                if (mArchive.isStringTableObfuscated())
                {
                    MessageBox.Show("This file has obfuscated file names. The editor attempted to find layout files, but cannot supply names.");
                }
            }

            reader.Close();

            if (mArchive == null)
            {
                MessageBox.Show("Format not supported.");
                return(false);
            }

            // the only familiar format with archives in archives is SARC and RARC
            if (mArchive.getType() == ArchiveType.SARC || mArchive.getType() == ArchiveType.RARC)
            {
                List <string> names = mArchive.getArchiveFileNames();

                if (names.Count != 0)
                {
                    DialogResult res = MessageBox.Show("This archive has another archive inside of it.\nDo you wish to choose one of the found archives to select a layout?", "Internal Archive", MessageBoxButtons.YesNo);

                    if (res == DialogResult.Yes)
                    {
                        LayoutChooser archiveChooser = new LayoutChooser();
                        archiveChooser.insertEntries(names);
                        archiveChooser.ShowDialog();

                        // if this worked, we dont need to do anything
                        bool result = ProcessData(archiveChooser.getSelectedFile(), mArchive.getDataByName(archiveChooser.getSelectedFile()));

                        if (result)
                        {
                            return(true);
                        }
                        else
                        {
                            MessageBox.Show("Failed to get the internal file.");
                            return(false);
                        }
                    }
                }
            }

            // get all of our needed files
            mLayoutFiles     = mArchive.getLayoutFiles();
            mLayoutAnimFiles = mArchive.getLayoutAnimations();
            mLayoutImages    = mArchive.getLayoutImages();
            mLayoutControls  = mArchive.getLayoutControls();

            if (mLayoutFiles.Count == 0)
            {
                MessageBox.Show("This file contains no layouts.");
                return(false);
            }

            LayoutChooser layoutChooser = new LayoutChooser();

            layoutChooser.insertEntries(new List <string>(mLayoutFiles.Keys));
            layoutChooser.ShowDialog();

            string selectedFile = layoutChooser.getSelectedFile();

            if (selectedFile == null)
            {
                return(false);
            }

            string[] sections = selectedFile.Split('/');
            mMainRoot = "";

            // remove "lyt" part and the file name
            // this will be our main root of the entire opened file
            for (int i = 0; i < sections.Length - 2; i++)
            {
                mMainRoot += sections[i] + "/";
            }

            if (layoutType == "")
            {
                layoutType = Path.GetExtension(selectedFile);
            }

            // now we have to init a layout reader
            EndianBinaryReader layoutReader = null;

            byte[] data;

            switch (layoutType)
            {
            case ".brlyt":
                data         = mLayoutFiles[selectedFile];
                layoutReader = new EndianBinaryReader(data);
                mMainLayout  = new BRLYT(ref layoutReader);
                layoutReader.Close();
                break;

            case ".bclyt":
                data         = mLayoutFiles[selectedFile];
                layoutReader = new EndianBinaryReader(data);
                mMainLayout  = new BCLYT(ref layoutReader);
                break;

            case ".bflyt":
                data         = mLayoutFiles[selectedFile];
                layoutReader = new EndianBinaryReader(data);
                mMainLayout  = new BFLYT(ref layoutReader);
                break;

            case ".blo":
                data         = mLayoutFiles[selectedFile];
                layoutReader = new EndianBinaryReader(data);

                if (layoutReader.ReadStringFrom(4, 4) == "blo1")
                {
                    mMainLayout = new BLO1(ref layoutReader);
                }
                else
                {
                    mMainLayout = new BLO2(ref layoutReader);
                }
                break;

            default:
                MessageBox.Show("This format is not supported yet.");
                break;
            }

            layoutReader.Close();

            if (mMainLayout == null)
            {
                return(false);
            }

            // set our propertygrid with our LYT object
            mainPropertyGrid.SelectedObject = mMainLayout.getLayoutParams();

            if (mMainLayout.getRootPanel() == null)
            {
                MessageBox.Show("Error, the root pane in this layout is not specified.");
                return(false);
            }

            LayoutBase pane  = null;
            LayoutBase group = null;

            // now we have to grab our root panel, which is different on each console
            // so we have to specifically get the one we want
            // the same applies to our root group
            pane = mMainLayout.getRootPanel();

            // this should be RootPane
            TreeNode n1 = new TreeNode
            {
                Tag  = pane,
                Name = pane.mName,
                Text = pane.mName,
            };

            panelList.Nodes.Add(n1);
            fillNodes(pane.getChildren());

            // now for our groups
            group = mMainLayout.getRootGroup();

            if (group != null)
            {
                TreeNode n1_1 = new TreeNode
                {
                    Tag  = group,
                    Name = group.mName,
                    Text = group.mName,
                };

                panelList.Nodes.Add(n1_1);
                fillNodes(group.getChildren());
            }

            // now for textures and fonts
            // but it is possible for either one to not exist
            if (mMainLayout.containsTextures())
            {
                foreach (string str in mMainLayout.getTextureNames())
                {
                    texturesList.Items.Add(str);
                }
            }

            if (mMainLayout.containsFonts())
            {
                foreach (string str in mMainLayout.getFontNames())
                {
                    fontsList.Items.Add(str);
                }
            }

            // and our materials
            if (mMainLayout.containsMaterials())
            {
                foreach (string str in mMainLayout.getMaterialNames())
                {
                    materialList.Items.Add(str);
                }
            }

            // this draws the border of the layout
            mMainLayout.draw();

            layoutViewer.Refresh();

            return(true);
        }
예제 #6
0
 public NARCViewer(NARC Archive)
 {
     this.Archive = Archive;
     Root = Archive.ToFileSystem();
     InitializeComponent();
 }
예제 #7
0
 private void listView1_ItemActivate(object sender, EventArgs e)
 {
     int num = (int)new MKDSEditor(NARC.Unpack(Compression.LZ77Decompress(this.Rom.Root.GetFileByPath("\\data\\Course\\" + this.listView1.SelectedItems[0].Text + ".carc").Content)), NARC.Unpack(Compression.LZ77Decompress(this.Rom.Root.GetFileByPath("\\data\\Course\\" + this.listView1.SelectedItems[0].Text + "Tex.carc").Content)), this.Rom.Root).ShowDialog();
 }
예제 #8
0
 public NARCViewer(NARC Archive)
 {
     this.Archive = Archive;
     Root         = Archive.ToFileSystem();
     InitializeComponent();
 }
예제 #9
0
        private static bool Open(ByteFileInfo file, Form1 Owner, object Parameter = null, bool filedialog = false)
        {
            switch (FileHandler.GetType(file))
            {
            case "NARC":
                NARC.DirectoryEntry Root = NARC.Unpack(file.Data);
                if (FileHandler.OpenedArchives.Count != 0 && !FileHandler.OpenedArchives[0].FileName.EndsWith(".nds"))
                {
                    FileHandler.OpenedArchives.RemoveAt(FileHandler.OpenedArchives.Count - 1);
                }
                Owner.OpenNarc(Root);
                return(true);

            case "NCGR":
                NCGR Graphic = new NCGR(file.Data);
                switch (FileHandler.OpenDialog)
                {
                case MKDS_Course_Modifier.UI.BNCL _:
                    ((MKDS_Course_Modifier.UI.BNCL)FileHandler.OpenDialog).SetNCGR(Graphic);
                    break;

                case MKDS_Course_Modifier.UI.NCER _:
                    ((MKDS_Course_Modifier.UI.NCER)FileHandler.OpenDialog).SetNCGR(Graphic, FileHandler.OpenedFiles.Count);
                    return(true);
                }
                return(false);

            case "NCLR":
                MKDS_Course_Modifier.G2D_Binary_File_Format.NCLR nclr = new MKDS_Course_Modifier.G2D_Binary_File_Format.NCLR(file.Data);
                switch (FileHandler.OpenDialog)
                {
                case null:
                    FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.NCLR(nclr);
                    FileHandler.OpenDialog.Show((IWin32Window)Owner);
                    FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                    return(true);

                case MKDS_Course_Modifier.UI.BNCL _:
                    ((MKDS_Course_Modifier.UI.BNCL)FileHandler.OpenDialog).SetNCLR(nclr);
                    break;

                case MKDS_Course_Modifier.UI.NCER _:
                    ((MKDS_Course_Modifier.UI.NCER)FileHandler.OpenDialog).SetNCLR(nclr);
                    break;
                }
                return(false);

            case "NSCR":
                MKDS_Course_Modifier.G2D_Binary_File_Format.NSCR nscr = new MKDS_Course_Modifier.G2D_Binary_File_Format.NSCR(file.Data);
                return(false);

            case "NSBMD":
                MKDS_Course_Modifier.G3D_Binary_File_Format.NSBMD nsbmd = new MKDS_Course_Modifier.G3D_Binary_File_Format.NSBMD(file.Data);
                if (FileHandler.OpenDialog is MKDS_Course_Modifier.UI.NSBMD)
                {
                    FileHandler.OpenedFiles.RemoveAt(FileHandler.OpenedFiles.Count - 1);
                    ((MKDS_Course_Modifier.UI.NSBMD)FileHandler.OpenDialog).SetNSBMD(nsbmd);
                    return(true);
                }
                if (FileHandler.OpenDialog != null)
                {
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.NSBMD(nsbmd);
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            case "NSBTX":
                MKDS_Course_Modifier.G3D_Binary_File_Format.NSBTX Btx = new MKDS_Course_Modifier.G3D_Binary_File_Format.NSBTX(file.Data);
                if (FileHandler.OpenDialog is MKDS_Course_Modifier.UI.NSBMD)
                {
                    ((MKDS_Course_Modifier.UI.NSBMD)FileHandler.OpenDialog).SetNSBTX(Btx);
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.NSBTX(Btx);
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            case "NSBCA":
                NSBCA Bca1 = new NSBCA(file.Data);
                if (!(FileHandler.OpenDialog is MKDS_Course_Modifier.UI.NSBMD))
                {
                    return(false);
                }
                ((MKDS_Course_Modifier.UI.NSBMD)FileHandler.OpenDialog).SetNSBCA(Bca1);
                return(false);

            case "NSBTA":
                MKDS_Course_Modifier.G3D_Binary_File_Format.NSBTA nsbta = new MKDS_Course_Modifier.G3D_Binary_File_Format.NSBTA(file.Data);
                int num = (int)MessageBox.Show("Due to problems with texture matrices, is nsbta temporary disabled.");
                return(false);

            case "NSBMA":
                NSBMA Bma = new NSBMA(file.Data);
                if (!(FileHandler.OpenDialog is MKDS_Course_Modifier.UI.NSBMD))
                {
                    return(false);
                }
                ((MKDS_Course_Modifier.UI.NSBMD)FileHandler.OpenDialog).SetNSBMA(Bma);
                return(false);

            case "NSBVA":
                NSBVA Bva = new NSBVA(file.Data);
                if (!(FileHandler.OpenDialog is MKDS_Course_Modifier.UI.NSBMD))
                {
                    return(false);
                }
                ((MKDS_Course_Modifier.UI.NSBMD)FileHandler.OpenDialog).SetNSBVA(Bva);
                return(false);

            case "NSBTP":
                NSBTP Btp = new NSBTP(file.Data);
                if (!(FileHandler.OpenDialog is MKDS_Course_Modifier.UI.NSBMD))
                {
                    return(false);
                }
                ((MKDS_Course_Modifier.UI.NSBMD)FileHandler.OpenDialog).SetNSBTP(Btp);
                return(false);

            case "KCL":
                KCL KCL = new KCL(file.Data);
                if (FileHandler.OpenDialog is MKDS_Course_Modifier.UI.MKDS.NKM)
                {
                    ((MKDS_Course_Modifier.UI.MKDS.NKM)FileHandler.OpenDialog).SetKCL(KCL);
                }
                return(false);

            case "MR":
                MKDS_Course_Modifier.MKDS.MR Mission = new MKDS_Course_Modifier.MKDS.MR(file.Data);
                if (FileHandler.OpenDialog != null)
                {
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.MKDS.MR(Mission);
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            case "NKM":
                MKDS_Course_Modifier.MKDS.NKM File1 = new MKDS_Course_Modifier.MKDS.NKM(file.Data);
                if (FileHandler.OpenDialog != null)
                {
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.MKDS.NKM(File1);
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            case "NCG.BIN":
                return(false);

            case "NCL.BIN":
                return(false);

            case "NSC.BIN":
                return(false);

            case "SPA":
                MKDS_Course_Modifier.Particles.SPA Spa = new MKDS_Course_Modifier.Particles.SPA(file.Data);
                if (FileHandler.OpenDialog != null)
                {
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.SPA(Spa);
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            case "SSEQ":
                MKDS_Course_Modifier.Sound.SSEQ file1 = new MKDS_Course_Modifier.Sound.SSEQ(file.Data);
                if (FileHandler.OpenDialog != null)
                {
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.SSEQ(file1, FileHandler.m);
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            case "SBNK":
                SBNK k = new SBNK(file.Data);
                if (FileHandler.OpenDialog != null && FileHandler.OpenDialog is MKDS_Course_Modifier.UI.SSEQ)
                {
                    SBNK s = SBNK.InitDLS(k, (SWAR[])Parameter);
                    ((MKDS_Course_Modifier.UI.SSEQ)FileHandler.OpenDialog).SetDLS(SBNK.ToDLS(s));
                }
                return(false);

            case "SDAT":
                SDAT SDAT = new SDAT(file.Data);
                Owner.OpenSDAT(SDAT);
                return(true);

            case "SSAR":
                MKDS_Course_Modifier.Sound.SSEQ file2 = new MKDS_Course_Modifier.Sound.SSEQ(file.Data, (int)Parameter);
                if (FileHandler.OpenDialog != null)
                {
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.SSEQ(file2, FileHandler.m);
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            case "NDS":
                NDS Rom = new NDS(file.Data);
                FileHandler.OpenedArchives.Clear();
                Owner.OpenNDS(Rom);
                return(true);

            case "NCER":
                MKDS_Course_Modifier.G2D_Binary_File_Format.NCER Cell = new MKDS_Course_Modifier.G2D_Binary_File_Format.NCER(file.Data);
                if (FileHandler.OpenDialog == null)
                {
                    FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.NCER(Cell);
                    FileHandler.OpenDialog.Show((IWin32Window)Owner);
                    FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                    return(true);
                }
                if (FileHandler.OpenDialog is MKDS_Course_Modifier.UI.BNCL)
                {
                    ((MKDS_Course_Modifier.UI.BNCL)FileHandler.OpenDialog).SetNCER(Cell);
                }
                return(false);

            case "BMG":
                MKDS_Course_Modifier.Misc.BMG File2 = new MKDS_Course_Modifier.Misc.BMG(file.Data);
                if (FileHandler.OpenDialog != null)
                {
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.BMG(File2);
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            case "SM64BMD":
                MKDS_Course_Modifier.SM64DS.BMD bmd = new MKDS_Course_Modifier.SM64DS.BMD(file.Data);
                if (FileHandler.OpenDialog is MKDS_Course_Modifier.UI.BMD)
                {
                    ((MKDS_Course_Modifier.UI.BMD)FileHandler.OpenDialog).SetBMD(bmd);
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.BMD(bmd);
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            case "SM64BCA":
                MKDS_Course_Modifier.SM64DS.BCA Bca2 = new MKDS_Course_Modifier.SM64DS.BCA(file.Data);
                if (!(FileHandler.OpenDialog is MKDS_Course_Modifier.UI.BMD))
                {
                    return(false);
                }
                ((MKDS_Course_Modifier.UI.BMD)FileHandler.OpenDialog).SetBCA(Bca2);
                return(true);

            case "BNCL":
                MKDS_Course_Modifier.Misc.BNCL Bncl = new MKDS_Course_Modifier.Misc.BNCL(file.Data);
                if (FileHandler.OpenDialog != null)
                {
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.BNCL(Bncl);
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            case "GCNBMD":
                MKDS_Course_Modifier.GCN.BMD file3 = new MKDS_Course_Modifier.GCN.BMD(file.Data);
                if (FileHandler.OpenDialog != null)
                {
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new J3D1(file3);
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            case "HBDF":
                HBDF hbdf = new HBDF(file.Data);
                if (hbdf.MDLFBlocks.Length > 0)
                {
                    if (FileHandler.OpenDialog is MDLF)
                    {
                        ((MDLF)FileHandler.OpenDialog).SetHBDF(hbdf);
                    }
                    else
                    {
                        FileHandler.OpenDialog = (Form) new MDLF(hbdf);
                        FileHandler.OpenDialog.Show((IWin32Window)Owner);
                        FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                        return(true);
                    }
                }
                return(false);

            case "GCNBOL":
                BOL bol = new BOL(file.Data);
                return(false);

            case "PAZ":
                PAZ Arc = new PAZ(file.Data);
                Owner.OpenPAZ(Arc);
                return(true);

            case "TEX":
                TEX tex = new TEX(file.Data);
                return(false);

            case "GRPCONF":
                Grpconf grpconf = new Grpconf(file.Data);
                return(false);

            case "OBJ":
                MKDS_Course_Modifier._3D_Formats.OBJ obj = new MKDS_Course_Modifier._3D_Formats.OBJ(file.Path);
                if (FileHandler.OpenDialog != null)
                {
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.OBJ(obj, obj.MLTName == null ? (MLT)null : new MLT(obj.MLTName));
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            case "GCNBLO":
                MKDS_Course_Modifier.GCN.BLO Layout = new MKDS_Course_Modifier.GCN.BLO(file.Data, file.Path);
                if (FileHandler.OpenDialog != null)
                {
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.BLO(Layout);
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            case "3DSCGFX":
                MKDS_Course_Modifier._3DS.CGFX cgfx = new MKDS_Course_Modifier._3DS.CGFX(file.Data);
                if (FileHandler.OpenDialog != null)
                {
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.CGFX(cgfx);
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            case "FMVVideo":
                MKDS_Course_Modifier.Misc.FMV Video = new MKDS_Course_Modifier.Misc.FMV(file.Data);
                if (FileHandler.OpenDialog != null)
                {
                    return(false);
                }
                FileHandler.OpenDialog = (Form) new MKDS_Course_Modifier.UI.FMV(Video);
                FileHandler.OpenDialog.Show((IWin32Window)Owner);
                FileHandler.OpenDialog.FormClosed += new FormClosedEventHandler(FileHandler.OpenDialog_FormClosed);
                return(true);

            default:
                return(false);
            }
        }
예제 #10
0
        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = (BackgroundWorker)sender;

            worker.ReportProgress(0, new Tuple <int, string, int, int>(0, "Reading System Files", 0, 0));

            string fsPath = path + "\\" + "File System";

            try
            {
                Directory.CreateDirectory(fsPath);
            }
            catch (Exception exception)
            {
                DialogResult dialog = CustomMessageBox.Show(
                    exception.Message,
                    exception.GetType().ToString(),
                    400,
                    new List <string>(),
                    new List <DialogResult>());

                return;
            }

            if (worker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }

            File.Copy(file, path + "\\" + "[" + code + "] " + title + ".nds");

            using (MemoryStream romStream = new MemoryStream(File.ReadAllBytes(file)))
            {
                using (BinaryReader romReader = new BinaryReader(romStream))
                {
                    romReader.BaseStream.Position = 32;
                    int arm9Offset = Convert.ToInt32(romReader.ReadUInt32());
                    romReader.BaseStream.Position = 44;
                    int arm9Length = Convert.ToInt32(romReader.ReadUInt32());
                    int arm7Offset = Convert.ToInt32(romReader.ReadUInt32());
                    romReader.BaseStream.Position = 60;
                    int arm7Length = Convert.ToInt32(romReader.ReadUInt32());
                    int fntOffset  = Convert.ToInt32(romReader.ReadUInt32());
                    int fntLength  = Convert.ToInt32(romReader.ReadUInt32());
                    int fatOffset  = Convert.ToInt32(romReader.ReadUInt32());
                    int fatLength  = Convert.ToInt32(romReader.ReadUInt32());
                    int oat9Offset = Convert.ToInt32(romReader.ReadUInt32());
                    int oat9Length = Convert.ToInt32(romReader.ReadUInt32());
                    int oat7Offset = Convert.ToInt32(romReader.ReadUInt32());
                    int oat7Length = Convert.ToInt32(romReader.ReadUInt32());
                    romReader.BaseStream.Position = 104;
                    int bnrOffset = Convert.ToInt32(romReader.ReadUInt32());
                    romReader.BaseStream.Position = bnrOffset;
                    int bnrLength = Convert.ToInt32(romReader.ReadUInt16());
                    switch (bnrLength)
                    {
                    case 1:
                        bnrLength = 2112;
                        break;

                    case 2:
                        bnrLength = 2112;
                        break;

                    case 3:
                        bnrLength = 3072;
                        break;

                    case 259:
                        bnrLength = 9216;
                        break;
                    }

                    byte[] fntArray = new byte[fntLength];
                    byte[] fatArray = new byte[fatLength];

                    romReader.BaseStream.Position = fntOffset;
                    romReader.Read(fntArray, 0, fntLength);
                    romReader.BaseStream.Position = fatOffset;
                    romReader.Read(fatArray, 0, fatLength);

                    if (fatArray.Count() % 8 > 0)
                    {
                        // Exception handling for rewrite later.
                        throw new Exception(
                                  "Table length must be a multiple of 8. This table has a length of " + fatArray.Count() + "."
                                  + "\n " + fatArray.Count() + " ÷ 8 = " + (fatArray.Count() / 8)
                                  + "\n Remainder: " + (fatArray.Count() % 8)
                                  );
                    }

                    List <NDSFile> fileList = new List <NDSFile>();
                    fileList.Add(new NDSFile("Header", "", "", 0, 16384));
                    fileList.Add(new NDSFile("File Name Table", "", "", fntOffset, fntLength));
                    fileList.Add(new NDSFile("File Allocation Table", "", "", fatOffset, fatLength));
                    fileList.Add(new NDSFile("Banner", "", ".bnr", bnrOffset, bnrLength));
                    fileList.Add(new NDSFile("ARM9 Binary", "", ".bin", arm9Offset, arm9Length));
                    fileList.Add(new NDSFile("ARM9 Overlay Table", "", "", oat9Offset, oat9Length));
                    if (arm7Length > 0)
                    {
                        fileList.Add(new NDSFile("ARM7 Binary", "", ".bin", arm7Offset, arm9Length));
                    }
                    if (oat7Length > 0)
                    {
                        fileList.Add(new NDSFile("ARM7 Overlay Table", "", "", oat7Offset, oat9Length));
                    }

                    int directoryCount = BitConverter.ToUInt16(fntArray, 6);
                    int firstFile      = BitConverter.ToInt16(fntArray, 4);
                    int fileCount      = fatArray.Count() / 8;
                    int workload       = (fileCount * 4) + (directoryCount * 2);
                    int progress       = 0;

                    worker.ReportProgress(workload, new Tuple <int, string, int, int>(progress, "Reading File Name And Allocation Tables", fileCount, 0));
                    NDSFile[] files = new NDSFile[fileCount];

                    for (int i = 0; i < fileCount; i++)
                    {
                        if (worker.CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        files[i] = new NDSFile();
                        NDSFile currentFile = files[i];
                        files[i].Offset = Convert.ToInt32(BitConverter.ToUInt32(fatArray, i * 8));
                        files[i].Length = Convert.ToInt32(BitConverter.ToUInt32(fatArray, i * 8 + 4)) - files[i].Offset;

                        progress++;
                        worker.ReportProgress(workload, new Tuple <int, string, int, int>(progress, "Reading File Allocation Table", fileCount, i + 1));
                    }

                    worker.ReportProgress(workload, new Tuple <int, string, int, int>(progress, "Reading Overlay Allocation Table", firstFile, 0));

                    string[]      directories;
                    List <string> dirList = new List <string>();
                    directories = new string[directoryCount];
                    if (firstFile > 0)
                    {
                        directories[0] = "\\Root";
                        dirList.Add("\\Overlays");
                        for (int i = 0; i < firstFile; i++)
                        {
                            if (worker.CancellationPending)
                            {
                                e.Cancel = true;
                                return;
                            }

                            files[i].Name = "Overlay " + i.ToString("D" + firstFile.ToString().Length) + ".bin";
                            files[i].Path = "\\Overlays";

                            progress++;
                            worker.ReportProgress(workload, new Tuple <int, string, int, int>(progress, "Reading Overlay Allocation Table", firstFile, i + 1));
                        }
                    }
                    else
                    {
                        directories[0] = "";
                    }

                    worker.ReportProgress(workload, new Tuple <int, string, int, int>(progress, "Reading File Name Table", fileCount + directoryCount, 0));

                    int unnamedCount = 0;
                    int dirProgress  = 0;
                    int fileProgress = 0;

                    for (int i = 0; i < directoryCount; i++)
                    {
                        int entryPos  = Convert.ToInt32(BitConverter.ToUInt32(fntArray, i * 8));
                        int fileIndex = Convert.ToInt32(BitConverter.ToUInt16(fntArray, (i * 8) + 4));

                        while (true)
                        {
                            if (worker.CancellationPending)
                            {
                                e.Cancel = true;
                                return;
                            }

                            byte entryByte = fntArray[entryPos++];

                            if (entryByte == 0)
                            {
                                break;
                            }

                            else if (entryByte == 128)
                            {
                                int index = BitConverter.ToUInt16(fntArray, entryPos) - 61440;
                                directories[index] = directories[i] + "\\Unnamed " + unnamedCount++;
                                dirProgress++;
                                entryPos += 2;
                            }

                            else if (entryByte > 128)
                            {
                                int index = BitConverter.ToUInt16(fntArray, (entryPos) + (entryByte - 128)) - 61440;
                                directories[index] = directories[i] + "\\" + System.Text.Encoding.UTF8.GetString(fntArray, entryPos, entryByte - 128);
                                dirProgress++;
                                entryPos += (entryByte - 128) + 2;
                            }

                            else
                            {
                                files[fileIndex].Name = System.Text.Encoding.UTF8.GetString(fntArray, entryPos, entryByte);
                                files[fileIndex].Path = directories[i];
                                fileIndex++;
                                fileProgress++;
                                entryPos += entryByte;
                            }

                            progress++;
                            worker.ReportProgress(workload, new Tuple <int, string, int, int>(progress, "Reading File Name Table", fileCount + directoryCount, dirProgress + fileProgress));
                        }
                    }

                    worker.ReportProgress(workload, new Tuple <int, string, int, int>(progress, "Getting File Extensions", fileCount, 0));

                    fileList.AddRange(files.ToList());
                    dirList.AddRange(directories.ToList());
                    files       = null;
                    directories = null;
                    List <NDSFile> narcList = new List <NDSFile>();
                    for (int i = 0; i < fileCount; i++)
                    {
                        if (worker.CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        NDSFile file = fileList[i];
                        file.GetExtension(romStream);

                        if (file.Extension == ".narc")
                        {
                            narcList.Add(file);
                            workload++;
                        }

                        progress++;
                        worker.ReportProgress(workload, new Tuple <int, string, int, int>(progress, "Getting File Extensions", fileCount, i + 1));
                    }

                    worker.ReportProgress(workload, new Tuple <int, string, int, int>(progress, "Reading NARC Files", directoryCount, 0));

                    if (narcList.Count > 0)
                    {
                        for (int i = 0; i < narcList.Count; i++)
                        {
                            if (worker.CancellationPending)
                            {
                                e.Cancel = true;
                                return;
                            }

                            NDSFile file = narcList[i];
                            NARC    narc = new NARC(romStream, file);
                            if (narc.isValid)
                            {
                                fileList.Remove(file);
                                dirList.AddRange(narc.dirList);
                                fileList.AddRange(narc.fileList);
                            }

                            progress++;
                            worker.ReportProgress(workload, new Tuple <int, string, int, int>(progress, "Reading NARC Files", narcList.Count, i + 1));
                        }
                    }

                    worker.ReportProgress(workload, new Tuple <int, string, int, int>(progress, "Writing Folder Structure", directoryCount, 0));

                    double compWorkload = directoryCount / dirList.Count;
                    for (int i = 0; i < dirList.Count; i++)
                    {
                        if (worker.CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        Directory.CreateDirectory(fsPath + dirList[i]);

                        int p = Convert.ToInt32((i + 1) * compWorkload);
                        worker.ReportProgress(workload, new Tuple <int, string, int, int>(progress + p, "Writing Folder Structure", directoryCount, (int)((i + 1) * compWorkload)));
                    }

                    progress += directoryCount;
                    worker.ReportProgress(workload, new Tuple <int, string, int, int>(progress, "Extracting Files", fileList.Count, 0));

                    compWorkload = (double)fileCount / (double)fileList.Count;
                    for (int i = 0; i < fileList.Count; i++)
                    {
                        if (worker.CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        NDSFile file = fileList[i];
                        romReader.BaseStream.Position = file.Offset;
                        byte[] image = new byte[file.Length];
                        romReader.Read(image, 0, file.Length);

                        Directory.CreateDirectory(path + "\\Text Files");
                        if (file.Path == "\\Root\\a\\0\\2\\7.narc")
                        {
                            PokeTextIV TextFile = new PokeTextIV(romStream, file);

                            System.IO.File.WriteAllLines(path + "\\Text Files\\" + file.Name + ".txt", TextFile.StringList);
                        }

                        /*
                         * using ( BinaryWriter writer = new BinaryWriter(File.Open(fsPath + file.Path + "\\" + file.Name + file.Extension, FileMode.Create)) )
                         * {
                         *      writer.Write(image, 0, file.Length);
                         * }
                         */

                        int p = Convert.ToInt32((i + 1) * compWorkload);
                        worker.ReportProgress(workload, new Tuple <int, string, int, int>(progress + p, "Extracting Files", fileList.Count, (i + 1)));
                    }
                }
            }
        }
예제 #11
0
        public void Load()
        {
            if (ComboIndex < 0)
            {
                LanguageCombo.SelectedIndex = 0;
            }
            var    rfs      = MainWindow.LoadedROM.ToFileSystem();
            string ext      = GetCARCExtension(LanguageCombo.SelectedIndex);
            var    cbmain2d = ROMUtils.GetFile("Main2D" + ext + ".carc", rfs);
            var    bmain2d  = ROM.LZ77_Decompress(cbmain2d);

            Main2D = new NARC(bmain2d);
            var dmain2d = Main2D.ToFileSystem();
            var common  = ROMUtils.GetFile("common.bmg", dmain2d);

            Common = new BMG(common);
            var cbstatic2d = ROMUtils.GetFile("Static2D.carc", rfs);
            var bstatic2d  = ROM.LZ77_Decompress(cbstatic2d);

            Static2D = new NARC(bstatic2d);
            var dstatic2d = Static2D.ToFileSystem();
            var mbchild   = ROMUtils.GetFile("MBChild" + ext + ".bmg", dstatic2d);

            MBChild = new BMG(mbchild);
            var cbchksel = ROMUtils.GetFile("CharacterKartSelect" + ext + ".carc", rfs);
            var bchksel  = ROM.LZ77_Decompress(cbchksel);

            CharacterKartSelect = new NARC(bchksel);
            var dchksel = CharacterKartSelect.ToFileSystem();
            var ksel    = ROMUtils.GetFile("kart_select.bmg", dchksel);

            KartSelect = new BMG(ksel);
            var cbwlmenu = ROMUtils.GetFile("WLMenu" + ext + ".carc", rfs);
            var bwlmenu  = ROM.LZ77_Decompress(cbwlmenu);

            WLMenu = new NARC(bwlmenu);
            var dwlmenu = WLMenu.ToFileSystem();
            var banner  = ROMUtils.GetFile("banner.bmg", dwlmenu);

            Banner = new BMG(banner);
            CommonTextsList.Items.Clear();
            MBChildTextsList.Items.Clear();
            KartSelectTextsList.Items.Clear();
            DlPlayTextsList.Items.Clear();
            foreach (var str in Common.DAT1.Strings)
            {
                CommonTextsList.Items.Add(new TextBox()
                {
                    TextWrapping  = TextWrapping.Wrap,
                    AcceptsReturn = true,
                    Text          = str,
                });
            }
            foreach (var str in MBChild.DAT1.Strings)
            {
                MBChildTextsList.Items.Add(new TextBox()
                {
                    TextWrapping  = TextWrapping.Wrap,
                    AcceptsReturn = true,
                    Text          = str,
                });
            }
            foreach (var str in KartSelect.DAT1.Strings)
            {
                KartSelectTextsList.Items.Add(new TextBox()
                {
                    TextWrapping  = TextWrapping.Wrap,
                    AcceptsReturn = true,
                    Text          = str,
                });
            }
            foreach (var str in Banner.DAT1.Strings)
            {
                DlPlayTextsList.Items.Add(new TextBox()
                {
                    TextWrapping  = TextWrapping.Wrap,
                    AcceptsReturn = true,
                    Text          = str,
                });
            }
        }