Example #1
0
        public static AfsLoader CreateMissionAfs(RawFile questNbl, Dictionary <int, RawFile> zoneNbls, bool createAllLanguages)
        {
            AfsLoader toReturn    = new AfsLoader();
            int       highestZone = zoneNbls.Keys.Max();

            AddLanguages(toReturn, questNbl, "quest", createAllLanguages);

            //Alright, so.
            //0-1-10-11-...2-20-21...-
            for (int i = 0; i < 10; i++)
            {
                if (zoneNbls.ContainsKey(i))
                {
                    AddLanguages(toReturn, zoneNbls[i], "zone" + i.ToString("D2"), createAllLanguages);
                }
                if (i > 0)
                {
                    for (int j = 0; j < 10; j++)
                    {
                        if (zoneNbls.ContainsKey(i * 10 + j))
                        {
                            AddLanguages(toReturn, zoneNbls[i], "zone" + (i * 10 + j).ToString("D2"), createAllLanguages);
                        }
                    }
                }
            }
            return(toReturn);
        }
Example #2
0
        private void button2_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                int     zoneNumber = Decimal.ToInt32(numericUpDown1.Value);
                RawFile zone       = new RawFile {
                    filename = "zone" + zoneNumber.ToString("D2") + ".nbl", fileContents = File.ReadAllBytes(openFileDialog1.FileName)
                };
                string zoneText = "zone" + zoneNumber.ToString("D2") + ": " + openFileDialog1.FileName;
                if (zones.ContainsKey(zoneNumber))
                {
                    zones.Remove(zoneNumber);
                }
                zones.Add(zoneNumber, zone);

                int index       = zoneList.FindIndex(i => i > zoneNumber);
                int questOffset = questNbl != null ? 1 : 0;
                if (zoneList.Contains(zoneNumber))
                {
                    listBox1.Items.RemoveAt(zoneList.IndexOf(zoneNumber) + questOffset);
                    listBox1.Items.Insert(zoneList.IndexOf(zoneNumber) + questOffset, zoneText);
                }
                else if (index != -1)
                {
                    listBox1.Items.Insert(index + questOffset, zoneText);
                    zoneList.Insert(index, zoneNumber);
                }
                else
                {
                    listBox1.Items.Add(zoneText);
                    zoneList.Add(zoneNumber);
                }
            }
        }
Example #3
0
        /// <summary>
        /// Adds a container file's children to a given node collection.
        /// </summary>
        /// <param name="currNode">node collection</param>
        /// <param name="toRead">container file</param>
        private void addChildFiles(TreeNodeCollection currNode, ContainerFile toRead)
        {
            List <string> filenames = toRead.getFilenames();

            for (int i = 0; i < filenames.Count; i++)
            {
                string   filename = filenames[i];
                TreeNode temp     = new TreeNode(filename);
                temp.ContextMenuStrip = treeViewContextMenu;
                if (toRead is AfsLoader || toRead is NblLoader || toRead is MiniAfsLoader) //AFS still doesn't lazy-load, meaning all my performance issues are STILL HERE.
                {
                    PsuFile child = toRead.getFileParsed(i);
                    if (child != null && child is ContainerFile)
                    {
                        addChildFiles(temp.Nodes, (ContainerFile)child);
                    }
                }
                else //NBL chunk as parent
                {
                    RawFile raw = toRead.getFileRaw(i);
                    if (filename.EndsWith(".nbl") || raw.fileheader == "NMLL" || raw.fileheader == "TMLL")
                    {
                        addChildFiles(temp.Nodes, (ContainerFile)toRead.getFileParsed(i));
                    }
                }
                temp.Tag = new object[] { toRead, filename };
                currNode.Add(temp);
            }
        }
Example #4
0
        private void replaceFileToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ContextMenuStrip temp         = (ContextMenuStrip)((ToolStripMenuItem)sender).Owner;
            TreeView         tempTree     = (TreeView)temp.SourceControl;
            TreeNode         selectedNode = tempTree.SelectedNode;// = (TreeNode)((MenuItem)sender).GetContextMenu().SourceControl;
            ContainerFile    owningFile;

            owningFile = (ContainerFile)((object[])selectedNode.Tag)[0];
            OpenFileDialog replaceDialog = new OpenFileDialog();

            replaceDialog.FileName = selectedNode.Text;
            if (replaceDialog.ShowDialog() == DialogResult.OK)
            {
                RawFile file = new RawFile(replaceDialog.OpenFile());
                owningFile.replaceFile(selectedNode.Text, file);
                selectedNode.Text = file.filename;
                ((object[])selectedNode.Tag)[1] = file.filename;

                /*
                 * owningFile.replaceFile(selectedNode.Text, replaceDialog.OpenFile());
                 * if(selectedNode.Parent.Index == 0)
                 *  selectedNode.Tag = owningFile.nmllFiles[selectedNode.Index].actualFile;
                 * else
                 *  selectedNode.Tag = owningFile.tmllFiles[selectedNode.Index].actualFile;*/
                setRightPanel(owningFile.getFileParsed(selectedNode.Text));
            }
        }
