예제 #1
0
        public SFSDirectory ToFileSystem()
        {
            SFSDirectory[] dirs = new SFSDirectory[FileSystemTable.Length];
            dirs[1] = new SFSDirectory("/", true);
            var curdir = dirs[1];

            for (int i = 2; i < FileSystemTable.Length; i++)
            {
                if (FileSystemTable[i].IsFolder)
                {
                    var folder = new SFSDirectory(FileNameTable[FileSystemTable[i].NameOffset], false);
                    dirs[i]       = folder;
                    folder.Parent = dirs[FileSystemTable[i].DataOffset];
                    dirs[FileSystemTable[i].DataOffset].SubDirectories.Add(folder);
                    curdir = folder;
                }
                else
                {
                    var    file = new SFSFile(-1, FileNameTable[FileSystemTable[i].NameOffset], curdir);
                    byte[] data = new byte[FileSystemTable[i].DataLength];
                    Array.Copy(Data, FileSystemTable[i].DataOffset - Header.FileDataOffset, data, 0, FileSystemTable[i].DataLength);
                    file.Data = data;
                    curdir.Files.Add(file);
                }
            }
            return(dirs[1]);
        }
예제 #2
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!");
                }
            }
        }
예제 #3
0
        private void button2_Click(object sender, EventArgs e)
        {
            using (var stream = new MemoryStream())
            {
                using (var xr = XmlWriter.Create(stream, new XmlWriterSettings()
                {
                    Indent = true, Encoding = Form1.DefEnc
                }))
                {
                    xr.WriteStartDocument();
                    xr.WriteStartElement("Root");
                    xr.WriteStartElement("isBigEndian");
                    xr.WriteAttributeString("Value", "False");
                    xr.WriteEndElement();
                    xr.WriteStartElement("BymlFormatVersion");
                    xr.WriteAttributeString("Value", ((uint)1).ToString());
                    xr.WriteEndElement();
                    xr.WriteStartElement("C1");
                    xr.WriteStartElement("C0");
                    xr.WriteAttributeString("Name", "StageDefaultBgmList");
                    foreach (string k in Levels.Keys.ToArray())
                    {
                        xr.WriteStartElement("C1");
                        xr.WriteStartElement("A0");
                        xr.WriteAttributeString("Name", "BgmLabel");
                        xr.WriteAttributeString("StringValue", Levels[k]);
                        xr.WriteEndElement();
                        xr.WriteStartElement("D1");
                        xr.WriteAttributeString("Name", "Scenario");
                        xr.WriteAttributeString("StringValue", k.Substring(k.Length - 5, 1));
                        xr.WriteEndElement();
                        xr.WriteStartElement("A0");
                        xr.WriteAttributeString("Name", "StageName");
                        xr.WriteAttributeString("StringValue", k.Substring(0, k.Length - 8));
                        xr.WriteEndElement();
                        xr.WriteEndElement();
                    }
                    xr.WriteEndElement();
                    xr.WriteEndElement();
                    xr.WriteEndElement();
                    xr.Close();
                }
                Clipboard.SetText(Form1.DefEnc.GetString(stream.ToArray()));
                SzsFiles["StageDefaultBgmList.byml"] = BymlConverter.GetByml(Form1.DefEnc.GetString(stream.ToArray()));
            }
            CommonCompressors.YAZ0   y       = new CommonCompressors.YAZ0();
            NDS.NitroSystem.FND.NARC SzsArch = new NDS.NitroSystem.FND.NARC();
            SFSDirectory             dir     = new SFSDirectory("", true);

            for (int i = 0; i < SzsFiles.Count; i++)
            {
                SFSFile file = new SFSFile(i, SzsFiles.Keys.ToArray()[i], dir);
                file.Data = SzsFiles.Values.ToArray()[i];
                dir.Files.Add(file);
            }
            SzsArch.FromFileSystem(dir);
            File.WriteAllBytes(@"BgmTable.szs", y.Compress(SzsArch.Write()));
            MessageBox.Show("Done, file was saved as BgmTable.szs in this program folder");
            this.Close();
        }
