/// <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(); } }