private void DoOutputPrep(VirtualFilesystemNode vfsNode, List <FSTEntry> outputFST, List <byte> fstNameBank, EndianBinaryWriter writer, int curParentDirIndex) { FSTEntry fstEnt = new FSTEntry(); if (vfsNode.Type == NodeType.Directory) { VirtualFilesystemDirectory dir = (VirtualFilesystemDirectory)vfsNode; fstEnt.Type = FSTNodeType.Directory; fstEnt.FileNameOffset = fstNameBank.Count(); fstNameBank.AddRange(Encoding.ASCII.GetBytes(dir.Name.ToCharArray())); fstNameBank.Add(0); fstEnt.FileOffsetParentDir = curParentDirIndex; curParentDirIndex = outputFST.Count(); int thisDirIndex = curParentDirIndex; outputFST.Add(fstEnt); //Placeholder for this dir foreach (VirtualFilesystemNode child in dir.Children) { DoOutputPrep(child, outputFST, fstNameBank, writer, curParentDirIndex); } int dirEndIndex = outputFST.Count(); fstEnt.FileSizeNextDirIndex = (dirEndIndex - thisDirIndex) + thisDirIndex; outputFST[thisDirIndex] = fstEnt; //Add the actual entry after giving it the rest of the info } else { VirtualFilesystemFile file = (VirtualFilesystemFile)vfsNode; fstEnt.Type = FSTNodeType.File; fstEnt.FileSizeNextDirIndex = file.Data.Length; fstEnt.FileNameOffset = fstNameBank.Count(); fstNameBank.AddRange(Encoding.ASCII.GetBytes(file.Name.ToCharArray())); fstNameBank.AddRange(Encoding.ASCII.GetBytes(file.Extension.ToCharArray())); fstNameBank.Add((byte)0); writer.BaseStream.Position = (int)writer.BaseStream.Position + (32 - ((int)writer.BaseStream.Position % 32)) % 32; fstEnt.FileOffsetParentDir = (int)writer.BaseStream.Position; writer.Write(file.Data); for (int i = 0; i < ((32 - (file.Data.Length - 32)) % 32); i++) { writer.Write((byte)0); } //Console.WriteLine("Wrote file: " + file.Name); outputFST.Add(fstEnt); } }
private void DumpDirsRecursive(VirtualFilesystemNode vfsObj, string root) { if (vfsObj.Type == NodeType.Directory) { VirtualFilesystemDirectory dir = (VirtualFilesystemDirectory)vfsObj; string testRoot = root + @"\" + dir.Name; Directory.CreateDirectory(testRoot); foreach (VirtualFilesystemNode child in dir.Children) { if (child.Type == NodeType.Directory) { Directory.CreateDirectory(testRoot + @"\" + child.Name); Console.WriteLine("Wrote directory: " + testRoot + @"\" + child.Name); DumpDirsRecursive(child, testRoot); } else { DumpDirsRecursive(child, testRoot); } } } else { VirtualFilesystemFile file = (VirtualFilesystemFile)vfsObj; using (FileStream stream = new FileStream(root + @"\" + file.Name + file.Extension, FileMode.Create)) { EndianBinaryWriter writer = new EndianBinaryWriter(stream, Endian.Big); writer.Write(file.Data); Console.WriteLine("Wrote file: " + root + @"\" + file.Name + file.Extension); } } }
private int GetFSTSkipValue(int curValue, VirtualFilesystemNode node) { if (node.Type == NodeType.Directory) { VirtualFilesystemDirectory dir = (VirtualFilesystemDirectory)node; curValue += (12 + dir.Name.Length + 1); foreach (VirtualFilesystemNode child in dir.Children) { curValue = GetFSTSkipValue(curValue, child); } } else { VirtualFilesystemFile file = (VirtualFilesystemFile)node; curValue += (int)(12 + file.Name.Length + file.Extension.Length + 1); } return(curValue); }