예제 #4
0
        public static SFSFile GetSFSFile(string Name, SFSDirectory Dir)
        {
            SFSFile data = null;

            if (Dir.Files.Count > 0)
            {
                foreach (var file in Dir.Files)
                {
                    if (file.FileName == Name)
                    {
                        data = file;
                        break;
                    }
                }
            }
            if (data == null)
            {
                if (Dir.SubDirectories.Count > 0)
                {
                    foreach (var dir in Dir.SubDirectories)
                    {
                        SFSFile data2 = GetSFSFile(Name, dir);
                        if (data2 != null)
                        {
                            data = data2;
                            break;
                        }
                    }
                }
            }
            return(data);
        }
예제 #5
0
        public SFSDirectory ToFileSystem()
        {
            SFSDirectory Root = new SFSDirectory("/", true);

            foreach (var v in SFat.Entries)
            {
                var  q         = new SFSFile((int)v.FileNameHash, string.Format("0x{0:X8}", v.FileNameHash), Root);
                bool NameFound = false;
                if (SARCHashTable.DefaultHashTable != null)
                {
                    var vv = SARCHashTable.DefaultHashTable.GetEntryByHash(v.FileNameHash);
                    if (vv != null)
                    {
                        q.FileName = vv.Name; NameFound = true;
                    }
                }
                if (SarcFilename != null && !NameFound)
                {
                    var SarcName = System.IO.Path.GetFileNameWithoutExtension(SarcFilename);
                    foreach (var ext in MK7_szs_extensions)
                    {
                        string vv = SarcName + ext;
                        if (v.FileNameHash == GetHashFromName(vv))
                        {
                            q.FileName = vv;
                        }
                    }
                }
                q.Data = GetFileDataByHash(v.FileNameHash);
                Root.Files.Add(q);
            }
            return(Root);
        }
예제 #6
0
 public SFSDirectory ToFileSystem()
 {
     SFSDirectory[] dirs = new SFSDirectory[ArchiveInfo.NrFolderTableEntries];
     for (int i = (int)ArchiveInfo.NrFolderTableEntries - 1; i >= 0; i--)
     {
         dirs[i] = new SFSDirectory(FolderTable[i].Name, (FolderTable[i].Identifier == "ROOT"));
         for (int j = 0; j < FolderTable[i].NrFileEntries; j++)
         {
             var v = FileTable[j + FolderTable[i].FirstFileEntryIndex];
             if (v.FileID != 0xFFFF)
             {
                 var f = new SFSFile(v.FileID, v.Name, dirs[i]);
                 f.Data = new byte[v.DataSize];
                 Array.Copy(Data, v.DataOffset, f.Data, 0, v.DataSize);
                 dirs[i].Files.Add(f);
             }
             else
             {
                 if (v.Name == "." || v.Name == "..")
                 {
                     continue;
                 }
                 dirs[v.DataOffset].Parent = dirs[i];
                 dirs[i].SubDirectories.Add(dirs[v.DataOffset]);
             }
         }
     }
     return(dirs[0]);
 }
예제 #7
0
        public SFSDirectory ToFileSystem()
        {
            SFSDirectory Root = new SFSDirectory("/", true);

            foreach (var v in SFat.Entries)
            {
                var q = new SFSFile((int)v.FileNameHash, string.Format("0x{0:X8}", v.FileNameHash), Root);
                q.Data = GetFileDataByHash(v.FileNameHash);
                Root.Files.Add(q);
            }
            return(Root);
        }
