Esempio n. 1
0
        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."));
                }
            }
        }
Esempio n. 2
0
        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);
        }