Exemple #1
0
        private void ReadSectionTYPE(BinaryReaderEx br)
        {
            Types.Clear();

            Dictionary <string, BinaryReaderEx> sections = new Dictionary <string, BinaryReaderEx>();

            while (br.Position < br.Length)
            {
                var    sLength = br.ReadHKOffset();
                var    sName   = br.ReadASCII(4);
                byte[] data    = br.ReadBytes((int)(sLength - 8));
                sections.Add(sName, new BinaryReaderEx(false, data));
            }

            var typeStrings  = sections["TSTR"].ReadHKStringList();
            var fieldStrings = sections["FSTR"].ReadHKStringList();

            //TNAM
            br = sections["TNAM"];
            var typeCount = br.ReadHKPackedInt();

            Types = new List <HKType>();
            Types.Add(null);

            for (int i = 1; i < typeCount; i++)
            {
                var t = new HKType();
                Types.Add(t);
            }

            for (int i = 1; i < typeCount; i++)
            {
                Types[i].Name = typeStrings[(int)br.ReadHKPackedInt()];
                var templateCount = br.ReadHKPackedInt();
                for (int j = 0; j < templateCount; j++)
                {
                    var template = new HKTypeTemplate();
                    template.Name  = typeStrings[(int)br.ReadHKPackedInt()];
                    template.Value = br.ReadHKPackedInt();
                    Types[i].Templates.Add(template);
                }
            }

            //TBOD
            br = sections["TBOD"];
            while (br.Position < br.Length)
            {
                var typeIndex = br.ReadHKPackedInt();

                if (typeIndex == 0)
                {
                    continue;
                }

                var t = Types[(int)typeIndex];
                t.ParentTypeIndex = br.ReadHKPackedInt();
                t.Parent          = Types[(int)t.ParentTypeIndex];
                t.Flags           = (HKTagFlag)br.ReadHKPackedInt();

                if ((t.Flags & HKTagFlag.SubType) != 0)
                {
                    t.SubTypeFlags = br.ReadHKPackedInt();
                }

                if (((t.Flags & HKTagFlag.Pointer) != 0) && ((t.SubTypeFlags & 0xF) >= 6))
                {
                    t.PointerTypeIndex = br.ReadHKPackedInt();
                    t.Pointer          = Types[(int)t.PointerTypeIndex];
                }

                if ((t.Flags & HKTagFlag.Version) != 0)
                {
                    t.Version = br.ReadHKPackedInt();
                }

                if ((t.Flags & HKTagFlag.ByteSize) != 0)
                {
                    t.ByteSize  = br.ReadHKPackedInt();
                    t.Alignment = br.ReadHKPackedInt();
                }

                if ((t.Flags & HKTagFlag.AbstractValue) != 0)
                {
                    t.AbstractValue = br.ReadHKPackedInt();
                }

                if ((t.Flags & HKTagFlag.Members) != 0)
                {
                    uint memberCount = br.ReadHKPackedInt();
                    for (int i = 0; i < memberCount; i++)
                    {
                        var member = new HKMember();
                        member.Name       = fieldStrings[(int)br.ReadHKPackedInt()];
                        member.Flags      = br.ReadHKPackedInt();
                        member.ByteOffset = br.ReadHKPackedInt();
                        member.TypeIndex  = br.ReadHKPackedInt();
                        member.Type       = Types[(int)member.TypeIndex];
                        t.Members.Add(member);
                    }
                }

                if ((t.Flags & HKTagFlag.Interfaces) != 0)
                {
                    uint interfaceCount = br.ReadHKPackedInt();
                    for (int i = 0; i < interfaceCount; i++)
                    {
                        var inter = new HKInterface();
                        inter.TypeIndex = br.ReadHKPackedInt();
                        inter.Type      = Types[(int)inter.TypeIndex];
                        inter.Value     = br.ReadHKPackedInt();
                        t.Interfaces.Add(inter);
                    }
                }

                if ((t.Flags & HKTagFlag.Unknown) != 0)
                {
                    throw new NotImplementedException("Didn't know 'HKTagFlag.Unknown' was used.");
                }
            }

            //THSH
            br = sections["THSH"];
            var hashCount = br.ReadHKPackedInt();

            for (int i = 0; i < hashCount; i++)
            {
                var hashTypeIndex = br.ReadHKPackedInt();
                var hashValue     = br.ReadUInt32();
                Types[(int)hashTypeIndex].Hash = hashValue;
            }
        }
 public void Add(HKType key, int timing)
 {
     CraftingTimingInMiliseconds.Add(key, timing);
     TotalTimeInMiliseconds += timing;
 }