Example #5
0
        public void replaceFile(string toReplace, Stream importFile)
        {
            BinaryReader inReader   = getBinaryReader(importFile);
            string       identifier = ASCIIEncoding.ASCII.GetString(inReader.ReadBytes(4));

            importFile.Seek(0x10, SeekOrigin.Begin);
            string actualName = ASCIIEncoding.ASCII.GetString(inReader.ReadBytes(0x20));

            actualName.TrimEnd('\0');
            int baseAddr     = inReader.ReadInt32();
            int fileLength   = inReader.ReadInt32();
            int chunkSize    = inReader.ReadInt32();
            int pointerCount = inReader.ReadInt32();

            byte[] subHeader = inReader.ReadBytes(0x20);
            byte[] rawFile   = inReader.ReadBytes(fileLength);
            importFile.Seek((importFile.Position + 0x7F) & 0xFFFFFF80, SeekOrigin.Begin);
            List <int> pointers = new List <int>();

            for (int i = 0; i < pointerCount; i++)
            {
                pointers.Add(inReader.ReadInt32());
            }
            RawFile tempFile = new RawFile();

            tempFile.pointers     = pointers;
            tempFile.subHeader    = subHeader;
            tempFile.fileOffset   = 0;
            tempFile.chunkSize    = (uint)chunkSize;
            tempFile.filename     = filename;
            tempFile.fileheader   = identifier;
            tempFile.fileContents = rawFile;
            replaceFile(filename, tempFile);
        }
Example #6
0
 public void replaceFile(string filename, RawFile toReplace)
 {
     if (filenames.Contains(filename))
     {
         containedFiles[filenames.IndexOf(filename)]    = new NblLoader(new MemoryStream(toReplace.fileContents));
         containedRawFiles[filenames.IndexOf(filename)] = toReplace;
     }
     throw new NotImplementedException();
 }
Example #7
0
 public void replaceFile(string filename, RawFile toReplace)
 {
     foreach (NblChunk chunk in chunks)
     {
         if (chunk.getFilenames().Contains(filename))
         {
             chunk.replaceFile(filename, toReplace);
         }
     }
 }
Example #8
0
        public void replaceFile(string filename, RawFile toReplace)
        {
            if (loadedFileCache.ContainsKey(filename))
            {
                loadedFileCache.Remove(filename);
            }
            int index = fileContents.Select(file => file.filename).ToList().IndexOf(filename);

            fileContents[index] = toReplace;
        }
Example #9
0
 public void addTmllFile(RawFile file)
 {
     if (chunks.Count < 2 || chunks[1].chunkID != "TMLL")
     {
         NblChunk newChunk = new NblChunk();
         newChunk.encryptionKey = 0;
         newChunk.encrypted     = false;
         newChunk.compressed    = false;
         newChunk.chunkID       = "TMLL";
         newChunk.versionNumber = (short)2;
         chunks.Insert(1, newChunk);
     }
     chunks[1].addFile(file);
 }
Example #10
0
 private static void AddLanguages(AfsLoader containingFile, RawFile fileToAdd, string filenamePrefix, bool createAllLanguages)
 {
     for (int i = 0; i < languages.Length; i++)
     {
         if (createAllLanguages || languages[i] == "_ae")
         {
             containingFile.afsList.Add(new AfsFileEntry {
                 rawContents = fileToAdd.fileContents, fileName = filenamePrefix + languages[i] + ".nbl"
             });
         }
         else
         {
             containingFile.afsList.Add(new AfsFileEntry {
                 fileName = filenamePrefix + languages[i] + ".nbl"
             });
         }
     }
 }
