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