private void ReadRdbObjects(BinaryReader reader, ref DFBlock.RdbObjectRoot objectRoot) { // Go to root of object linked list reader.BaseStream.Position = objectRoot.RootOffset; // Iterate through RDB objects linked list to build managed // array and collect baseline information about all objects. int index = 0; while (true) { // Read object data objectRoot.RdbObjects[index].This = (Int32)reader.BaseStream.Position; objectRoot.RdbObjects[index].Next = reader.ReadInt32(); objectRoot.RdbObjects[index].Previous = reader.ReadInt32(); objectRoot.RdbObjects[index].Index = index; objectRoot.RdbObjects[index].XPos = reader.ReadInt32(); objectRoot.RdbObjects[index].YPos = reader.ReadInt32(); objectRoot.RdbObjects[index].ZPos = reader.ReadInt32(); objectRoot.RdbObjects[index].Type = (DFBlock.RdbResourceTypes)reader.ReadByte(); objectRoot.RdbObjects[index].ResourceOffset = reader.ReadUInt32(); objectRoot.RdbObjects[index].Resources.ModelResource.ActionResource.PreviousObjectOffset = -1; objectRoot.RdbObjects[index].Resources.ModelResource.ActionResource.NextObjectIndex = -1; // Exit if finished if (objectRoot.RdbObjects[index].Next < 0) { break; } // Go to next offset in list reader.BaseStream.Position = objectRoot.RdbObjects[index].Next; // Increment index index++; } // Iterate through managed array to read specific resources for each object for (int i = 0; i < objectRoot.RdbObjects.Length; i++) { // Read resource-specific data switch (objectRoot.RdbObjects[i].Type) { case DFBlock.RdbResourceTypes.Model: ReadRdbModelResource(reader, ref objectRoot.RdbObjects[i], objectRoot.RdbObjects); break; case DFBlock.RdbResourceTypes.Flat: ReadRdbFlatResource(reader, ref objectRoot.RdbObjects[i]); break; case DFBlock.RdbResourceTypes.Light: ReadRdbLightResource(reader, ref objectRoot.RdbObjects[i]); break; default: throw (new Exception("Unknown RDB resource type encountered.")); } } }
private int CountRdbObjects(BinaryReader reader, ref DFBlock.RdbObjectRoot objectRoot) { // Go to root of object linked list reader.BaseStream.Position = objectRoot.RootOffset; // Count objects in list int objectCount = 0; while (true) { // Increment object count objectCount++; // Get next position and exit if finished long next = reader.ReadInt32(); if (next < 0) { break; } // Go to next offset in list reader.BaseStream.Position = next; } return(objectCount); }