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); }
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); } } }
/// <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); } }
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)); } }
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); }
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(); }
public void replaceFile(string filename, RawFile toReplace) { foreach (NblChunk chunk in chunks) { if (chunk.getFilenames().Contains(filename)) { chunk.replaceFile(filename, toReplace); } } }
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; }
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); }
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" }); } } }
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); }
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(); } } }
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); } } }
public void addNmllFile(RawFile file) { chunks[0].addFile(file); }
public void insertFile(RawFile toInsert, int index) { fileContents.Insert(index, toInsert); }
public void addFile(RawFile toAdd) { fileContents.Add(toAdd); }
public void addFile(int index, RawFile toAdd) { fileContents.Insert(index, toAdd); }
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")); } } } }
public void addFile(int index, RawFile toAdd) { throw new NotImplementedException(); }
public void replaceFile(string filename, RawFile toReplace) { int index = afsList.FindIndex(file => file.fileName == filename); replaceFile(index, new MemoryStream(toReplace.fileContents)); }
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); }