Пример #1
0
        /// <summary>
        /// Read block subrecords, i.e. the resources embedded in block data.
        /// </summary>
        /// <param name="reader">A binary reader to file</param>
        /// <param name="blockData">Destination record index</param>
        private void ReadRmbBlockSubRecord(BinaryReader reader, ref DFBlock.RmbBlockData blockData)
        {
            // Header
            blockData.Header.Position             = reader.BaseStream.Position;
            blockData.Header.Num3dObjectRecords   = reader.ReadByte();
            blockData.Header.NumFlatObjectRecords = reader.ReadByte();
            blockData.Header.NumSection3Records   = reader.ReadByte();
            blockData.Header.NumPeopleRecords     = reader.ReadByte();
            blockData.Header.NumDoorRecords       = reader.ReadByte();
            blockData.Header.Unknown1             = reader.ReadInt16();
            blockData.Header.Unknown2             = reader.ReadInt16();
            blockData.Header.Unknown3             = reader.ReadInt16();
            blockData.Header.Unknown4             = reader.ReadInt16();
            blockData.Header.Unknown5             = reader.ReadInt16();
            blockData.Header.Unknown6             = reader.ReadInt16();

            // 3D object records
            blockData.Block3dObjectRecords = new DFBlock.RmbBlock3dObjectRecord[blockData.Header.Num3dObjectRecords];
            ReadRmbModelRecords(reader, ref blockData.Block3dObjectRecords);

            // Flat object record
            blockData.BlockFlatObjectRecords = new DFBlock.RmbBlockFlatObjectRecord[blockData.Header.NumFlatObjectRecords];
            ReadRmbFlatObjectRecords(reader, ref blockData.BlockFlatObjectRecords);

            // Section3 records
            int numSection3Records = blockData.Header.NumSection3Records;

            blockData.BlockSection3Records = new DFBlock.RmbBlockSection3Record[numSection3Records];
            for (int i = 0; i < numSection3Records; i++)
            {
                blockData.BlockSection3Records[i].XPos     = reader.ReadInt32();
                blockData.BlockSection3Records[i].YPos     = reader.ReadInt32();
                blockData.BlockSection3Records[i].ZPos     = reader.ReadInt32();
                blockData.BlockSection3Records[i].Unknown1 = reader.ReadByte();
                blockData.BlockSection3Records[i].Unknown2 = reader.ReadByte();
                blockData.BlockSection3Records[i].Unknown3 = reader.ReadInt16();
            }

            // People records
            int numPeopleRecords = blockData.Header.NumPeopleRecords;

            blockData.BlockPeopleRecords = new DFBlock.RmbBlockPeopleRecord[numPeopleRecords];
            for (int i = 0; i < numPeopleRecords; i++)
            {
                blockData.BlockPeopleRecords[i].XPos            = reader.ReadInt32();
                blockData.BlockPeopleRecords[i].YPos            = reader.ReadInt32();
                blockData.BlockPeopleRecords[i].ZPos            = reader.ReadInt32();
                blockData.BlockPeopleRecords[i].TextureBitfield = reader.ReadUInt16();
                blockData.BlockPeopleRecords[i].TextureArchive  = blockData.BlockPeopleRecords[i].TextureBitfield >> 7;
                blockData.BlockPeopleRecords[i].TextureRecord   = blockData.BlockPeopleRecords[i].TextureBitfield & 0x7f;
                blockData.BlockPeopleRecords[i].NpcType         = reader.ReadInt16();
                blockData.BlockPeopleRecords[i].Unknown1        = reader.ReadByte();
            }

            // Door records
            int numDoorRecords = blockData.Header.NumDoorRecords;

            blockData.BlockDoorRecords = new DFBlock.RmbBlockDoorRecord[numDoorRecords];
            for (int i = 0; i < numDoorRecords; i++)
            {
                blockData.BlockDoorRecords[i].This         = (Int32)reader.BaseStream.Position;
                blockData.BlockDoorRecords[i].XPos         = reader.ReadInt32();
                blockData.BlockDoorRecords[i].YPos         = reader.ReadInt32();
                blockData.BlockDoorRecords[i].ZPos         = reader.ReadInt32();
                blockData.BlockDoorRecords[i].YRotation    = reader.ReadInt16();
                blockData.BlockDoorRecords[i].OpenRotation = reader.ReadInt16();
                blockData.BlockDoorRecords[i].Unknown3     = reader.ReadInt16();
                blockData.BlockDoorRecords[i].NullValue1   = reader.ReadByte();
            }
        }
        /// <summary>
        /// Read block subrecords, i.e. the resources embedded in block data.
        /// </summary>
        /// <param name="Reader">A binary reader to file</param>
        /// <param name="BlockData">Destination record index</param>
        private void ReadRmbBlockSubRecord(ref BinaryReader Reader, ref DFBlock.RmbBlockData BlockData)
        {
            // Header
            BlockData.Header.Position             = Reader.BaseStream.Position;
            BlockData.Header.Num3dObjectRecords   = Reader.ReadByte();
            BlockData.Header.NumFlatObjectRecords = Reader.ReadByte();
            BlockData.Header.NumSection3Records   = Reader.ReadByte();
            BlockData.Header.NumPeopleRecords     = Reader.ReadByte();
            BlockData.Header.NumDoorRecords       = Reader.ReadByte();
            BlockData.Header.Unknown1             = Reader.ReadInt16();
            BlockData.Header.Unknown2             = Reader.ReadInt16();
            BlockData.Header.Unknown3             = Reader.ReadInt16();
            BlockData.Header.Unknown4             = Reader.ReadInt16();
            BlockData.Header.Unknown5             = Reader.ReadInt16();
            BlockData.Header.Unknown6             = Reader.ReadInt16();

            // 3D object records
            BlockData.Block3dObjectRecords = new DFBlock.RmbBlock3dObjectRecord[BlockData.Header.Num3dObjectRecords];
            ReadRmbModelRecords(ref Reader, ref BlockData.Block3dObjectRecords);

            // Flat object record
            BlockData.BlockFlatObjectRecords = new DFBlock.RmbBlockFlatObjectRecord[BlockData.Header.NumFlatObjectRecords];
            ReadRmbFlatObjectRecords(ref Reader, ref BlockData.BlockFlatObjectRecords);

            // Section3 records
            int numSection3Records = BlockData.Header.NumSection3Records;

            BlockData.BlockSection3Records = new DFBlock.RmbBlockSection3Record[numSection3Records];
            for (int i = 0; i < numSection3Records; i++)
            {
                BlockData.BlockSection3Records[i].XPos     = Reader.ReadInt32();
                BlockData.BlockSection3Records[i].YPos     = Reader.ReadInt32();
                BlockData.BlockSection3Records[i].ZPos     = Reader.ReadInt32();
                BlockData.BlockSection3Records[i].Unknown1 = Reader.ReadByte();
                BlockData.BlockSection3Records[i].Unknown2 = Reader.ReadByte();
                BlockData.BlockSection3Records[i].Unknown3 = Reader.ReadInt16();
            }

            // People records
            int numPeopleRecords = BlockData.Header.NumPeopleRecords;

            BlockData.BlockPeopleRecords = new DFBlock.RmbBlockPeopleRecord[numPeopleRecords];
            for (int i = 0; i < numPeopleRecords; i++)
            {
                BlockData.BlockPeopleRecords[i].XPos            = Reader.ReadInt32();
                BlockData.BlockPeopleRecords[i].YPos            = Reader.ReadInt32();
                BlockData.BlockPeopleRecords[i].ZPos            = Reader.ReadInt32();
                BlockData.BlockPeopleRecords[i].TextureBitfield = Reader.ReadUInt16();
                BlockData.BlockPeopleRecords[i].TextureArchive  = BlockData.BlockPeopleRecords[i].TextureBitfield >> 7;
                BlockData.BlockPeopleRecords[i].TextureRecord   = BlockData.BlockPeopleRecords[i].TextureBitfield & 0x7f;
                BlockData.BlockPeopleRecords[i].NpcType         = Reader.ReadInt16();
                BlockData.BlockPeopleRecords[i].Unknown1        = Reader.ReadByte();
            }

            // Door records
            int numDoorRecords = BlockData.Header.NumDoorRecords;

            BlockData.BlockDoorRecords = new DFBlock.RmbBlockDoorRecord[numDoorRecords];
            for (int i = 0; i < numDoorRecords; i++)
            {
                BlockData.BlockDoorRecords[i].XPos       = Reader.ReadInt32();
                BlockData.BlockDoorRecords[i].YPos       = Reader.ReadInt32();
                BlockData.BlockDoorRecords[i].ZPos       = Reader.ReadInt32();
                BlockData.BlockDoorRecords[i].Unknown1   = Reader.ReadInt16();
                BlockData.BlockDoorRecords[i].Unknown2   = Reader.ReadInt16();
                BlockData.BlockDoorRecords[i].Unknown3   = Reader.ReadInt16();
                BlockData.BlockDoorRecords[i].NullValue1 = Reader.ReadByte();
            }
        }