using OpenVIII; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Text; using System.Xml; namespace DumpStrings { internal class Program { #region Properties private static XmlWriterSettings XmlWriterSettings { get; } = new XmlWriterSettings() { Indent = true, IndentChars = "\t", NewLineOnAttributes = true, Encoding = Encoding.Unicode }; private static IEnumerable<(Strings.FileID fileKey, int sectionKey, int id, FF8StringReference Value)> CollectionOfStrings { get { (Strings.FileID fileKey, int sectionKey, int id, FF8StringReference Value) Get(Strings.FileID fileID, int sectionID, int inputID, FF8StringReference value) => (fileID, sectionID, inputID, value); // this is for having a tuple instead of anonymous type var strings = ( from file in Memory.Strings from section in file.Value from ff8StringReference in section.Value.Select((x, i) => new { Key = i, Value = x }) where ff8StringReference.Value != null && ff8StringReference.Value.Length > 0 select Get(file.Key, section.Key, ff8StringReference.Key, ff8StringReference.Value) ).ToList().AsReadOnly(); return strings; } } #endregion Properties #region Methods [SuppressMessage("ReSharper", "PossibleMultipleEnumeration")] private static void DumpReverseStrings() { using (var w = XmlWriter.Create( new FileStream($"reverse_strings_{Extended.GetLanguageShort().ToLower()}.xml", FileMode.Create, FileAccess.Write, FileShare.ReadWrite), XmlWriterSettings)) { w.WriteStartDocument(); w.WriteStartElement("ReverseStrings"); // w.WriteAttributeString("lang", Extended.GetLanguageShort().ToUpper()); var strings = CollectionOfStrings; w.WriteAttributeString("count", strings.Count().ToString("D")); foreach ((var fileID, var sectionID, var id, var value) in strings) { w.WriteStartElement("String"); w.WriteAttributeString(nameof(fileID).ToLower(), fileID.ToString("D")); w.WriteAttributeString(nameof(sectionID).ToLower(), sectionID.ToString("D")); w.WriteAttributeString(nameof(id)+$"_{Extended.GetLanguageShort().ToLower()}", id.ToString("D")); w.WriteAttributeString(nameof(value.Offset).ToLower() + $"_{Extended.GetLanguageShort().ToLower()}", value.Offset.ToString("X")); w.WriteAttributeString(nameof(value.Length).ToLower() + $"_{Extended.GetLanguageShort().ToLower()}", value.Length.ToString("D")); w.WriteAttributeString(nameof(value) + $"_{Extended.GetLanguageShort().ToLower()}", value); w.WriteEndElement(); } w.WriteEndElement(); // w.WriteEndDocument(); } } private static void DumpStrings() { using (var w = XmlWriter.Create( new FileStream($"strings_{Extended.GetLanguageShort().ToLower()}.xml", FileMode.Create, FileAccess.Write, FileShare.ReadWrite), XmlWriterSettings)) { w.WriteStartDocument(); w.WriteStartElement("Strings"); // w.WriteAttributeString("lang", Extended.GetLanguageShort().ToUpper()); var strings = CollectionOfStrings; var fileGroups = strings.GroupBy(x => x.fileKey).ToList().AsReadOnly(); //var fileGroupsCounts = fileGroups.Select(group => new {group.Key, Count = group.Count()}); var fileGroupsCount = fileGroups.Count(); w.WriteAttributeString("count", fileGroupsCount.ToString("D")); foreach (var fileGroup in fileGroups) { w.WriteStartElement("File"); w.WriteAttributeString("id", fileGroup.Key.ToString()); var sectionGroups = fileGroup.GroupBy(x => x.sectionKey).ToList().AsReadOnly(); var sectionGroupsCount = sectionGroups.Count(); w.WriteAttributeString("count", sectionGroupsCount.ToString("D")); foreach (var sectionGroup in sectionGroups) { w.WriteStartElement("Section"); w.WriteAttributeString("id", sectionGroup.Key.ToString()); w.WriteAttributeString("count", sectionGroup.Count().ToString("D")); foreach (var ff8StringReference in sectionGroup) { w.WriteStartElement("String"); w.WriteAttributeString("id", ff8StringReference.id.ToString()); w.WriteAttributeString("offset", ff8StringReference.Value.Offset.ToString("X")); w.WriteAttributeString("size", ff8StringReference.Value.Length.ToString("D")); w.WriteString(ff8StringReference.Value); w.WriteEndElement(); } w.WriteEndElement(); } w.WriteEndElement(); } w.WriteEndElement(); // w.WriteEndDocument(); } } private static void Main(string[] args) { Memory.Init(null, null, null, args); DumpStrings(); DumpReverseStrings(); } #endregion Methods } }