/// <summary> /// The games language files store items as hashes. This function will grab all strings in a all scripts in a directory /// and hash each string and them compare with a list of hashes supplied in the input box. Any matches get saved to a file STRINGS.txt in the directory /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void findHashFromStringsToolStripMenuItem_Click(object sender, EventArgs e) { InputBox IB = new InputBox(); if (!IB.ShowList("Input Hash", "Input hash to find", this)) return; uint hash; List<uint> Hashes = new List<uint>(); foreach (string result in IB.ListValue) { if (result.StartsWith("0x")) { if (uint.TryParse(result.Substring(2), System.Globalization.NumberStyles.HexNumber, new System.Globalization.CultureInfo("en-gb"), out hash)) { Hashes.Add(hash); } else { MessageBox.Show($"Error converting {result} to hash value"); } } else { if (uint.TryParse(result, out hash)) { Hashes.Add(hash); } else { MessageBox.Show($"Error converting {result} to hash value"); } } } if (Hashes.Count == 0) { MessageBox.Show($"Error, no hashes inputted, please try again"); return; } HashToFind = Hashes.ToArray(); CompileList = new Queue<Tuple<string, bool>>(); FoundStrings = new List<Tuple<uint, string>>(); Program.ThreadCount = 0; FolderSelectDialog fsd = new FolderSelectDialog(); if (fsd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { DateTime Start = DateTime.Now; this.Hide(); foreach (string file in Directory.GetFiles(fsd.SelectedPath, "*.xsc")) { CompileList.Enqueue(new Tuple<string, bool>(file, true)); } foreach (string file in Directory.GetFiles(fsd.SelectedPath, "*.csc")) { CompileList.Enqueue(new Tuple<string, bool>(file, true)); } foreach (string file in Directory.GetFiles(fsd.SelectedPath, "*.ysc")) { CompileList.Enqueue(new Tuple<string, bool>(file, false)); } foreach (string file in Directory.GetFiles(fsd.SelectedPath, "*.ysc.full")) { CompileList.Enqueue(new Tuple<string, bool>(file, false)); } if (Program.Use_MultiThreading) { for (int i = 0; i < Environment.ProcessorCount - 1; i++) { Program.ThreadCount++; new System.Threading.Thread(FindString).Start(); System.Threading.Thread.Sleep(0); } Program.ThreadCount++; FindString(); while (Program.ThreadCount > 0) { System.Threading.Thread.Sleep(10); } } else { Program.ThreadCount++; FindString(); } if (FoundStrings.Count == 0) updatestatus($"No Strings Found, Time taken: {DateTime.Now - Start}"); else { updatestatus($"Found {FoundStrings.Count} strings, Time taken: {DateTime.Now - Start}"); FoundStrings.Sort((x, y) => x.Item1.CompareTo(y.Item1)); using (StreamWriter oFile = File.CreateText(Path.Combine(fsd.SelectedPath, "STRINGS.txt"))) { foreach (Tuple<uint, string> Item in FoundStrings) { oFile.WriteLine($"0x{Utils.FormatHexHash(Item.Item1)} : \"{Item.Item2}\""); } } } } this.Show(); }