LSLib.Granny.GR2.GR2Reader.ReadMemberDefinition C# (CSharp) Method

ReadMemberDefinition() public method

public ReadMemberDefinition ( ) : MemberDefinition
return MemberDefinition
        public MemberDefinition ReadMemberDefinition()
        {
#if DEBUG_GR2_SERIALIZATION
            var defnOffset = Stream.Position;
#endif
            var defn = new MemberDefinition();
            int typeId = Reader.ReadInt32();
            if (typeId > (uint)MemberType.Max)
                throw new ParsingException(String.Format("Unsupported member type: {0}", typeId));

            defn.Type = (MemberType)typeId;
            var name = ReadStringReference();
            Debug.Assert(!defn.IsValid || name.IsValid);
            if (defn.IsValid)
            {
                defn.Name = name.Resolve(this);
                defn.GrannyName = defn.Name;
            }
            defn.Definition = ReadStructReference();
            defn.ArraySize = Reader.ReadUInt32();
            defn.Extra = new UInt32[MemberDefinition.ExtraTagCount];
            for (var i = 0; i < MemberDefinition.ExtraTagCount; i++)
                defn.Extra[i] = Reader.ReadUInt32();
            // TODO 64-bit: ???
            if (Magic.Is32Bit)
                defn.Unknown = Reader.ReadUInt32();
            else
                defn.Unknown = (UInt32)Reader.ReadUInt64();

            Debug.Assert(defn.Unknown == 0);

            if (defn.Type == MemberType.Inline || defn.Type == MemberType.Reference || defn.Type == MemberType.ArrayOfReferences ||
                defn.Type == MemberType.ReferenceToArray)
                Debug.Assert(defn.Definition.IsValid);

#if DEBUG_GR2_SERIALIZATION
            string description;
            if (defn.IsValid)
            {
                if (defn.ArraySize != 0)
                    description = String.Format("    [{0:X8}] {1}: {2}[{3}]", defnOffset, defn.Name, defn.Type.ToString(), defn.ArraySize);
                else
                    description = String.Format("    [{0:X8}] {1}: {2}", defnOffset, defn.Name, defn.Type.ToString());

                if (defn.Definition.IsValid)
                {
                    if (!DebugPendingResolve.Contains(defn.Definition))
                    {
                        DebugPendingResolve.Add(defn.Definition);
                        System.Console.WriteLine(String.Format(" ===== Debug resolve for {0:X8} ===== ", defn.Definition.Offset));
                        defn.Definition.Resolve(this);
                        System.Console.WriteLine(String.Format(" ===== End debug resolve for {0:X8} ===== ", defn.Definition.Offset));
                    }
                    description += String.Format(" <struct {0:X8}>", defn.Definition.Offset);
                }

                if (defn.Extra[0] != 0 || defn.Extra[1] != 0 || defn.Extra[2] != 0)
                    description += String.Format(" Extra: {0} {1} {2}", defn.Extra[0], defn.Extra[1], defn.Extra[2]);
            }
            else
            {
                description = String.Format("    <invalid>: {0}", defn.Type.ToString());
            }

            System.Console.WriteLine(description);
#endif
            return defn;
        }