Beispiel #1
0
        public CStructureInfo CreateLocaleTable()
        {
            var stringFields = Members.Where(m => m.FormattedTypeName == "LocalizedString*")
                               .Select(m =>
            {
                var m2 = new CStructureMemberInfo()
                {
                    TypeName  = m.TypeName,
                    Name      = m.Name.Replace("_lang", "").Replace("_loc", ""),
                    ArraySize = m.ArraySize
                };

                var indexOfArray = m.Name.LastIndexOf('[');
                if (indexOfArray != -1)
                {
                    m2.Name = m2.Name.Insert(indexOfArray, "_lang");
                }
                else
                {
                    m2.Name += "_lang";
                }

                return(m2);
            }).ToList();

            if (stringFields.Count == 0)
            {
                return(null);
            }

            stringFields.Insert(0, new CStructureMemberInfo()
            {
                TypeName = "uint32",
                Name     = "ID"
            });
            stringFields.Insert(1, new CStructureMemberInfo()
            {
                TypeName = "char[4]",
                Name     = "locale"
            });
            stringFields.Add(new CStructureMemberInfo()
            {
                TypeName = "int16",
                Name     = "VerifiedBuild"
            });

            var localeStruct = new CStructureInfo();

            localeStruct.Name     = Name + "Locale";
            localeStruct.Members  = stringFields;
            localeStruct.IsLocale = true;
            return(localeStruct);
        }
        public CStructureInfo CreateLocaleTable()
        {
            var stringFields = Members.Where(m => m.TypeName == "LocalizedString*")
                .Select(m =>
                {
                    var m2 = new CStructureMemberInfo()
                    {
                        TypeName = m.TypeName,
                        Name = m.Name.Replace("_lang", "").Replace("_loc", "")
                    };

                    var indexOfArray = m.Name.LastIndexOf('[');
                    if (indexOfArray != -1)
                        m2.Name = m2.Name.Insert(indexOfArray, "_lang");
                    else
                        m2.Name += "_lang";

                    return m2;
                }).ToList();

            if (stringFields.Count == 0)
                return null;

            stringFields.Insert(0, Members.First());
            stringFields.Insert(1, new CStructureMemberInfo()
            {
                TypeName = "char[4]",
                Name = "locale"
            });
            stringFields.Add(new CStructureMemberInfo()
            {
                TypeName = "int16",
                Name = "VerifiedBuild"
            });

            var localeStruct = new CStructureInfo();
            localeStruct.Name = Name + "Locale";
            localeStruct.Members = stringFields;
            return localeStruct;
        }
        private static void DumpStructureMember(StreamWriter output, LimitedLineLengthStringBuilder query, CStructureMemberInfo member)
        {
            var arraySize = member.ArraySize;

            string typeInfo;

            if (!MySQLTypeMap.TryGetValue(member.FormattedTypeName, out typeInfo))
            {
                typeInfo = "ERROR TYPE" + member.TypeName;
            }

            if (member.TypeName == "flag128")
            {
                arraySize = 4;
                typeInfo  = MySQLTypeMap["uint32"];
            }

            for (var i = 0; i < arraySize; ++i)
            {
                var memberName = member.Name;
                if (arraySize > 1)
                {
                    var langPos = memberName.IndexOf("_lang");
                    if (langPos == -1)
                    {
                        memberName += (i + 1).ToString();
                    }
                    else
                    {
                        memberName = memberName.Insert(langPos, (i + 1).ToString());
                    }
                }

                if (!typeInfo.Contains("ERROR"))
                {
                    DumpStructureMemberName(output, query, memberName, typeInfo);
                }
                else
                {
                    switch (member.TypeName)
                    {
                    case "DBCPosition3D":
                        DumpStructureMemberName(output, query, memberName + "X", MySQLTypeMap["float"]);
                        DumpStructureMemberName(output, query, memberName + "Y", MySQLTypeMap["float"]);
                        DumpStructureMemberName(output, query, memberName + "Z", MySQLTypeMap["float"]);
                        break;

                    case "DBCPosition2D":
                        DumpStructureMemberName(output, query, memberName + "X", MySQLTypeMap["float"]);
                        DumpStructureMemberName(output, query, memberName + "Y", MySQLTypeMap["float"]);
                        break;

                    default:
                        output.WriteLine($"  `{memberName}` ERROR TYPE {member.TypeName},");
                        break;
                    }
                }
            }
        }
        private static void DumpStructureMember(StreamWriter output, LimitedLineLengthStringBuilder query, CStructureMemberInfo member)
        {
            var arraySize = 1;
            var indexOfArray = member.Name.IndexOf('[');
            if (indexOfArray != -1)
            {
                var arrayDef = member.Name.Substring(indexOfArray);
                if (!_parser.ArraySizes.TryGetValue(arrayDef, out arraySize))
                    if (!int.TryParse(arrayDef.Substring(1, arrayDef.Length - 2), out arraySize))
                        arraySize = 1;
            }

            string typeInfo;
            if (!MySQLTypeMap.TryGetValue(member.TypeName, out typeInfo))
                typeInfo = "ERROR TYPE" + member.TypeName;

            if (member.TypeName == "flag128")
            {
                arraySize = 4;
                typeInfo = MySQLTypeMap["uint32"];
            }

            for (var i = 0; i < arraySize; ++i)
            {
                var memberName = member.Name;
                if (indexOfArray != -1)
                    memberName = member.Name.Substring(0, indexOfArray);

                if (arraySize > 1)
                {
                    var langPos = memberName.IndexOf("_lang");
                    if (langPos == -1)
                        memberName += (i + 1).ToString();
                    else
                        memberName = memberName.Insert(langPos, (i + 1).ToString());
                }

                if (!typeInfo.Contains("ERROR"))
                {
                    DumpStructureMemberName(output, query, memberName, typeInfo);
                }
                else
                {
                    switch (member.TypeName)
                    {
                        case "DBCPosition3D":
                            DumpStructureMemberName(output, query, memberName + "X", MySQLTypeMap["float"]);
                            DumpStructureMemberName(output, query, memberName + "Y", MySQLTypeMap["float"]);
                            DumpStructureMemberName(output, query, memberName + "Z", MySQLTypeMap["float"]);
                            break;
                        case "DBCPosition2D":
                            DumpStructureMemberName(output, query, memberName + "X", MySQLTypeMap["float"]);
                            DumpStructureMemberName(output, query, memberName + "Y", MySQLTypeMap["float"]);
                            break;
                        default:
                            output.WriteLine(String.Format("  `{0}` {1},", memberName, "ERROR TYPE " + member.TypeName));
                            break;
                    }
                }
            }
        }
        public void ParseStructure(string name)
        {
            var structure = new CStructureInfo();
            structure.Name = name.Replace("Entry", "");
            structure.Members = new List<CStructureMemberInfo>();
            _stream.ReadLine();
            var line = _stream.ReadLine();
            while (line != "};")
            {
                line = line.Trim();
                var comment = line.IndexOf("//");
                if (comment != -1)
                    line = line.Substring(0, comment);

                if (!line.Contains('('))
                {
                    var tokens = line.Split(' ', ';', '/').Where(t => t.Length != 0).ToArray();
                    if (tokens.Length >= 2)
                    {
                        var member = new CStructureMemberInfo();
                        member.TypeName = tokens[0];
                        member.Name = tokens[1].Replace("_lang", "").Replace("_loc", "");
                        structure.Members.Add(member);
                    }
                }

                line = _stream.ReadLine();
            }

            if (name.Contains("Entry"))
            {
                structure.Members.Add(new CStructureMemberInfo()
                {
                    TypeName = "int16",
                    Name = "VerifiedBuild"
                });
                Structures.Add(structure);
                var localeStruct = structure.CreateLocaleTable();
                if (localeStruct != null)
                    Structures.Add(localeStruct);
            }
        }