예제 #8
0
        public static void SaveFile(ref Dictionary <string, string> ccnt_r)
        {
            CommonCompressors.YAZ0   y       = new CommonCompressors.YAZ0();
            NDS.NitroSystem.FND.NARC SzsArch = new NDS.NitroSystem.FND.NARC();
            SFSDirectory             dir     = new SFSDirectory("", true);
            SFSFile StgData = new SFSFile(0, "CreatorClassNameTable.byml", dir);

            StgData.Data = BymlConverter.GetByml(MakeXML(ref ccnt_r));
            dir.Files.Add(StgData);
            SzsArch.FromFileSystem(dir);
            File.Delete("CreatorClassNameTable.szs");
            File.WriteAllBytes("CreatorClassNameTable.szs", y.Compress(SzsArch.Write()));
        }
 private void menuAdd_Click(object sender, EventArgs e)
 {
     if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
         openFileDialog1.FileName.Length > 0)
     {
         SARCFileAdd fileAddDialog = new SARCFileAdd(Archive, openFileDialog1.FileName);
         fileAddDialog.ShowDialog();
         if (fileAddDialog.DialogResult == DialogResult.OK)
         {
             if (Archive.checkHashExists(fileAddDialog.calculatedHash))
             {
                 MessageBox.Show("File already exists!", "Error", MessageBoxButtons.OK);
                 return;
             }
             SFSFile newfile   = new SFSFile((Int32)fileAddDialog.calculatedHash, string.Format("0x{0:X8}", fileAddDialog.calculatedHash), Root);
             bool    NameFound = false;
             if (SARCHashTable.DefaultHashTable != null)
             {
                 var vv = SARCHashTable.DefaultHashTable.GetEntryByHash(fileAddDialog.calculatedHash);
                 if (vv != null)
                 {
                     newfile.FileName = vv.Name; NameFound = true;
                 }
             }
             if (Archive.SarcFilename != null && !NameFound)
             {
                 var SarcName = System.IO.Path.GetFileNameWithoutExtension(Archive.SarcFilename);
                 foreach (var ext in Archive.MK7_szs_extensions)
                 {
                     string vv = SarcName + ext;
                     if (fileAddDialog.calculatedHash == Archive.GetHashFromName(vv))
                     {
                         newfile.FileName = vv;
                     }
                 }
             }
             newfile.Data = System.IO.File.ReadAllBytes(openFileDialog1.FileName);
             Root.Files.Add(newfile);
             Archive.FromFileSystem(Root);
             fileBrowser1.UpdateDirectories(Root.GetTreeNodes(), true);
         }
     }
 }
예제 #10
0
        public SFSDirectory ToFileSystem()
        {
            SFSDirectory Root = new SFSDirectory("/", true);

            foreach (var v in SFat.Entries)
            {
                var q = new SFSFile((int)v.FileNameHash, string.Format("0x{0:X8}", v.FileNameHash), Root);
                if (SARCHashTable.DefaultHashTable != null)
                {
                    var vv = SARCHashTable.DefaultHashTable.GetEntryByHash(v.FileNameHash);
                    if (vv != null)
                    {
                        q.FileName = vv.Name;
                    }
                }
                q.Data = GetFileDataByHash(v.FileNameHash);
                Root.Files.Add(q);
            }
            return(Root);
        }
