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 });
                classID = type1;

                /*TODO 用来替换下方的代码
                 * if(classID == 114)
                 * {
                 *  a_Stream.Position += 16;
                 * }*/
                var temp = a_Stream.ReadInt32();
                if (temp == 0)
                {
                    a_Stream.Position += 16;
                }
                a_Stream.Position -= 4;
                if (type1 < 0)
                {
                    a_Stream.Position += 16;
                }
            }
            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;
                string varStrings = Encoding.UTF8.GetString(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
                    {
                        varTypeStr = varStrings.Substring(varTypeIndex, varStrings.IndexOf('\0', varTypeIndex) - varTypeIndex);
                    }                                                                                                          //substringToNull
                    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)
                    {
                        varNameStr = varStrings.Substring(varNameIndex, varStrings.IndexOf('\0', varNameIndex) - varNameIndex);
                    }
                    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
                        });
                    }
                }
                a_Stream.Position += stringSize;

                var aClass = new ClassStruct()
                {
                    ID = classID, Text = className, members = classVar
                };
                aClass.SubItems.Add(classID.ToString());
                ClassStructures[classID] = aClass;
            }
        }
Exemplo n.º 2
0
 public static void ReadClassStruct(StringBuilder sb, List <ClassMember> members, EndianBinaryReader a_Stream, int MumiCount = 0)
 {
     for (int i = 0; i < members.Count; i++)
     {
         var    member     = members[i];
         var    level      = member.Level;
         var    varTypeStr = member.Type;
         var    varNameStr = member.Name;
         object value      = null;
         var    align      = (member.Flag & 0x4000) != 0;
         var    append     = true;
         if (member.alignBefore)
         {
             a_Stream.AlignStream(4);
         }
         if (varTypeStr == "SInt8")//sbyte
         {
             value = a_Stream.ReadSByte();
         }
         else if (varTypeStr == "UInt8")//byte
         {
             value = a_Stream.ReadByte();
         }
         else if (varTypeStr == "short" || varTypeStr == "SInt16")//Int16
         {
             value = a_Stream.ReadInt16();
         }
         else if (varTypeStr == "UInt16" || varTypeStr == "unsigned short")//UInt16
         {
             value = a_Stream.ReadUInt16();
         }
         else if (varTypeStr == "int" || varTypeStr == "SInt32")//Int32
         {
             value = a_Stream.ReadInt32();
         }
         else if (varTypeStr == "UInt32" || varTypeStr == "unsigned int" || varTypeStr == "Type*")//UInt32
         {
             value = a_Stream.ReadUInt32();
         }
         else if (varTypeStr == "long long" || varTypeStr == "SInt64")//Int64
         {
             value = a_Stream.ReadInt64();
         }
         else if (varTypeStr == "UInt64" || varTypeStr == "unsigned long long")//UInt64
         {
             value = a_Stream.ReadUInt64();
         }
         else if (varTypeStr == "float")//float
         {
             value = a_Stream.ReadSingle();
             if (((float)value % 1) == 0)
             {
                 value = String.Format("{0:0.0}", value);
             }
         }
         else if (varTypeStr == "double")//double
         {
             value = a_Stream.ReadDouble();
             if (((double)value % 1) == 0)
             {
                 value = String.Format("{0:0.0}", value);
             }
         }
         else if (varTypeStr == "bool")//bool
         {
             value = a_Stream.ReadBoolean();
         }
         else if (varTypeStr == "string")//string
         {
             append = false;
             var str = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
             str = str.Replace("\r", "");
             str = str.Replace("\n", "\n" + (new string('\t', level + 1)));
             if (varNameStr == "data")
             {
                 sb.AppendFormat("{0}{2}_{4}: |\n {0}\t{3}\n", (new string('\t', level)), varTypeStr, "MumiWhy", str, MumiCount++);
             }
             else
             {
                 sb.AppendFormat("{0}{2}: |\n {0}\t{3}\n", (new string('\t', level)), varTypeStr, varNameStr, str);
             }
             i += 3;                     //skip
         }
         else if (varTypeStr == "Array") //Array
         {
             append = false;
             if ((members[i - 1].Flag & 0x4000) != 0)
             {
                 align = true;
             }
             //sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr); // Array Array
             var size = a_Stream.ReadInt32();
             //sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), "int", "size", size);
             var array = ReadArray(members, level, i);
             for (int j = 0; j < size; j++)
             {
                 //sb.AppendFormat("{0}[{1}]\r\n", (new string('\t', level + 1)), j);
                 ReadClassStruct(sb, array, a_Stream, MumiCount + i + j + 1);
             }
             i += array.Count + 1;//skip
         }
         else if (varTypeStr == "TypelessData")
         {
             append = false;
             var size = a_Stream.ReadInt32();
             a_Stream.ReadBytes(size);
             i += 2;
             sb.AppendFormat("{0}{2}\n", (new string('\t', level)), varTypeStr, varNameStr);
             //sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), "int", "size", size);
         }
         else
         {
             append = false;
             if (align)
             {
                 align = false;
                 SetAlignBefore(members, level, i + 1);
             }
             if (varNameStr == "data")
             {
                 sb.AppendFormat("{0}  - {2}:\n", (new string('\t', level - 1)), varTypeStr, "MumiWhy");
             }
             else
             {
                 sb.AppendFormat("{0}{2}:\n", (new string('\t', level)), varTypeStr, varNameStr);
             }
         }
         if (append)
         {
             if (varNameStr == "data")
             {
                 sb.AppendFormat("{0}{2}_{4}: {3}\n", (new string('\t', level)), varTypeStr, "MumiWhy", value, MumiCount++);
             }
             else
             {
                 sb.AppendFormat("{0}{2}: {3}\n", (new string('\t', level)), varTypeStr, varNameStr, value);
             }
         }
         if (align)
         {
             a_Stream.AlignStream(4);
         }
     }
 }
Exemplo n.º 3
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;
            }
        }