Пример #1
0
        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);
        }
Пример #2
0
        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;
            }
        }
Пример #3
0
        public static FileIDBTree Parse(EndianBinReader reader, uint offset)
        {
            FileIDBTree FileID = new FileIDBTree(reader, ref offset);

            return(FileID);
        }