private void ReadEncounters(EndianReader reader, AiSquad owner, long rootAddress) { var blockNode = SquadHierarchy.AiNodes[AiSection.Encounters]; var blockRef = new BlockReference(blockNode, reader, rootAddress); for (int i = 0; i < blockRef.TagBlock.Count; i++) { var enc = new AiEncounter(blockRef, i) { Name = $"Encounter {i}" }; var baseAddress = blockRef.TagBlock.Pointer.Address + blockRef.BlockSize * i; enc.StartingLocations.AddRange(ReadStartingLocations(reader, baseAddress, AiSection.StartLocations)); owner.Encounters.Add(enc); } }
private List <AiSquad> ReadSquads(EndianReader reader, long rootAddress) { var results = new List <AiSquad>(); var blockNode = SquadHierarchy.AiNodes[AiSection.Squads]; var blockRef = new BlockReference(blockNode, reader, rootAddress); var name = OffsetById(blockNode, FieldId.Name); var parentIndex = OffsetById(blockNode, FieldId.ParentIndex); for (int i = 0; i < blockRef.TagBlock.Count; i++) { var squad = new AiSquad(blockRef, i); var baseAddress = blockRef.TagBlock.Pointer.Address + blockRef.BlockSize * i; reader.Seek(baseAddress + name, SeekOrigin.Begin); squad.Name = reader.ReadNullTerminatedString(32); reader.Seek(baseAddress + parentIndex, SeekOrigin.Begin); squad.ZoneIndex = reader.ReadInt16(); if (ScenarioTag.CacheFile.CacheType < CacheType.Halo3ODST) { ReadEncounters(reader, squad, baseAddress); } else { squad.GroupStartLocations.AddRange(ReadStartingLocations(reader, baseAddress, AiSection.GroupSTartLocations)); squad.SoloStartLocations.AddRange(ReadStartingLocations(reader, baseAddress, AiSection.SoloStartLocations)); } results.Add(squad); } return(results); }