Example #11
0
        public RawFile ToRawFile(uint fileLocation)
        {
            RawFile toRet = new RawFile();

            toRet.fileContents = ToRaw();
            toRet.filename     = this.filename;
            toRet.subHeader    = this.header;
            toRet.chunkSize    = 0x60;
            if (this.calculatedPointers != null)
            {
                toRet.pointers = new List <int>(this.calculatedPointers);
            }
            toRet.fileOffset = fileLocation;
            for (int i = 0; i < toRet.pointers.Count; i++)
            {
                Array.Copy(BitConverter.GetBytes(BitConverter.ToInt32(toRet.fileContents, toRet.pointers[i]) + (int)fileLocation), 0, toRet.fileContents, toRet.pointers[i], 4);
                toRet.pointers[i] += (int)fileLocation;
            }
            return(toRet);
        }
Example #12
0
        public PackFile(Stream fileToLoad)
        {
            BinaryReader fileLoader = new BinaryReader(fileToLoad);

            fileToLoad.Seek(0x400, SeekOrigin.Begin);
            int fileCount = fileLoader.ReadInt32();

            int[] fileLocs  = new int[fileCount];
            int[] fileSizes = new int[fileCount];

            fileToLoad.Seek(0, SeekOrigin.Begin);
            for (int i = 0; i < fileCount; i++)
            {
                fileLocs[i] = fileLoader.ReadInt32();
            }

            fileToLoad.Seek(0x200, SeekOrigin.Begin);
            for (int i = 0; i < fileCount; i++)
            {
                fileSizes[i] = fileLoader.ReadInt32();
            }

            fileToLoad.Seek(0x404, SeekOrigin.Begin);
            for (int i = 0; i < fileCount; i++)
            {
                if (fileSizes[i] > 0)
                {
                    byte[]       currentFile = fileLoader.ReadBytes(fileSizes[i]);
                    MemoryStream nblStream   = new MemoryStream(currentFile);
                    RawFile      raw         = new RawFile();
                    raw.fileContents = currentFile;
                    raw.filename     = i > 0 ? "nbl" + i.ToString("d4") + ".nbl" : "table.nbl";
                    NblLoader currentNbl = new NblLoader(nblStream);
                    containedFiles.Add(i, currentNbl);
                    containedRawFiles.Add(i, raw);
                    filenames.Add(raw.filename);
                    nblStream.Close();
                }
            }
        }
Example #13
0
 private void button1_Click(object sender, EventArgs e)
 {
     if (openFileDialog1.ShowDialog() == DialogResult.OK)
     {
         questNbl = new RawFile {
             filename = "quest.nbl", fileContents = File.ReadAllBytes(openFileDialog1.FileName)
         };
         if (listBox1.Items.Count == 0)
         {
             listBox1.Items.Add("quest.nbl: " + openFileDialog1.FileName);
         }
         else if (((string)listBox1.Items[0]).StartsWith("quest.nbl"))
         {
             listBox1.Items.RemoveAt(0);
             listBox1.Items.Insert(0, "quest.nbl: " + openFileDialog1.FileName);
         }
         else
         {
             listBox1.Items.Insert(0, "quest.nbl: " + openFileDialog1.FileName);
         }
     }
 }
Example #14
0
 public void addNmllFile(RawFile file)
 {
     chunks[0].addFile(file);
 }
Example #15
0
 public void insertFile(RawFile toInsert, int index)
 {
     fileContents.Insert(index, toInsert);
 }
Example #16
0
 public void addFile(RawFile toAdd)
 {
     fileContents.Add(toAdd);
 }
Example #17
0
 public void addFile(int index, RawFile toAdd)
 {
     fileContents.Insert(index, toAdd);
 }
