Esempio n. 1
0
        private static ClassMember ReadClassMember(EndianBinaryReader reader, int level, string baseType, string baseName)
        {
            var varType       = reader.ReadStringToNull();
            var varName       = reader.ReadStringToNull();
            var size          = reader.ReadInt32();
            var index         = reader.ReadInt32();
            var isArray       = reader.ReadInt32() != 0;
            var dummy         = reader.ReadInt32();
            var flags         = reader.ReadInt32();
            var childrenCount = reader.ReadInt32();

            var children = new List <ClassMember>();

            for (var i = 0; i < childrenCount; ++i)
            {
                var member = ReadClassMember(reader, level + 1, varType, varName);
                children.Add(member);
            }

            var classMember = new ClassMember(level, baseType, baseName, varType, varName, size, flags, children);

            return(classMember);
        }
Esempio n. 2
0
        private void ReadClassMember5(EndianBinaryReader reader, int fileFormatVersion, bool baseDefinitions)
        {
            var classID = reader.ReadInt32();

            if (fileFormatVersion > 15)
            {
                reader.ReadByte();
                var type1 = (int)reader.ReadInt16();
                if (type1 >= 0)
                {
                    type1 = -(1 + type1);
                }
                else
                {
                    type1 = classID;
                }

                var classIDs = _classIDs ?? (_classIDs = new List <(int Type1, int Type2)>());
                classIDs.Add((type1, classID));

                if (classID == 114)
                {
                    reader.Position += 16;
                }

                classID = type1;
            }
            else if (classID < 0)
            {
                reader.Position += 16;
            }
            reader.Position += 16;

            if (baseDefinitions)
            {
                var varCount   = reader.ReadInt32();
                var stringSize = reader.ReadInt32();

                reader.Position += varCount * 24;

                var stringBlockData = reader.ReadBytes(stringSize);

                var classVars = new List <ClassMember>();
                reader.Position -= varCount * 24 + stringSize;

                string baseName = null, baseType = null;
                int    baseSize = 0, baseIndex = 0, baseFlags = 0;

                using (var stringBlockMemory = new MemoryStream(stringBlockData, false)) {
                    using (var stringReader = new EndianBinaryReader(stringBlockMemory, Endian.BigEndian)) {
                        for (var i = 0; i < varCount; ++i)
                        {
                            var dummy   = reader.ReadInt16();
                            var level   = reader.ReadByte();
                            var isArray = reader.ReadBoolean();

                            var    varTypeIndex      = reader.ReadUInt16();
                            var    isUserDefinedName = reader.ReadUInt16();
                            string varTypeStr;

                            if (isUserDefinedName == 0)
                            {
                                stringReader.Position = varTypeIndex;
                                varTypeStr            = stringReader.ReadStringToNull();
                            }
                            else
                            {
                                varTypeStr = CommonStrings.ContainsKey(varTypeIndex) ? CommonStrings[varTypeIndex] : varTypeIndex.ToString();
                            }

                            var varNameIndex = reader.ReadUInt16();
                            isUserDefinedName = reader.ReadUInt16();
                            string varNameStr;

                            if (isUserDefinedName == 0)
                            {
                                stringReader.Position = varNameIndex;
                                varNameStr            = stringReader.ReadStringToNull();
                            }
                            else
                            {
                                varNameStr = CommonStrings.ContainsKey(varNameIndex) ? CommonStrings[varNameIndex] : varNameIndex.ToString();
                            }

                            var size  = reader.ReadInt32();
                            var index = reader.ReadInt32();
                            var flags = reader.ReadInt32();

                            if (index == 0)
                            {
                                baseName  = varNameStr;
                                baseType  = varTypeStr;
                                baseSize  = size;
                                baseIndex = index;
                                baseFlags = flags;
                            }
                            else
                            {
                                var member = new ClassMember(level - 1, baseType, baseName, varTypeStr, varNameStr, size, flags, null);
                                classVars.Add(member);
                            }
                        }
                    }
                }

                var baseMember = new ClassMember(0, string.Empty, string.Empty, baseType, baseName, baseSize, baseFlags, classVars);
                _objects[classID] = baseMember;

                reader.Position += stringSize;
            }
        }