static void LoadStrings(IGameInstance sriv) { var results = sriv.SearchForFiles("*.le_strings"); foreach (var result in results) { string filename = result.Value.Filename.ToLowerInvariant(); filename = Path.GetFileNameWithoutExtension(filename); string[] pieces = filename.Split('_'); string languageCode = pieces.Last(); Language language = LanguageUtility.GetLanguageFromCode(languageCode); if (!languageStrings.ContainsKey(language)) { languageStrings.Add(language, new Dictionary <uint, string>()); } Dictionary <uint, string> strings = languageStrings[language]; using (Stream s = sriv.OpenPackfileFile(result.Value.Filename, result.Value.Packfile)) { StringFile file = new StringFile(s, language, sriv); foreach (var hash in file.GetHashes()) { if (strings.ContainsKey(hash)) { continue; } strings.Add(hash, file.GetString(hash)); } } } }
public static void Main(string[] args) { Options options = null; try { options = CommandLine.Parse <Options>(); } catch (CommandLineException exception) { Console.WriteLine(exception.ArgumentHelp.Message); Console.WriteLine(); Console.WriteLine(exception.ArgumentHelp.GetHelpText(Console.BufferWidth)); #if DEBUG Console.ReadLine(); #endif return; } IGameInstance instance = GameInstance.GetFromString(options.Game); string filename = Path.GetFileNameWithoutExtension(options.Input); string languageCode = filename.Remove(0, filename.Length - 2); Language language = LanguageUtility.GetLanguageFromCode(languageCode); Dictionary <UInt32, string> hashLookup = new Dictionary <UInt32, string>(); if (options.LoadXtbls) { Console.WriteLine("Loading XTBL files..."); Dictionary <string, FileSearchResult> results = instance.SearchForFiles("*.xtbl"); int i = 0; foreach (var pair in results) { i++; Console.WriteLine("[{0}/{1}] Loading xtbl: {2}", i, results.Count, pair.Key); string xtbl = null; using (StreamReader reader = new StreamReader(pair.Value.GetStream())) { xtbl = reader.ReadToEnd(); } Regex regex = new Regex("<Name>(.*?)</Name>", RegexOptions.Compiled); foreach (Match m in regex.Matches(xtbl)) { uint hash = Hashes.CrcVolition(m.Groups[1].Value); if (!hashLookup.ContainsKey(hash)) { hashLookup.Add(hash, m.Groups[1].Value); } } } } string outputFile = (options.Output != null) ? options.Output : Path.ChangeExtension(options.Input, ".xml"); Console.WriteLine("Extracting {0} to {1}...", options.Input, outputFile); StringFile stringFile = null; using (Stream stream = File.OpenRead(options.Input)) { stringFile = new StringFile(stream, language, instance); } XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = "\t"; settings.NewLineChars = "\r\n"; Dictionary <string, string> stringsWithName = new Dictionary <string, string>(); Dictionary <uint, string> stringsWithHash = new Dictionary <uint, string>(); foreach (uint hash in stringFile.GetHashes()) { string text = stringFile.GetString(hash); if (hashLookup.ContainsKey(hash)) { stringsWithName.Add(hashLookup[hash], text); } else { stringsWithHash.Add(hash, text); } } using (XmlWriter xml = XmlTextWriter.Create(outputFile, settings)) { xml.WriteStartDocument(); xml.WriteStartElement("Strings"); xml.WriteAttributeString("Language", language.ToString()); xml.WriteAttributeString("Game", instance.Game.ToString()); foreach (var pair in stringsWithName.OrderBy(x => x.Key)) { xml.WriteStartElement("String"); xml.WriteAttributeString("Name", pair.Key); xml.WriteString(pair.Value); xml.WriteEndElement(); // String } foreach (var pair in stringsWithHash) { xml.WriteStartElement("String"); xml.WriteAttributeString("Hash", pair.Key.ToString("X8")); xml.WriteString(pair.Value); xml.WriteEndElement(); // String } xml.WriteEndElement(); // Strings xml.WriteEndDocument(); } Console.WriteLine("Done."); #if DEBUG Console.ReadLine(); #endif }
public static void Main(string[] args) { Options options = null; try { options = CommandLine.Parse <Options>(); } catch (CommandLineException exception) { Console.WriteLine(exception.ArgumentHelp.Message); Console.WriteLine(); Console.WriteLine(exception.ArgumentHelp.GetHelpText(Console.BufferWidth)); #if DEBUG Console.ReadLine(); #endif return; } string outputFile = options.Output != null ? options.Output : Path.ChangeExtension(options.Input, ".le_strings"); Console.WriteLine("Packing {0} and creating {1}...", options.Input, outputFile); XDocument xml = null; using (Stream s = File.OpenRead(options.Input)) { xml = XDocument.Load(s); } var stringsNode = xml.Descendants("Strings").First(); string languageString = stringsNode.Attribute("Language").Value; string gameString = stringsNode.Attribute("Game").Value; Language language = LanguageUtility.GetLanguageFromCode(languageString); IGameInstance instance = GameInstance.GetFromString(gameString); StringFile stringFile = new StringFile(language, instance); var stringNodes = stringsNode.Descendants("String"); foreach (var stringNode in stringNodes) { uint hash; var nameAttribute = stringNode.Attribute("Name"); if (nameAttribute != null) { hash = Hashes.CrcVolition(nameAttribute.Value); } else { hash = uint.Parse(stringNode.Attribute("Hash").Value, System.Globalization.NumberStyles.HexNumber); } string value = stringNode.Value; if (stringFile.ContainsKey(hash)) { Console.WriteLine("You are attempting to add a duplicate key to the strings file."); Console.WriteLine("Name: \"{0}\", Hash: {1}, Value: {2}", nameAttribute != null ? nameAttribute.Value : "", hash, value); Console.WriteLine("Other value: {0}", stringFile.GetString(hash)); return; } stringFile.AddString(hash, value); } using (Stream s = File.Create(outputFile)) { stringFile.Save(s); } Console.WriteLine("Done."); #if DEBUG Console.ReadLine(); #endif }
static void Main(string[] args) { Options options = null; try { options = CommandLine.Parse <Options>(); } catch (CommandLineException exception) { Console.WriteLine(exception.ArgumentHelp.Message); Console.WriteLine(); Console.WriteLine(exception.ArgumentHelp.GetHelpText(Console.BufferWidth)); #if DEBUG Console.ReadLine(); #endif return; } using (Stream stream = File.OpenRead(options.Source)) { string bnkName = (options.Output != null) ? options.Output : Path.ChangeExtension(Path.GetFileName(options.Source), "bnk_pc"); string mbnkName = Path.ChangeExtension(bnkName, "mbnk_pc"); Console.WriteLine("Building {0} from {1}.", bnkName, options.Source); using (XmlReader reader = XmlReader.Create(stream)) { reader.ReadToFollowing("soundbank"); uint wwiseId = uint.Parse(reader.GetAttribute("wwiseId")); string gameName = reader.GetAttribute("game"); IGameInstance instance = GameInstance.GetFromString(gameName); StreamingSoundbank bank = new StreamingSoundbank(); bank.Header.WwiseBankId = wwiseId; string xmlFolder = Path.GetDirectoryName(options.Source); while (reader.ReadToFollowing("file")) { uint fileId = uint.Parse(reader.GetAttribute("id")); string audio = reader.GetAttribute("audio"); MemoryStream metadataStream = null; if (reader.ReadToDescendant("metadata")) { AudioMetadata metadata = new AudioMetadata(instance); using (XmlReader metadataReader = reader.ReadSubtree()) { metadataReader.Read(); uint metadataVersion = uint.Parse(metadataReader.GetAttribute("version")); uint personaId = uint.Parse(metadataReader.GetAttribute("personaid")); uint voicelineId = uint.Parse(metadataReader.GetAttribute("voicelineid")); uint wavLengthMs = uint.Parse(metadataReader.GetAttribute("wavlengthms")); metadata.Header.Version = metadataVersion; metadata.Header.PersonaID = personaId; metadata.Header.VoicelineID = voicelineId; metadata.Header.WavLengthMs = wavLengthMs; if (metadataReader.ReadToFollowing("subtitles")) { while (metadataReader.ReadToFollowing("subtitle")) { string languageString = metadataReader.GetAttribute("language"); metadataReader.Read(); string text = metadataReader.ReadContentAsString(); Language language = LanguageUtility.GetLanguageFromCode(languageString); metadata.Subtitles.Add(language, text); } } if (metadataReader.ReadToFollowing("lipsync")) { string lipsyncBase64 = metadataReader.ReadContentAsString(); metadata.LipsyncData = Convert.FromBase64String(lipsyncBase64); } } metadataStream = new MemoryStream(); metadata.Save(metadataStream); } Stream audioStream = File.OpenRead(Path.Combine(xmlFolder, audio)); bank.AddFile(fileId, audioStream, metadataStream); } using (Stream outStream = File.Create(bnkName)) { using (Stream mbnkOutStream = File.Create(mbnkName)) { bank.Save(outStream, mbnkOutStream); } } } } }