Example #18
0
 private void textureCatalogueToolStripMenuItem_Click(object sender, EventArgs e)
 {
     if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
     {
         Dictionary <string, Dictionary <string, TextureEntry> > textureEntries = new Dictionary <string, Dictionary <string, TextureEntry> >();
         foreach (string file in Directory.EnumerateFiles(folderBrowserDialog1.SelectedPath))
         {
             MD5 md5 = MD5.Create();
             using (Stream s = new FileStream(file, FileMode.Open))
             {
                 byte[] identifier = new byte[4];
                 s.Read(identifier, 0, 4);
                 s.Seek(0, SeekOrigin.Begin);
                 if (identifier.SequenceEqual(new byte[] { 0x4E, 0x4D, 0x4C, 0x4C }))
                 {
                     NblLoader nbl = new NblLoader(s);
                     if (nbl.chunks.Count > 1)
                     {
                         //This means there's a TMLL...
                         foreach (RawFile raw in nbl.chunks[1].fileContents)
                         {
                             byte[] fileMd5   = md5.ComputeHash(raw.fileContents);
                             string md5String = BitConverter.ToString(fileMd5).Replace("-", "");
                             if (!textureEntries.ContainsKey(raw.filename))
                             {
                                 textureEntries[raw.filename] = new Dictionary <string, TextureEntry>();
                             }
                             if (!textureEntries[raw.filename].ContainsKey(md5String))
                             {
                                 TextureEntry entry = new TextureEntry();
                                 entry.fileContents = raw;
                                 textureEntries[raw.filename][md5String] = entry;
                             }
                             if (!textureEntries[raw.filename][md5String].containingFiles.Contains(Path.GetFileName(file)))
                             {
                                 textureEntries[raw.filename][md5String].containingFiles.Add(Path.GetFileName(file));
                             }
                         }
                     }
                 }
             }
         }
         foreach (var ent in textureEntries)
         {
             if (ent.Value.Values.Count > 1)
             {
                 Console.Out.WriteLine("Texture: " + ent.Key);
                 foreach (var val in ent.Value)
                 {
                     Directory.CreateDirectory(folderBrowserDialog1.SelectedPath + "\\categorized\\conflicted\\" + ent.Key + "\\" + val.Key);
                     using (Stream outStream = new FileStream(folderBrowserDialog1.SelectedPath + "\\categorized\\conflicted\\" + ent.Key + "\\" + val.Key + "\\" + val.Value.fileContents.filename, FileMode.Create))
                     {
                         val.Value.fileContents.WriteToStream(outStream);
                     }
                     XvrTextureFile xvr = new XvrTextureFile(val.Value.fileContents.subHeader, val.Value.fileContents.fileContents, val.Value.fileContents.filename);
                     xvr.mipMaps[0].Save(folderBrowserDialog1.SelectedPath + "\\categorized\\conflicted\\" + ent.Key + "\\" + val.Key + "\\" + val.Value.fileContents.filename.Replace(".xvr", ".png"));
                     Console.Out.WriteLine("\t" + val.Key + ": " + string.Join(", ", val.Value.containingFiles));
                 }
                 Console.Out.WriteLine();
             }
             else
             {
                 string  hash = ent.Value.Keys.First();
                 RawFile raw  = ent.Value[hash].fileContents;
                 Directory.CreateDirectory(folderBrowserDialog1.SelectedPath + "\\categorized\\" + ent.Key);
                 using (Stream outStream = new FileStream(folderBrowserDialog1.SelectedPath + "\\categorized\\" + ent.Key + "\\" + raw.filename, FileMode.Create))
                 {
                     raw.WriteToStream(outStream);
                 }
                 XvrTextureFile xvr = new XvrTextureFile(raw.subHeader, raw.fileContents, raw.filename);
                 xvr.mipMaps[0].Save(folderBrowserDialog1.SelectedPath + "\\categorized\\" + ent.Key + "\\" + raw.filename.Replace(".xvr", ".png"));
             }
         }
     }
 }
Example #19
0
 public void addFile(int index, RawFile toAdd)
 {
     throw new NotImplementedException();
 }
Example #20
0
        public void replaceFile(string filename, RawFile toReplace)
        {
            int index = afsList.FindIndex(file => file.fileName == filename);

            replaceFile(index, new MemoryStream(toReplace.fileContents));
        }
