public bool Load(EndianBinReader reader, bool readHeader = false) { if (readHeader) { if (reader.ReadUInt32() != kMAGIC) { return(false); } _nameTableOffset = reader.ReadUInt32(); _extensionTableOffset = reader.ReadUInt32(); _fileInfoTableOffset = reader.ReadUInt32(); _numFileIdTrees = reader.ReadUInt32(); } _fileIdOffsets = new uint[_numFileIdTrees]; for (int i = 0; i < _numFileIdTrees; i++) { _fileIdOffsets[i] = reader.ReadUInt32(); } // Read Names Names = LoadStringBTree(reader, _nameTableOffset); // Read Extensions Extensions = LoadStringBTree(reader, _extensionTableOffset); // Read FileInfo FileInfos = LoadFileInfoBTree(reader, _fileInfoTableOffset); // Read FileID:s int index = 0; FileIDs = new FileIDBTree[_fileIdOffsets.Length][]; foreach (uint offset in _fileIdOffsets) { FileIDBTree[] temp = new FileIDBTree[0]; LoadFileIDBTree(reader, ref temp, offset); FileIDs[index] = temp; index++; } // Get the file count for (int i = 0; i < FileIDs.Length; i++) { for (int j = 0; j < FileIDs[i].Length; j++) { if (FileIDs[i][j].Flag == FileIDBTree.kFILE_FLAG || FileIDs[i][j].Flag == FileIDBTree.kFILE_WITHOUT_EXTENSION_FLAG) { FileCount++; } } } return(true); }
private void LoadFileIDBTree(EndianBinReader reader, ref FileIDBTree[] objects, uint offset) { uint childOffset = 0; uint nodeCount = 0; uint ptrNodeData = 0; reader.BaseStream.Seek(offset, System.IO.SeekOrigin.Begin); byte childCount = reader.ReadByte(); childOffset = reader.Read3BytesUInt32() + offset; nodeCount = reader.ReadUInt16(); ptrNodeData = (uint)reader.BaseStream.Position; if (objects == null) { objects = new FileIDBTree[0]; } uint indexer = (uint)objects.Length; for (int i = 0; i < nodeCount; i++) { uint keyCount = (ushort)(Util.ExtractTwelveBits(reader, ptrNodeData, 0) & 0x7FF); uint nextNodeDataOffset = (ushort)(Util.ExtractTwelveBits(reader, ptrNodeData, (ushort)(keyCount + 1))); Array.Resize(ref objects, (int)(objects.Length + keyCount)); for (int j = 0; j < keyCount; j++) { uint nodeOffset = Util.ExtractTwelveBits(reader, ptrNodeData, (uint)j + 1); var tmpOffset = (ptrNodeData + nodeOffset); objects[indexer] = new FileIDBTree(reader, ref tmpOffset); indexer++; } ptrNodeData += nextNodeDataOffset; } }
public static FileIDBTree Parse(EndianBinReader reader, uint offset) { FileIDBTree FileID = new FileIDBTree(reader, ref offset); return(FileID); }