internal static void PopulateRomfs(RomfsMetaData metaData, RomfsFile[] entries) { //Recursively Add All Directories to DirectoryTable RomFS.AddDir(metaData, new DirectoryInfo(RootDir), 0, RomfsUnusedEntry); //Iteratively Add All Files to FileTable RomFS.AddFiles(metaData, entries); //Set Weird Offsets, Build HashKeyPointers, Build HashTables RomFS.PopulateHashTables(metaData); //Thats it. }
internal static void AddDir(RomfsMetaData metaData, DirectoryInfo dir, uint parent, uint sibling, bool doSubs) { DirectoryInfo[] subDirectories = dir.GetDirectories(); if (!doSubs) { uint currentDir = metaData.DirTableLen; RomfsDirEntry entry = new RomfsDirEntry { ParentOffset = parent }; entry.ChildOffset = entry.HashKeyPointer = entry.FileOffset = RomfsUnusedEntry; entry.SiblingOffset = sibling; entry.FullName = dir.FullName; entry.Name = entry.FullName == RootDir ? "" : dir.Name; entry.Offset = currentDir; metaData.DirTable.DirectoryTable.Add(entry); metaData.DirTableLen += currentDir == 0 ? 0x18 : 0x18 + (uint)RomFS.Align((ulong)dir.Name.Length * 2, 4); // int ParentIndex = GetRomfsDirEntry(MetaData, Dir.FullName); // uint poff = MetaData.DirTable.DirectoryTable[ParentIndex].Offset; } else { int curIndex = RomFS.GetRomfsDirEntry(metaData, dir.FullName); uint currentDir = metaData.DirTable.DirectoryTable[curIndex].Offset; for (int i = 0; i < subDirectories.Length; i++) { RomFS.AddDir(metaData, subDirectories[i], currentDir, sibling, false); if (i <= 0) { continue; } string prevFullName = subDirectories[i - 1].FullName; string thisName = subDirectories[i].FullName; int prevIndex = RomFS.GetRomfsDirEntry(metaData, prevFullName); int thisIndex = RomFS.GetRomfsDirEntry(metaData, thisName); metaData.DirTable.DirectoryTable[prevIndex].SiblingOffset = metaData.DirTable.DirectoryTable[thisIndex].Offset; } foreach (DirectoryInfo t in subDirectories) { RomFS.AddDir(metaData, t, currentDir, sibling, true); } } if (subDirectories.Length <= 0) { return; } int curindex = RomFS.GetRomfsDirEntry(metaData, dir.FullName); int childindex = RomFS.GetRomfsDirEntry(metaData, subDirectories[0].FullName); if (curindex > -1 && childindex > -1) { metaData.DirTable.DirectoryTable[curindex].ChildOffset = metaData.DirTable.DirectoryTable[childindex].Offset; } }
internal static void AddDir(RomfsMetaData metaData, DirectoryInfo dir, uint parent, uint sibling) { RomFS.AddDir(metaData, dir, parent, sibling, false); RomFS.AddDir(metaData, dir, parent, sibling, true); }