Example #21
0
        private NblChunk loadGroup(Stream fileToLoad, BinaryReader fileLoader)
        {
            NblChunk toRet = new NblChunk();

            toRet.bigEndian = isBigEndian;
            long offset = fileToLoad.Position;

            string formatName          = new String(fileLoader.ReadChars(4));
            ushort fileVersion         = fileLoader.ReadUInt16();
            int    paddingAmount       = fileVersion == 0x1002 ? 0x3F : 0x7FF;
            uint   mask                = fileVersion == 0x1002 ? 0xFFFFFFC0 : 0xFFFFF800;
            ushort chunkFilenameLength = fileLoader.ReadUInt16();
            int    headerSize          = fileLoader.ReadInt32();
            int    numFiles            = fileLoader.ReadInt32();
            uint   uncompressedSize    = fileLoader.ReadUInt32();
            uint   compressedSize      = fileLoader.ReadUInt32();
            uint   pointerLength       = fileLoader.ReadUInt32() / 4;

            if (formatName.StartsWith("NML"))
            {
                decryptKey = fileLoader.ReadUInt32();
            }
            else
            {
                fileLoader.ReadUInt32();
            }
            uint size = compressedSize == 0 ? uncompressedSize : compressedSize;

            uint nmllDataLoc    = (uint)((headerSize + paddingAmount) & mask);
            uint pointerLoc     = (uint)(nmllDataLoc + size + paddingAmount) & mask;
            uint mainHeaderSize = 0x20;

            if (formatName.StartsWith("NML"))
            {
                mainHeaderSize = 0x30;
                uint tmllHeaderSize     = fileLoader.ReadUInt32();
                uint tmllDataSizeUncomp = fileLoader.ReadUInt32();
                uint tmllDataSizeComp   = fileLoader.ReadUInt32();
                uint tmllCount          = fileLoader.ReadUInt32();
                if (tmllCount > 0)
                {
                    tmllHeaderLoc = (uint)(pointerLoc + pointerLength * 4 + paddingAmount) & mask;
                }
            }

            decryptor = new BlewFish(decryptKey, isBigEndian);
            FileHeader[] groupHeaders = new FileHeader[numFiles];

            for (int i = 0; i < numFiles; i++)
            {
                fileToLoad.Seek(mainHeaderSize + 0x60 * i + offset, SeekOrigin.Begin);
                FileHeader currentHeader = readHeader(fileLoader.ReadBytes(0x60));
                groupHeaders[i] = currentHeader;
            }

            fileToLoad.Seek(nmllDataLoc + offset, SeekOrigin.Begin);
            int encryptedSectionSize;

            if (fileVersion == 0x1002)
            {
                //Obfuscation stuff from sega.
                int rawEncryptedSectionSize = (int)((((compressedSize >> 0xB) ^ compressedSize) & 0xE0) + 0x20);
                encryptedSectionSize = Math.Min(rawEncryptedSectionSize, (int)compressedSize);
            }
            else
            {
                encryptedSectionSize = (int)size;
            }

            if (encryptedSectionSize % 8 != 0)
            {
                encryptedSectionSize -= (encryptedSectionSize % 8);
            }

            byte[] decryptedFiles;
            if (decryptKey != 0 && formatName.StartsWith("NML"))
            {
                byte[] encryptedFiles = fileLoader.ReadBytes((int)size);
                decryptedFiles = decryptor.decryptBlock(encryptedFiles, encryptedSectionSize);
            }
            else
            {
                decryptedFiles = fileLoader.ReadBytes((int)size + 7);
            }

            if (compressedSize != 0)
            {
                if (fileVersion == 0x1002)
                {
                    DeflateStream ds = new DeflateStream(new MemoryStream(decryptedFiles), CompressionMode.Decompress);
                    MemoryStream  decompressedStream = new MemoryStream((int)uncompressedSize);
                    ds.CopyTo(decompressedStream);
                    decompressedFiles = decompressedStream.ToArray();
                }
                else
                {
                    decompressedFiles = PrsCompDecomp.Decompress(decryptedFiles, uncompressedSize);
                }
            }
            else
            {
                decompressedFiles = decryptedFiles;
            }

            List <int> pointers = new List <int>((int)pointerLength);

            if (pointerLength > 0)
            {
                fileToLoad.Seek(pointerLoc + offset, SeekOrigin.Begin);
                for (int i = 0; i < pointerLength; i++)
                {
                    pointers.Add(fileLoader.ReadInt32());
                }
            }

            List <RawFile> files = new List <RawFile>(numFiles);

            for (int i = 0; i < numFiles; i++)
            {
                RawFile tempFile = new RawFile();
                tempFile.filename   = groupHeaders[i].fileName;
                tempFile.subHeader  = groupHeaders[i].subHeader;
                tempFile.chunkSize  = groupHeaders[i].chunkSize;
                tempFile.fileOffset = groupHeaders[i].filePosition;

                tempFile.fileContents = new byte[groupHeaders[i].fileSize];
                Array.Copy(decompressedFiles, groupHeaders[i].filePosition, tempFile.fileContents, 0, groupHeaders[i].fileSize);
                if (tempFile.fileContents.Length > 0)
                {
                    tempFile.fileheader = new String(ASCIIEncoding.ASCII.GetChars(tempFile.fileContents, 0, 4));
                }
                if (groupHeaders[i].pointerSize > 0)
                {
                    tempFile.pointers = pointers.GetRange((int)groupHeaders[i].pointerPosition / 4, (int)groupHeaders[i].pointerSize / 4);
                }
                files.Add(tempFile);
            }
            toRet.encryptionKey = decryptKey;
            toRet.encrypted     = decryptKey != 0;
            toRet.compressed    = compressedSize != 0;
            toRet.chunkID       = formatName;
            toRet.versionNumber = (short)fileVersion;
            toRet.fileContents  = files;
            return(toRet);
        }