private async Task SaveFile(string filename) { if (Data == null || Data.UnsupportedBytecodeVersion) { return; } if (IsGMS2 == Visibility.Visible) { MessageBox.Show("This is not yet fully stable and may break. You have been warned.", "GMS2 game", MessageBoxButton.OK, MessageBoxImage.Warning); } LoaderDialog dialog = new LoaderDialog("Saving", "Saving, please wait..."); dialog.Owner = this; FilePath = filename; if (System.IO.Path.GetDirectoryName(FilePath) != System.IO.Path.GetDirectoryName(filename)) { CloseChildFiles(); } DebugDataMode debugMode = DebugDataMode.NoDebug; if (!Data.GeneralInfo.DisableDebugger) // TODO: I think the game itself can also use the .yydebug file on crash reports { DebugDataDialog debugDialog = new DebugDataDialog(); debugDialog.Owner = this; debugDialog.ShowDialog(); debugMode = debugDialog.Result; // TODO: Add an option to generate debug data for just selected scripts (to make running faster / make the full assembly not take forever to load) } Task t = Task.Run(() => { try { using (var stream = new FileStream(filename, FileMode.Create)) { UndertaleIO.Write(stream, Data); } if (debugMode != DebugDataMode.NoDebug) { Debug.WriteLine("Generating debugger data..."); UndertaleDebugData debugData = DebugDataGenerator.GenerateDebugData(Data, debugMode); using (FileStream stream = new FileStream(System.IO.Path.ChangeExtension(FilePath, ".yydebug"), FileMode.Create)) { using (UndertaleWriter writer = new UndertaleWriter(stream)) { debugData.FORM.Serialize(writer); } } } } catch (Exception e) { MessageBox.Show("An error occured while trying to save:\n" + e.Message, "Save error", MessageBoxButton.OK, MessageBoxImage.Error); } Dispatcher.Invoke(() => { dialog.Hide(); }); }); dialog.ShowDialog(); await t; }
private async Task LoadFile(string filename) { LoaderDialog dialog = new LoaderDialog("Loading", "Loading, please wait..."); dialog.Owner = this; Task t = Task.Run(() => { bool hadWarnings = false; UndertaleData data = null; try { using (var stream = new FileStream(filename, FileMode.Open)) { data = UndertaleIO.Read(stream, warning => { MessageBox.Show(warning, "Loading warning", MessageBoxButton.OK, MessageBoxImage.Warning); hadWarnings = true; }); } } catch (Exception e) { MessageBox.Show("An error occured while trying to load:\n" + e.Message, "Load error", MessageBoxButton.OK, MessageBoxImage.Error); } Dispatcher.Invoke(() => { if (data != null) { if (data.UnsupportedBytecodeVersion) { MessageBox.Show("Only bytecode versions 15 and 16 are supported for now, you are trying to load " + data.GeneralInfo.BytecodeVersion + ". A lot of code is disabled and will likely break something. Saving/exporting is disabled.", "Unsupported bytecode version", MessageBoxButton.OK, MessageBoxImage.Warning); CanSave = false; } else if (hadWarnings) { MessageBox.Show("Warnings occurred during loading. Saving has been disabled.", "Saving disabled", MessageBoxButton.OK, MessageBoxImage.Warning); CanSave = false; } else { CanSave = true; } if (data.GeneralInfo?.Major >= 2) { MessageBox.Show("Game Maker: Studio 2 game loaded! I just hacked this together quickly for the Nintendo Switch release of Undertale. Most things work, but some editors don't display all the data.", "GMS2 game loaded", MessageBoxButton.OK, MessageBoxImage.Warning); } if (System.IO.Path.GetDirectoryName(FilePath) != System.IO.Path.GetDirectoryName(filename)) { CloseChildFiles(); } this.Data = data; this.FilePath = filename; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Data")); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsGMS2")); ChangeSelection(Highlighted = new DescriptionView("Welcome to UndertaleModTool!", "Double click on the items on the left to view them!")); SelectionHistory.Clear(); } dialog.Hide(); }); }); dialog.ShowDialog(); await t; }