예제 #1
0
        private void ReadZones(EndianReader reader)
        {
            var squads = ReadSquads(reader, RootAddress);

            SquadHierarchy.DefaultZone.Squads.AddRange(squads.Where(e => e.ZoneIndex == -1));

            var blockNode = SquadHierarchy.AiNodes[AiSection.Zones];
            var blockRef  = new BlockReference(blockNode, reader, RootAddress);

            var name = OffsetById(blockNode, FieldId.Name);

            for (int i = 0; i < blockRef.TagBlock.Count; i++)
            {
                var zone        = new AiZone(blockRef, i);
                var baseAddress = blockRef.TagBlock.Pointer.Address + blockRef.BlockSize * i;

                reader.Seek(baseAddress + name, SeekOrigin.Begin);
                zone.Name = reader.ReadNullTerminatedString(32);

                ReadFiringPositions(reader, zone, baseAddress);
                ReadAreas(reader, zone, baseAddress);
                zone.Squads.AddRange(squads.Where(e => e.ZoneIndex == i));

                SquadHierarchy.Zones.Add(zone);
            }
        }
예제 #2
0
        private void ReadFiringPositions(EndianReader reader, AiZone owner, long rootAddress)
        {
            var blockNode = SquadHierarchy.AiNodes[AiSection.FiringPositions];
            var blockRef  = new BlockReference(blockNode, reader, rootAddress);

            var position = OffsetById(blockNode, FieldId.Position);

            for (int i = 0; i < blockRef.TagBlock.Count; i++)
            {
                var fpos        = new AiFiringPosition(this, owner, blockRef, i);
                var baseAddress = blockRef.TagBlock.Pointer.Address + blockRef.BlockSize * i;

                reader.Seek(baseAddress + position, SeekOrigin.Begin);
                fpos.Position = reader.ReadObject <RealVector3D>();

                owner.FiringPositions.Add(fpos);
            }
        }
예제 #3
0
        private void ReadAreas(EndianReader reader, AiZone owner, long rootAddress)
        {
            var blockNode = SquadHierarchy.AiNodes[AiSection.Areas];
            var blockRef  = new BlockReference(blockNode, reader, rootAddress);

            var name     = OffsetById(blockNode, FieldId.Name);
            var position = OffsetById(blockNode, FieldId.Position);

            for (int i = 0; i < blockRef.TagBlock.Count; i++)
            {
                var area        = new AiArea(this, owner, blockRef, i);
                var baseAddress = blockRef.TagBlock.Pointer.Address + blockRef.BlockSize * i;

                reader.Seek(baseAddress + name, SeekOrigin.Begin);
                area.Name = reader.ReadNullTerminatedString(32);

                reader.Seek(baseAddress + position, SeekOrigin.Begin);
                area.Position = reader.ReadObject <RealVector3D>();

                owner.Areas.Add(area);
            }
        }