Exemplo n.º 1
0
 /// <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)));
 }
Exemplo n.º 2
0
 /// <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));
 }
Exemplo n.º 3
0
 /// <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)));
 }
Exemplo n.º 4
0
        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));
            }
        }