Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
        }