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); }
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()); } }
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++; } } }
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>"); }
public static void OutputHtml(BdatStringCollection bdats, BdatInfo info, string htmlDir) { PrintSeparateTables(bdats, info, htmlDir); }
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()); }
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; } } } }