Program.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using OpenVIII;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Diagnostics.CodeAnalysis;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Xml;
  9. namespace DumpStrings
  10. {
  11. internal class Program
  12. {
  13. #region Properties
  14. private static XmlWriterSettings XmlWriterSettings { get; } = new XmlWriterSettings()
  15. {
  16. Indent = true,
  17. IndentChars = "\t",
  18. NewLineOnAttributes = true,
  19. Encoding = Encoding.Unicode
  20. };
  21. private static IEnumerable<(Strings.FileID fileKey, int sectionKey, int id, FF8StringReference Value)> CollectionOfStrings
  22. {
  23. get
  24. {
  25. (Strings.FileID fileKey, int sectionKey, int id, FF8StringReference Value) Get(Strings.FileID fileID,
  26. int sectionID, int inputID, FF8StringReference value)
  27. => (fileID, sectionID, inputID, value); // this is for having a tuple instead of anonymous type
  28. var strings = (
  29. from file in Memory.Strings
  30. from section in file.Value
  31. from ff8StringReference in section.Value.Select((x, i) => new { Key = i, Value = x })
  32. where ff8StringReference.Value != null && ff8StringReference.Value.Length > 0
  33. select
  34. Get(file.Key, section.Key, ff8StringReference.Key, ff8StringReference.Value)
  35. ).ToList().AsReadOnly();
  36. return strings;
  37. }
  38. }
  39. #endregion Properties
  40. #region Methods
  41. [SuppressMessage("ReSharper", "PossibleMultipleEnumeration")]
  42. private static void DumpReverseStrings()
  43. {
  44. using (var w =
  45. XmlWriter.Create(
  46. new FileStream($"reverse_strings_{Extended.GetLanguageShort().ToLower()}.xml", FileMode.Create, FileAccess.Write,
  47. FileShare.ReadWrite),
  48. XmlWriterSettings))
  49. {
  50. w.WriteStartDocument();
  51. w.WriteStartElement("ReverseStrings"); //<ReverseStrings>
  52. w.WriteAttributeString("lang", Extended.GetLanguageShort().ToUpper());
  53. var strings = CollectionOfStrings;
  54. w.WriteAttributeString("count", strings.Count().ToString("D"));
  55. foreach ((var fileID, var sectionID, var id, var value) in strings)
  56. {
  57. w.WriteStartElement("String");
  58. w.WriteAttributeString(nameof(fileID).ToLower(), fileID.ToString("D"));
  59. w.WriteAttributeString(nameof(sectionID).ToLower(), sectionID.ToString("D"));
  60. w.WriteAttributeString(nameof(id)+$"_{Extended.GetLanguageShort().ToLower()}", id.ToString("D"));
  61. w.WriteAttributeString(nameof(value.Offset).ToLower() + $"_{Extended.GetLanguageShort().ToLower()}", value.Offset.ToString("X"));
  62. w.WriteAttributeString(nameof(value.Length).ToLower() + $"_{Extended.GetLanguageShort().ToLower()}", value.Length.ToString("D"));
  63. w.WriteAttributeString(nameof(value) + $"_{Extended.GetLanguageShort().ToLower()}", value);
  64. w.WriteEndElement();
  65. }
  66. w.WriteEndElement(); //</ReverseStrings>
  67. w.WriteEndDocument();
  68. }
  69. }
  70. private static void DumpStrings()
  71. {
  72. using (var w =
  73. XmlWriter.Create(
  74. new FileStream($"strings_{Extended.GetLanguageShort().ToLower()}.xml", FileMode.Create, FileAccess.Write,
  75. FileShare.ReadWrite),
  76. XmlWriterSettings))
  77. {
  78. w.WriteStartDocument();
  79. w.WriteStartElement("Strings"); //<Strings>
  80. w.WriteAttributeString("lang", Extended.GetLanguageShort().ToUpper());
  81. var strings = CollectionOfStrings;
  82. var fileGroups = strings.GroupBy(x => x.fileKey).ToList().AsReadOnly();
  83. //var fileGroupsCounts = fileGroups.Select(group => new {group.Key, Count = group.Count()});
  84. var fileGroupsCount = fileGroups.Count();
  85. w.WriteAttributeString("count", fileGroupsCount.ToString("D"));
  86. foreach (var fileGroup in fileGroups)
  87. {
  88. w.WriteStartElement("File");
  89. w.WriteAttributeString("id", fileGroup.Key.ToString());
  90. var sectionGroups = fileGroup.GroupBy(x => x.sectionKey).ToList().AsReadOnly();
  91. var sectionGroupsCount = sectionGroups.Count();
  92. w.WriteAttributeString("count", sectionGroupsCount.ToString("D"));
  93. foreach (var sectionGroup in sectionGroups)
  94. {
  95. w.WriteStartElement("Section");
  96. w.WriteAttributeString("id", sectionGroup.Key.ToString());
  97. w.WriteAttributeString("count", sectionGroup.Count().ToString("D"));
  98. foreach (var ff8StringReference in sectionGroup)
  99. {
  100. w.WriteStartElement("String");
  101. w.WriteAttributeString("id", ff8StringReference.id.ToString());
  102. w.WriteAttributeString("offset", ff8StringReference.Value.Offset.ToString("X"));
  103. w.WriteAttributeString("size", ff8StringReference.Value.Length.ToString("D"));
  104. w.WriteString(ff8StringReference.Value);
  105. w.WriteEndElement();
  106. }
  107. w.WriteEndElement();
  108. }
  109. w.WriteEndElement();
  110. }
  111. w.WriteEndElement(); //</Strings>
  112. w.WriteEndDocument();
  113. }
  114. }
  115. private static void Main(string[] args)
  116. {
  117. Memory.Init(null, null, null, args);
  118. DumpStrings();
  119. DumpReverseStrings();
  120. }
  121. #endregion Methods
  122. }
  123. }