Пример #1
0
        private static void BdatToHtmlArchive(string arhFilename, string ardFilename, string htmlDir)
        {
            var watch = Stopwatch.StartNew();
            BdatStringCollection tables = DeserializeBdatStringArchive(arhFilename, ardFilename);

            watch.Stop();
            Console.WriteLine(watch.Elapsed.TotalMilliseconds);

            BdatInfo info = BdatInfoImport.GetBdatInfo(tables);

            BdatStringTools.ProcessReferences(tables, info);

            watch.Restart();
            HtmlGen.OutputHtml(tables, info, htmlDir);
            watch.Stop();
            Console.WriteLine(watch.Elapsed.TotalMilliseconds);
        }
Пример #2
0
        public static void PrintSeparateTables(BdatStringCollection bdats, BdatInfo info, string htmlDir)
        {
            string bdatHtmlDir = Path.Combine(htmlDir, "bdat");

            Directory.CreateDirectory(htmlDir);

            PrintIndex(bdats, htmlDir);
            foreach (string tableName in bdats.Tables.Keys)
            {
                string outDir        = bdatHtmlDir;
                string tableFilename = bdats[tableName].Filename;
                var    indexPath     = tableFilename == null ? "../index.html" : "../../index.html";

                var sb = new Indenter(2);
                sb.AppendLine("<!DOCTYPE html>");
                sb.AppendLineAndIncrease("<html>");
                sb.AppendLineAndIncrease("<head>");
                sb.AppendLine("<meta charset=\"utf-8\" />");
                sb.AppendLine($"<title>{tableName}</title>");
                sb.AppendLineAndIncrease("<script>");
                sb.AppendLine(JsOpenAll);
                sb.DecreaseAndAppendLine("</script>");
                sb.DecreaseAndAppendLine("</head>");

                sb.AppendLineAndIncrease("<body>");
                sb.AppendLine($"<a href=\"{indexPath}\">Return to BDAT index</a><br/>");
                sb.AppendLine("<input type=\"button\" value=\"Open all references\" onclick=\"openAll(true)\" />");
                sb.AppendLine("<input type=\"button\" value=\"Close all references\" onclick=\"openAll(false)\" />");
                PrintTable(bdats, info, tableName, sb);
                sb.DecreaseAndAppendLine("</body>");
                sb.DecreaseAndAppendLine("</html>");

                if (tableFilename != null)
                {
                    outDir = Path.Combine(outDir, tableFilename);
                }

                string filename = Path.Combine(outDir, tableName + ".html");
                Directory.CreateDirectory(outDir);
                File.WriteAllText(filename, sb.ToString());
            }
        }
Пример #3
0
 public static void ProcessReferences(BdatStringCollection tables, BdatInfo info)
 {
     foreach (BdatStringTable table in tables.Tables.Values)
     {
         int id = table.BaseId;
         foreach (var item in table.Items)
         {
             foreach (BdatMember member in table.Members.Where(x => x.Type == BdatMemberType.Scalar))
             {
                 var val = ReadValue(table.Name, id, member.Name, tables, info);
                 if (val.childTable != null)
                 {
                     BdatStringItem childItem = tables[val.childTable][int.Parse(val.childId)];
                     childItem.ReferencedBy.Add(item);
                 }
             }
             id++;
         }
     }
 }
Пример #4
0
        public static void PrintTable(BdatStringCollection tables, BdatInfo info, string tableName, Indenter sb)
        {
            BdatStringTable table = tables[tableName];

            sb.AppendLineAndIncrease("<table border=\"1\">");
            sb.AppendLineAndIncrease("<thead>");
            sb.AppendLineAndIncrease("<tr>");
            sb.AppendLine("<th>ID</th>");
            sb.AppendLine("<th>Referenced By</th>");

            foreach (BdatMember member in table.Members)
            {
                if (info.FieldInfo.TryGetValue((tableName, member.Name), out var field))
                {
                    if (field.Type == BdatFieldType.Hide)
                    {
                        continue;
                    }
                }
                switch (member.Type)
                {
                case BdatMemberType.Scalar:
                case BdatMemberType.Flag:
                    sb.AppendLine($"<th>{member.Name}</th>");
                    break;

                case BdatMemberType.Array:
                    sb.AppendLine($"<th colspan=\"{member.ArrayCount}\">{member.Name}</th>");
                    break;
                }
            }

            sb.DecreaseAndAppendLine("</tr>");
            sb.DecreaseAndAppendLine("</thead>");
            int id = table.BaseId;

            foreach (BdatStringItem item in table.Items)
            {
                sb.AppendLineAndIncrease($"<tr id=\"{id}\">");
                sb.AppendLine($"<td>{id}</td>");
                sb.AppendLineAndIncrease("<td>");

                if (item.ReferencedBy.Count > 0)
                {
                    sb.AppendLineAndIncrease("<details>");
                    sb.AppendLine($"<summary>{item.ReferencedBy.Count} refs</summary>");

                    foreach (var a in item.ReferencedBy)
                    {
                        var    link    = GetLink(table, tables[a.Table], a.Id.ToString());
                        string display = a.Id.ToString();

                        if (info.DisplayFields.TryGetValue(a.Table, out var displayField))
                        {
                            var child = BdatStringTools.ReadValue(a.Table, a.Id, displayField, tables, info);
                            if (!string.IsNullOrWhiteSpace(child.value))
                            {
                                display = child.value;
                            }
                        }

                        sb.AppendLine($"<a href=\"{link}\">{a.Table}#{display}</a>");
                    }

                    sb.DecreaseAndAppendLine("</details>");
                }

                sb.DecreaseAndAppendLine("</td>");

                foreach (BdatMember member in table.Members)
                {
                    if (info.FieldInfo.TryGetValue((tableName, member.Name), out var field))
                    {
                        if (field.Type == BdatFieldType.Hide)
                        {
                            continue;
                        }
                    }

                    switch (member.Type)
                    {
                    case BdatMemberType.Scalar:
                    case BdatMemberType.Flag:
                        var val = BdatStringTools.ReadValue(tableName, id, member.Name, tables, info);
                        if (val.childTable != null)
                        {
                            var link = GetLink(table, tables[val.childTable], val.childId);
                            sb.AppendLine($"<td><a href=\"{link}\">{val.value}</td></a>");
                        }
                        else
                        {
                            sb.AppendLine($"<td>{val.value}</td>");
                        }
                        break;

                    case BdatMemberType.Array:
                        var arr = (string[])item.Values[member.Name];
                        foreach (string value in arr)
                        {
                            sb.AppendLine($"<td>{value}</td>");
                        }
                        break;
                    }
                }

                sb.DecreaseAndAppendLine("</tr>");
                id++;
            }

            sb.DecreaseAndAppendLine("</table>");
        }
