/// <summary> /// Finds all tags with a given class. /// </summary> /// <param name="tagClass">The tag class.</param> /// <returns>All tags with the given class.</returns> public IEnumerable <HaloTag> FindAllByClass(MagicNumber tagClass) { return(_tags.Where(t => t != null && (t.Class == tagClass || t.ParentClass == tagClass || t.GrandparentClass == tagClass))); }
/// <summary> /// Determines whether or not a tag with the given class exists. /// </summary> /// <param name="tagClass">The tag class.</param> /// <returns><c>true</c> if a tag with the given class exists.</returns> public bool ContainsClass(MagicNumber tagClass) { return(_tagClasses.Contains(tagClass)); }
/// <summary> /// Finds the first tag with a given class. /// </summary> /// <param name="tagClass">The tag class.</param> /// <returns>The first tag with the given class, or <c>null</c> otherwise.</returns> public HaloTag FindFirstByClass(MagicNumber tagClass) { return(_tags.FirstOrDefault(t => t != null && (t.Class == tagClass || t.ParentClass == tagClass || t.GrandparentClass == tagClass))); }
private void ReadTagHeader(BinaryReader reader, HaloTag resultTag) { var headerOffset = (uint)reader.BaseStream.Position; var checksum = reader.ReadUInt32(); // 0x00 uint32 checksum? var totalSize = reader.ReadUInt32(); // 0x04 uint32 total size var numDependencies = reader.ReadInt16(); // 0x08 int16 dependencies count var numDataFixups = reader.ReadInt16(); // 0x0A int16 data fixup count var numResourceFixups = reader.ReadInt16(); // 0x0C int16 resource fixup count reader.BaseStream.Position += 2; // 0x0E int16 (padding) var mainStructOffset = reader.ReadUInt32(); // 0x10 uint32 main struct offset var tagClass = new MagicNumber(reader.ReadInt32()); // 0x14 int32 class var parentClass = new MagicNumber(reader.ReadInt32()); // 0x18 int32 parent class var grandparentClass = new MagicNumber(reader.ReadInt32()); // 0x1C int32 grandparent class var classId = reader.ReadInt32(); // 0x20 uint32 class stringid var totalHeaderSize = CalculateHeaderSize(numDependencies, numDataFixups, numResourceFixups); // Update the tag object _tagClasses.Add(tagClass); resultTag.Class = tagClass; resultTag.ParentClass = parentClass; resultTag.GrandparentClass = grandparentClass; resultTag.MainStructOffset = mainStructOffset - totalHeaderSize; resultTag.Offset = headerOffset + totalHeaderSize; resultTag.Size = totalSize - totalHeaderSize; resultTag.Checksum = checksum; resultTag.ClassId = classId; // Read dependencies resultTag.Dependencies.Clear(); for (var j = 0; j < numDependencies; j++) { resultTag.Dependencies.Add(reader.ReadInt32()); } // Read fixup pointers var dataFixupPointers = new uint[numDataFixups]; for (var j = 0; j < numDataFixups; j++) { dataFixupPointers[j] = reader.ReadUInt32(); } var resourceFixupPointers = new uint[numResourceFixups]; for (var j = 0; j < numResourceFixups; j++) { resourceFixupPointers[j] = reader.ReadUInt32(); } // Process fixups resultTag.DataFixups.Clear(); resultTag.ResourceFixups.Clear(); foreach (var fixup in dataFixupPointers) { resultTag.DataFixups.Add(ReadFixup(reader, fixup, headerOffset, totalHeaderSize)); } foreach (var fixup in resourceFixupPointers) { resultTag.ResourceFixups.Add(ReadFixup(reader, fixup, headerOffset, totalHeaderSize)); } }