private void Compare(string[] args) { using (var game_1 = new HGame(args[0])) using (var game_2 = new HGame(args[1])) { game_1.Disassemble(); game_2.Disassemble(); var matchedHashes = new List <string>(); var oldUnmatched = new Dictionary <string, List <ASMethod> >(); var unmatchedMethods = new Dictionary <string, List <ASMethod> >(); foreach (ASMethod method in game_1.ABCFiles[0].Methods) { using (var hasher = new HashWriter(false)) { hasher.Write(method); string hash = hasher.GenerateMD5Hash(); List <ASMethod> methods = null; if (!unmatchedMethods.TryGetValue(hash, out methods)) { methods = new List <ASMethod>(); unmatchedMethods.Add(hash, methods); } methods.Add(method); } } foreach (ASMethod method in game_2.ABCFiles[0].Methods) { using (var hasher = new HashWriter(false)) { hasher.Write(method); string hash = hasher.GenerateMD5Hash(); if (unmatchedMethods.ContainsKey(hash)) { matchedHashes.Add(hash); unmatchedMethods.Remove(hash); } else if (!matchedHashes.Contains(hash)) { List <ASMethod> methods = null; if (!oldUnmatched.TryGetValue(hash, out methods)) { methods = new List <ASMethod>(); oldUnmatched.Add(hash, methods); } methods.Add(method); } } } var changes = string.Empty; foreach (string hash in unmatchedMethods.Keys) { changes += $"[{hash}]\r\n{{\r\n"; foreach (ASMethod method in unmatchedMethods[hash]) { changes += $" {(method.Container?.QName.Name ?? "Anonymous")}\r\n"; changes += $" {method.ToAS3()}\r\n\r\n"; } changes += $"}}\r\n"; } } }