예제 #11
0
        private void fileBrowser1_OnAddFile(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
                openFileDialog1.FileName.Length > 0)
            {
                var dir = Root.GetDirectoryByPath(fileBrowser1.SelectedFolderPath);
                if (!dir.IsValidName(System.IO.Path.GetFileName(openFileDialog1.FileName)))
                {
                    switch (MessageBox.Show("A file with the same name as the selected file exists. Do you want to replace this file?", "Replace", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                    {
                    case System.Windows.Forms.DialogResult.Yes:
                        var file = Root.GetFileByPath(fileBrowser1.SelectedFolderPath + "/" + System.IO.Path.GetFileName(openFileDialog1.FileName));
                        file.Data = System.IO.File.ReadAllBytes(openFileDialog1.FileName);
                        break;

                    case System.Windows.Forms.DialogResult.No:
                        int    nr = 0;
                        String NewName;
                        do
                        {
                            NewName = System.IO.Path.GetFileNameWithoutExtension(openFileDialog1.FileName) + "_" + nr++ + System.IO.Path.GetExtension(openFileDialog1.FileName);
                        }while (!dir.IsValidName(NewName));
                        SFSFile f = new SFSFile(-1, NewName, dir);
                        f.Data = System.IO.File.ReadAllBytes(openFileDialog1.FileName);
                        dir.Files.Add(f);
                        break;
                    }
                }
                else
                {
                    SFSFile f = new SFSFile(-1, System.IO.Path.GetFileName(openFileDialog1.FileName), dir);
                    f.Data = System.IO.File.ReadAllBytes(openFileDialog1.FileName);
                    dir.Files.Add(f);
                }
                Archive.FromFileSystem(Root);
                fileBrowser1.UpdateDirectories(Root.GetTreeNodes(), true);
            }
        }
예제 #12
0
        private void button1_Click(object sender, EventArgs e)
        {
            if (!File.Exists(PaPath))
            {
                MessageBox.Show("Pa file not found !"); return;
            }
            if (!File.Exists(KclPath))
            {
                MessageBox.Show("kcl file not found !"); return;
            }
            if (!File.Exists(modelPath))
            {
                MessageBox.Show("Model file not found !"); return;
            }
            SaveFileDialog s = new SaveFileDialog();

            s.Filter   = "Szs files|*.szs";
            s.FileName = textBox1.Text;
            if (s.ShowDialog() != DialogResult.OK)
            {
                return;
            }
            CommonCompressors.YAZ0   y       = new CommonCompressors.YAZ0();
            NDS.NitroSystem.FND.NARC SzsArch = new NDS.NitroSystem.FND.NARC();
            SFSDirectory             dir     = new SFSDirectory("", true);

            //Model
            SFSFile Model = new SFSFile(0, textBox1.Text + ".bcmdl", dir);

            if (IsObj)
            {
                CGFX mod = null;
                mod = new CGFX();
                CGFXGenerator.FromOBJ(mod, modelPath, textBox1.Text);
                Model.Data = mod.Write();
            }
            else
            {
                Model.Data = File.ReadAllBytes(modelPath);
            }
            dir.Files.Add(Model);
            //Collisions
            SFSFile KclFile = new SFSFile(1, textBox1.Text + ".kcl", dir);

            KclFile.Data = File.ReadAllBytes(KclPath);
            dir.Files.Add(KclFile);
            SFSFile PaFile = new SFSFile(2, textBox1.Text + ".pa", dir);

            PaFile.Data = File.ReadAllBytes(PaPath);
            dir.Files.Add(PaFile);
            //InitSensor
            SFSFile Sensor = new SFSFile(3, "InitSensor.byml", dir);

            Sensor.Data = BymlConverter.GetByml(Properties.Resources.Sensor);
            dir.Files.Add(Sensor);
            //InitActor
            SFSFile Actor = new SFSFile(4, "InitActor.byml", dir);

            Actor.Data = BymlConverter.GetByml(Properties.Resources.Actor);
            dir.Files.Add(Actor);
            //InitClipping
            string  clip     = "<?xml version=\"1.0\" encoding=\"shift_jis\"?>\r\n<Root>\r\n  <isBigEndian Value=\"False\" />\r\n  <BymlFormatVersion Value=\"1\" />\r\n  <C1>\r\n    <D2 Name=\"Radius\" StringValue=\"" + numericUpDown1.Value.ToString() + "\" />\r\n  </C1>\r\n</Root>";
            SFSFile Clipping = new SFSFile(5, "InitClipping.byml", dir);

            Clipping.Data = BymlConverter.GetByml(clip);
            dir.Files.Add(Clipping);

            SzsArch.FromFileSystem(dir);
            File.WriteAllBytes(s.FileName, y.Compress(SzsArch.Write()));
            MessageBox.Show("Done !");
            MessageBox.Show("Remember you need to add the object to the CreatorClassNameTable to use the object in-game (Other modding -> CreatorClassNameTable editor)");
            MessageBox.Show("To view the model in the editor you must copy it in the models folder with the name " + textBox1.Text + ".obj or else you will see a blue box");
            this.Close();
        }
 public SARCEFESFSFile(SFSFile File)
     : base(File)
 {
 }