diff --git a/src/SerialLoops/ViewModels/Dialogs/EditTutorialMappingsDialogViewModel.cs b/src/SerialLoops/ViewModels/Dialogs/EditTutorialMappingsDialogViewModel.cs new file mode 100644 index 00000000..2036e49a --- /dev/null +++ b/src/SerialLoops/ViewModels/Dialogs/EditTutorialMappingsDialogViewModel.cs @@ -0,0 +1,60 @@ +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Windows.Input; +using HaruhiChokuretsuLib.Archive.Event; +using HaruhiChokuretsuLib.Util; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; +using SerialLoops.Lib; +using SerialLoops.Lib.Items; +using SerialLoops.ViewModels.Panels; +using SerialLoops.Views.Dialogs; +using IO = SerialLoops.Lib.IO; + +namespace SerialLoops.ViewModels.Dialogs; + +public class EditTutorialMappingsDialogViewModel : ViewModelBase +{ + public ObservableCollection Tutorials { get; } + + public ICommand SaveCommand { get; } + public ICommand CancelCommand { get; } + + public EditTutorialMappingsDialogViewModel(Project project, EditorTabsPanelViewModel tabs, ILogger log) + { + Tutorials = new(project.TutorialFile.Tutorials.Where(t => t.AssociatedScript > 0) + .Select(t => new TutorialMapping(t, project, tabs))); + + SaveCommand = ReactiveCommand.Create(dialog => + { + foreach (TutorialMapping tutorial in Tutorials) + { + project.TutorialFile.Tutorials.First(t => t.Id == tutorial.Flag) + .AssociatedScript = (short)tutorial.Script.Event.Index; + } + IO.WriteStringFile(Path.Combine("assets", "events", $"{project.TutorialFile.Index:X3}.s"), + project.TutorialFile.GetSource([]), project, log); + dialog.Close(); + }); + CancelCommand = ReactiveCommand.Create(dialog => dialog.Close()); + } +} + +public class TutorialMapping(Tutorial tutorial, Project project, EditorTabsPanelViewModel tabs) : ReactiveObject +{ + public EditorTabsPanelViewModel Tabs { get; } = tabs; + + public ObservableCollection Scripts { get; } = new(project.Items + .Where(i => i.Type == ItemDescription.ItemType.Script) + .Cast()); + + [Reactive] + public int Flag { get; set; } = tutorial.Id; + + public string TutorialName => $"Tutorial {Flag}"; + + [Reactive] + public ScriptItem Script { get; set; } = (ScriptItem)project.Items.First(i => + i.Type == ItemDescription.ItemType.Script && ((ScriptItem)i).Event.Index == tutorial.AssociatedScript); +} diff --git a/src/SerialLoops/ViewModels/MainWindowViewModel.cs b/src/SerialLoops/ViewModels/MainWindowViewModel.cs index 07c1774b..69a37e56 100644 --- a/src/SerialLoops/ViewModels/MainWindowViewModel.cs +++ b/src/SerialLoops/ViewModels/MainWindowViewModel.cs @@ -130,6 +130,7 @@ public MainWindowViewModel() ApplyHacksCommand = ReactiveCommand.CreateFromTask(ApplyHacksCommand_Executed); CreateAsmHackCommand = ReactiveCommand.CreateFromTask(CreateAsmHackCommand_Executed); EditUiTextCommand = ReactiveCommand.CreateFromTask(EditUiTextCommand_Executed); + EditTutorialMappingsCommand = ReactiveCommand.CreateFromTask(EditTutorialMappingsCommand_Executed); ProjectSettingsCommand = ReactiveCommand.CreateFromTask(ProjectSettingsCommand_Executed); ExportProjectCommand = ReactiveCommand.CreateFromTask(ExportProjectCommand_Executed); ExportPatchCommand = ReactiveCommand.CreateFromTask(ExportPatchCommand_Executed); @@ -366,6 +367,13 @@ private async Task EditUiTextCommand_Executed() await editUiTextDialog.ShowDialog(Window); } + private async Task EditTutorialMappingsCommand_Executed() + { + EditTutorialMappingsDialogViewModel viewModel = new(OpenProject, EditorTabs, Log); + EditTutorialMappingsDialog dialog = new() { DataContext = viewModel }; + await dialog.ShowDialog(Window); + } + private async Task ProjectSettingsCommand_Executed() { ProjectSettingsDialogViewModel projectSettingsDialogViewModel = new(); diff --git a/src/SerialLoops/Views/Dialogs/EditTutorialMappingsDialog.axaml b/src/SerialLoops/Views/Dialogs/EditTutorialMappingsDialog.axaml new file mode 100644 index 00000000..a966cd18 --- /dev/null +++ b/src/SerialLoops/Views/Dialogs/EditTutorialMappingsDialog.axaml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +