public static Dictionary <int, string> ReadMesFile(this IFileSystem vfs, string path, bool withPatches = true) { Dictionary <int, string> result; { using var content = vfs.ReadFile(path); result = MesFile.Read(path, content.Memory.Span); } if (withPatches) { var patchDir = Path.ChangeExtension(path, ".d"); var patchFiles = vfs.Search($"{patchDir}/*.mes").ToList(); patchFiles.Sort(); // Apply natural sort foreach (var patchFile in patchFiles) { var patchContent = ReadMesFile(vfs, patchFile, false); Logger.Debug("Applying {0} patches from {1}", patchContent.Count, patchFile); foreach (var entry in patchContent) { result[entry.Key] = entry.Value; } } } return(result); }
public static void Main(string[] args) { // When a debugger is attached, immediately rethrow unobserved exceptions from asynchronous tasks if (Debugger.IsAttached) { TaskScheduler.UnobservedTaskException += (_, eventArgs) => { if (!eventArgs.Observed) { throw eventArgs.Exception; } }; } else { AppDomain.CurrentDomain.UnhandledException += HandleException; } if (JumpListHandler.Handle(args)) { return; } if (args.Length > 0 && args[0] == "--extract-save") { ExtractSaveArchive.Main(args.Skip(1).ToArray()); return; } if (args.Length == 2 && args[0] == "--mes-to-json") { var mesContent = MesFile.Read(args[1]); var newFile = Path.ChangeExtension(args[1], ".json"); var options = new JsonSerializerOptions(); options.WriteIndented = true; var jsonContent = JsonSerializer.Serialize(mesContent.ToDictionary( kvp => kvp.Key.ToString(), kvp => kvp.Value ), options); File.WriteAllText(newFile, jsonContent); return; } if (args.Length > 0 && args[0] == "--dump-addresses") { var dumper = new AddressDumper(); dumper.DumpAddresses(); return; } string dataDir = null; if (args.Length > 0 && args[0] == "--data-dir") { dataDir = args[1]; } using var startup = new GameStartup { DataFolder = dataDir }; if (startup.Startup()) { startup.EnterMainMenu(); Globals.GameLoop.Run(); } }