Пример #5
0
 public static void OutputHtml(BdatStringCollection bdats, BdatInfo info, string htmlDir)
 {
     PrintSeparateTables(bdats, info, htmlDir);
 }
Пример #6
0
        private static string GetPouchBuffCaption(BdatStringItem item, BdatFieldInfo field, BdatStringCollection tables, BdatInfo info)
        {
            if (item == null)
            {
                return(null);
            }

            int capId = int.Parse((string)item[field.Field]);
            var cap   = ReadValue("BTL_PouchBuff", capId, "Name", tables, info).value;

            if (cap == null)
            {
                return(null);
            }

            var sb = new StringBuilder(cap);

            var tags = ParseTags(cap);

            foreach (var tag in tags.OrderByDescending(x => x.Start))
            {
                if (tag.SubType != "PouchParam")
                {
                    continue;
                }

                float buffValue = float.Parse((string)item[field.RefField]);

                sb.Remove(tag.Start, tag.Length);
                sb.Insert(tag.Start, buffValue);
            }

            return(sb.ToString());
        }
Пример #7
0
        public static (string value, string childTable, string childId) ReadValue(string tableName, int itemId, string memberName, BdatStringCollection tables, BdatInfo info)
        {
            string val        = (string)tables[tableName][itemId]?[memberName];
            string display    = val;
            string childTable = null;
            string childId    = null;

            if (val == null || !info.FieldInfo.TryGetValue((tableName, memberName), out var field))
            {
                return(display, null, null);
            }

            int refId = int.Parse(val) + field.Adjust;

            switch (field.Type)
            {
            case BdatFieldType.Message:

                display = (string)tables[field.RefTable][refId]?["name"];
                if (display == null && val != "0")
                {
                    display = refId.ToString();
                }
                break;

            case BdatFieldType.Reference:
                ApplyRef(field.RefTable);
                break;

            case BdatFieldType.Item:
                ApplyRef(GetItemTable(refId));
                break;

            case BdatFieldType.Event:
                ApplyRef(GetEventTable(refId));
                break;

            case BdatFieldType.Condition:
                var conditionType = (ConditionType)int.Parse((string)tables[tableName][itemId]?[field.RefField]);
                ApplyRef(GetConditionTable(conditionType));
                break;

            case BdatFieldType.Task:
                var taskType = (TaskType)int.Parse((string)tables[tableName][itemId]?[field.RefField]);
                ApplyRef(GetTaskTable(taskType));
                break;

            case BdatFieldType.ShopTable:
                var shopType = (ShopType)int.Parse((string)tables[tableName][itemId]?[field.RefField]);
                ApplyRef(GetShopTable(shopType));
                break;

            case BdatFieldType.Character:
                ApplyRef(GetCharacterTable(refId));
                break;

            case BdatFieldType.Enhance:
                display = GetEnhanceCaption(itemId, tables);
                break;

            case BdatFieldType.TimeRange:
                display = PrintTimeRange(int.Parse((string)tables[tableName][itemId]?[memberName]));
                break;

            case BdatFieldType.WeatherIdMap:
                display = PrintWeatherIdMap(int.Parse((string)tables[tableName][itemId]?[memberName]), 13, tables);
                break;

            case BdatFieldType.PouchBuff:
                display = GetPouchBuffCaption(tables[tableName][itemId], field, tables, info);
                break;
            }

            if (field.EnumType != null)
            {
                if (field.EnumType.GetCustomAttributes(typeof(FlagsAttribute), false).Length > 0)
                {
                    display = PrintEnumFlags(field.EnumType, refId);
                }
                else
                {
                    display = Enum.GetName(field.EnumType, refId);
                }
            }

            return(display, childTable, childId);


            void ApplyRef(string refTable)
            {
                if (refTable == null || !tables[refTable].ContainsId(refId))
                {
                    display = refId == 0 ? null : refId.ToString();
                    return;
                }

                var refIdString = refId.ToString();

                display    = refIdString;
                childTable = refTable;
                childId    = refIdString;

                if (info.DisplayFields.TryGetValue(refTable, out var displayField))
                {
                    var child = ReadValue(refTable, refId, displayField, tables, info);
                    if (!string.IsNullOrWhiteSpace(child.value))
                    {
                        display = child.value;
                    }
                }
            }
        }