diff --git a/src/BizHawk.Client.Common/movie/MovieSession.cs b/src/BizHawk.Client.Common/movie/MovieSession.cs index 2cacfa3815..79680e62a2 100644 --- a/src/BizHawk.Client.Common/movie/MovieSession.cs +++ b/src/BizHawk.Client.Common/movie/MovieSession.cs @@ -82,12 +82,6 @@ namespace BizHawk.Client.Common else if (Movie.IsPlaying()) { LatchInputToLog(); - // if we're at the movie's end and the MovieEndAction is record, just continue recording in play mode - // TODO change to TAStudio check - if (Movie is ITasMovie && Movie.Emulator.Frame == Movie.FrameCount && Settings.MovieEndAction == MovieEndAction.Record) - { - Movie.RecordFrame(Movie.Emulator.Frame, MovieOut.Source); - } } else if (Movie.IsRecording()) { @@ -96,16 +90,14 @@ namespace BizHawk.Client.Common } } - public void HandleFrameAfter() + public void HandleFrameAfter(bool ignoreMovieEndAction) { if (Movie is ITasMovie tasMovie) { tasMovie.GreenzoneCurrentFrame(); - // TODO change to TAStudio check - if (Settings.MovieEndAction == MovieEndAction.Record) return; } - if (Movie.IsPlaying() && Movie.Emulator.Frame >= Movie.FrameCount) + if (!ignoreMovieEndAction && Movie.IsPlaying() && Movie.Emulator.Frame == Movie.FrameCount) { HandlePlaybackEnd(); } diff --git a/src/BizHawk.Client.Common/movie/interfaces/IMovieSession.cs b/src/BizHawk.Client.Common/movie/interfaces/IMovieSession.cs index 57aaa3ebc2..88f268b2d2 100644 --- a/src/BizHawk.Client.Common/movie/interfaces/IMovieSession.cs +++ b/src/BizHawk.Client.Common/movie/interfaces/IMovieSession.cs @@ -54,7 +54,7 @@ namespace BizHawk.Client.Common IMovieController GenerateMovieController(ControllerDefinition definition = null, string logKey = null); void HandleFrameBefore(); - void HandleFrameAfter(); + void HandleFrameAfter(bool ignoreMovieEndAction); void HandleSaveState(TextWriter writer); bool CheckSavestateTimeline(TextReader reader); diff --git a/src/BizHawk.Client.EmuHawk/IControlMainform.cs b/src/BizHawk.Client.EmuHawk/IControlMainform.cs index 74309bd701..2cfa6ececa 100644 --- a/src/BizHawk.Client.EmuHawk/IControlMainform.cs +++ b/src/BizHawk.Client.EmuHawk/IControlMainform.cs @@ -61,5 +61,7 @@ bool WantsToControlRestartMovie { get; } bool RestartMovie(); + + bool WantsToBypassMovieEndAction { get; } } } diff --git a/src/BizHawk.Client.EmuHawk/MainForm.Events.cs b/src/BizHawk.Client.EmuHawk/MainForm.Events.cs index b1dc69b7e5..4f367783e9 100644 --- a/src/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/src/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -183,13 +183,6 @@ namespace BizHawk.Client.EmuHawk MovieEndRecordMenuItem.Checked = Config.Movies.MovieEndAction == MovieEndAction.Record; MovieEndStopMenuItem.Checked = Config.Movies.MovieEndAction == MovieEndAction.Stop; MovieEndPauseMenuItem.Checked = Config.Movies.MovieEndAction == MovieEndAction.Pause; - - // Arguably an IControlMainForm property should be set here, but in reality only Tastudio is ever going to interfere with this logic - MovieEndFinishMenuItem.Enabled = - MovieEndRecordMenuItem.Enabled = - MovieEndStopMenuItem.Enabled = - MovieEndPauseMenuItem.Enabled = - !Tools.Has(); } private void AVSubMenu_DropDownOpened(object sender, EventArgs e) diff --git a/src/BizHawk.Client.EmuHawk/MainForm.cs b/src/BizHawk.Client.EmuHawk/MainForm.cs index efb3a14a53..c8ea9768bf 100644 --- a/src/BizHawk.Client.EmuHawk/MainForm.cs +++ b/src/BizHawk.Client.EmuHawk/MainForm.cs @@ -1118,6 +1118,7 @@ namespace BizHawk.Client.EmuHawk private IControlMainform ToolControllingStopMovie => Tools.FirstOrNull(tool => tool.WantsToControlStopMovie); private IControlMainform ToolControllingRestartMovie => Tools.FirstOrNull(tool => tool.WantsToControlRestartMovie); private IControlMainform ToolControllingReadOnly => Tools.FirstOrNull(tool => tool.WantsToControlReadOnly); + private IControlMainform ToolBypassingMovieEndAction => Tools.FirstOrNull(tool => tool.WantsToBypassMovieEndAction); private DisplayManager DisplayManager; @@ -3081,7 +3082,7 @@ namespace BizHawk.Client.EmuHawk bool render = !InvisibleEmulation && (!_throttle.skipNextFrame || _currAviWriter?.UsesVideo is true || atTurboSeekEnd); bool newFrame = Emulator.FrameAdvance(InputManager.ControllerOutput, render, renderSound); - MovieSession.HandleFrameAfter(); + MovieSession.HandleFrameAfter(ToolBypassingMovieEndAction is not null); if (returnToRecording) { diff --git a/src/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs b/src/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs index 5c3360d602..a7e990dcc8 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs @@ -45,6 +45,8 @@ public bool RestartMovie() => false; + public bool WantsToBypassMovieEndAction => false; + // TODO: We want to prevent movies and probably other things } } diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IControlMainForm.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IControlMainForm.cs index c3fabeb55f..b242aad94d 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IControlMainForm.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IControlMainForm.cs @@ -113,5 +113,7 @@ public bool WantsToControlReboot => false; public void RebootCore() => throw new NotSupportedException("This should never be called"); + + public bool WantsToBypassMovieEndAction => true; } } diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs index 9083965268..5b5564bdc8 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs @@ -52,6 +52,16 @@ namespace BizHawk.Client.EmuHawk } } + protected override void UpdateBefore() + { + if (CurrentTasMovie.IsAtEnd()) + { + CurrentTasMovie.RecordFrame(CurrentTasMovie.Emulator.Frame, MovieSession.StickySource); + } + } + + protected override void FastUpdateBefore() => UpdateBefore(); + protected override void GeneralUpdate() { RefreshDialog(); diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs index 46d55e7abf..1e87c41022 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs @@ -34,7 +34,6 @@ namespace BizHawk.Client.EmuHawk private readonly List _tasClipboard = new List(); private const string CursorColumnName = "CursorColumn"; private const string FrameColumnName = "FrameColumn"; - private MovieEndAction _originalEndAction; // The movie end behavior selected by the user (that is overridden by TAStudio) private UndoHistoryForm _undoForm; private Timer _autosaveTimer; @@ -292,9 +291,7 @@ namespace BizHawk.Client.EmuHawk } MainForm.AddOnScreenMessage("TAStudio engaged"); - _originalEndAction = Config.Movies.MovieEndAction; MainForm.DisableRewind(); - Config.Movies.MovieEndAction = MovieEndAction.Record; MainForm.SetMainformMovieInfo(); MovieSession.ReadOnly = true; SetSplicer(); @@ -673,7 +670,6 @@ namespace BizHawk.Client.EmuHawk _engaged = false; MainForm.PauseOnFrame = null; MainForm.AddOnScreenMessage("TAStudio disengaged"); - Config.Movies.MovieEndAction = _originalEndAction; WantsToControlRewind = false; MainForm.EnableRewind(true); MainForm.SetMainformMovieInfo();