Exemplo n.º 1
0
        private void readBase5()
        {
            int classID = a_Stream.ReadInt32();

            if (fileGen > 15)//5.5.0 and up
            {
                a_Stream.ReadByte();
                int type1;
                if ((type1 = a_Stream.ReadInt16()) >= 0)
                {
                    type1 = -1 - type1;
                }
                else
                {
                    type1 = classID;
                }
                classIDs.Add(new[] { type1, classID });
                if (classID == 114)
                {
                    a_Stream.Position += 16;
                }
                classID = type1;
            }
            else if (classID < 0)
            {
                a_Stream.Position += 16;
            }
            a_Stream.Position += 16;

            if (baseDefinitions)
            {
                int varCount   = a_Stream.ReadInt32();
                int stringSize = a_Stream.ReadInt32();

                a_Stream.Position += varCount * 24;
                var    stringReader = new EndianBinaryReader(new MemoryStream(a_Stream.ReadBytes(stringSize)));
                string className    = "";
                var    classVar     = new List <ClassMember>();
                //build Class Structures
                a_Stream.Position -= varCount * 24 + stringSize;
                for (int i = 0; i < varCount; i++)
                {
                    ushort num0    = a_Stream.ReadUInt16();
                    byte   level   = a_Stream.ReadByte();
                    bool   isArray = a_Stream.ReadBoolean();

                    ushort varTypeIndex = a_Stream.ReadUInt16();
                    ushort test         = a_Stream.ReadUInt16();
                    string varTypeStr;
                    if (test == 0) //varType is an offset in the string block
                    {
                        stringReader.Position = varTypeIndex;
                        varTypeStr            = stringReader.ReadStringToNull();
                    }
                    else //varType is an index in an internal strig array
                    {
                        varTypeStr = baseStrings.ContainsKey(varTypeIndex) ? baseStrings[varTypeIndex] : varTypeIndex.ToString();
                    }

                    ushort varNameIndex = a_Stream.ReadUInt16();
                    test = a_Stream.ReadUInt16();
                    string varNameStr;
                    if (test == 0)
                    {
                        stringReader.Position = varNameIndex;
                        varNameStr            = stringReader.ReadStringToNull();
                    }
                    else
                    {
                        varNameStr = baseStrings.ContainsKey(varNameIndex) ? baseStrings[varNameIndex] : varNameIndex.ToString();
                    }

                    int size  = a_Stream.ReadInt32();
                    int index = a_Stream.ReadInt32();
                    int flag  = a_Stream.ReadInt32();

                    if (index == 0)
                    {
                        className = varTypeStr + " " + varNameStr;
                    }
                    else
                    {
                        classVar.Add(new ClassMember()
                        {
                            Level = level - 1,
                            Type  = varTypeStr,
                            Name  = varNameStr,
                            Size  = size,
                            Flag  = flag
                        });
                    }
                }
                stringReader.Dispose();
                a_Stream.Position += stringSize;

                var aClass = new ClassStruct()
                {
                    ID = classID, Text = className, members = classVar
                };
                aClass.SubItems.Add(classID.ToString());
                ClassStructures[classID] = aClass;
            }
        }