From b22f9e6e01e0ec8b7377f0bb51224da893305b48 Mon Sep 17 00:00:00 2001 From: adelikat Date: Fri, 5 Jun 2020 10:14:45 -0500 Subject: [PATCH] move methods for Log copying from ITasMovie to IMovie. This bloats the IMovie contract more, but this allows for converting from one IMovie to another without an IEmulator dependency. Refactor conversion extensions to use these methods and remove emulator and movie session dependencies --- .../movie/MovieSession.cs | 2 +- .../movie/bk2/Bk2Movie.cs | 12 +++++++++++ .../conversions/MovieConversionExtensions.cs | 20 +++---------------- .../movie/interfaces/IMovie.cs | 3 +++ .../movie/interfaces/ITasMovie.cs | 2 -- .../movie/tasproj/TasMovie.cs | 12 +---------- .../movie/tasproj/TasStateManager.cs | 9 ++++----- 7 files changed, 24 insertions(+), 36 deletions(-) diff --git a/src/BizHawk.Client.Common/movie/MovieSession.cs b/src/BizHawk.Client.Common/movie/MovieSession.cs index 9dbc798201..3f5b173e9e 100644 --- a/src/BizHawk.Client.Common/movie/MovieSession.cs +++ b/src/BizHawk.Client.Common/movie/MovieSession.cs @@ -331,7 +331,7 @@ namespace BizHawk.Client.Common public void ConvertToTasProj() { Movie.Save(); - Movie = Movie.ToTasMovie(this); + Movie = Movie.ToTasMovie(); Movie.Save(); Movie.SwitchToPlay(); } diff --git a/src/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs b/src/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs index 4b40f0b77f..4d358172b8 100644 --- a/src/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs +++ b/src/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using BizHawk.Emulation.Common; using BizHawk.Emulation.Cores; @@ -92,6 +93,17 @@ namespace BizHawk.Client.Common } } + public IStringLog GetLogEntries() => Log; + + public void CopyLog(IEnumerable log) + { + Log.Clear(); + foreach (var entry in log) + { + Log.Add(entry); + } + } + public void AppendFrame(IController source) { var lg = LogGeneratorInstance(source); diff --git a/src/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs b/src/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs index d60eb8893c..ad46e7b2a3 100644 --- a/src/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs +++ b/src/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs @@ -15,20 +15,11 @@ namespace BizHawk.Client.Common.MovieConversionExtensions { public static class MovieConversionExtensions { - public static ITasMovie ToTasMovie(this IMovie old, IMovieSession session) + public static ITasMovie ToTasMovie(this IMovie old) { string newFilename = GetNewFileName(old.Filename); var tas = (ITasMovie)MovieService.Get(newFilename); - - // TODO: this relies on the fact that the emulator core here will be the same as when it is load - // so this specifically only works in the scenario of a running bk2 converted to tasproj in tastudio - // need to untangle and not be so dependent on core loading behavior - tas.Attach(session, old.Emulator); - for (var i = 0; i < old.InputLogLength; i++) - { - var input = old.GetInputState(i); - tas.AppendFrame(input); - } + tas.CopyLog(old.GetLogEntries()); old.Truncate(0); // Trying to minimize ram usage @@ -63,12 +54,7 @@ namespace BizHawk.Client.Common.MovieConversionExtensions public static IMovie ToBk2(this IMovie old) { var bk2 = MovieService.Get(old.Filename.Replace(old.PreferredExtension, Bk2Movie.Extension)); - - for (var i = 0; i < old.InputLogLength; i++) - { - var input = old.GetInputState(i); - bk2.AppendFrame(input); - } + bk2.CopyLog(old.GetLogEntries()); bk2.HeaderEntries.Clear(); foreach (var kvp in old.HeaderEntries) diff --git a/src/BizHawk.Client.Common/movie/interfaces/IMovie.cs b/src/BizHawk.Client.Common/movie/interfaces/IMovie.cs index 60c735473a..b3436f49a4 100644 --- a/src/BizHawk.Client.Common/movie/interfaces/IMovie.cs +++ b/src/BizHawk.Client.Common/movie/interfaces/IMovie.cs @@ -240,6 +240,9 @@ namespace BizHawk.Client.Common /// The currently attached core or null if not yet attached /// IEmulator Emulator { get; } + + IStringLog GetLogEntries(); + void CopyLog(IEnumerable log); } public static class MovieExtensions diff --git a/src/BizHawk.Client.Common/movie/interfaces/ITasMovie.cs b/src/BizHawk.Client.Common/movie/interfaces/ITasMovie.cs index f0a9b60704..ac5ef3f402 100644 --- a/src/BizHawk.Client.Common/movie/interfaces/ITasMovie.cs +++ b/src/BizHawk.Client.Common/movie/interfaces/ITasMovie.cs @@ -26,7 +26,6 @@ namespace BizHawk.Client.Common string DisplayValue(int frame, string buttonName); void FlagChanges(); void ClearChanges(); - IStringLog GetLogEntries(); void GreenzoneCurrentFrame(); void ToggleBoolState(int frame, string buttonName); @@ -48,7 +47,6 @@ namespace BizHawk.Client.Common void LoadBranch(TasBranch branch); - void CopyLog(IEnumerable log); void CopyVerificationLog(IEnumerable log); } } diff --git a/src/BizHawk.Client.Common/movie/tasproj/TasMovie.cs b/src/BizHawk.Client.Common/movie/tasproj/TasMovie.cs index b534b0adaf..aebe6a693e 100644 --- a/src/BizHawk.Client.Common/movie/tasproj/TasMovie.cs +++ b/src/BizHawk.Client.Common/movie/tasproj/TasMovie.cs @@ -165,15 +165,7 @@ namespace BizHawk.Client.Common } } - public void CopyLog(IEnumerable log) - { - Log.Clear(); - foreach (var entry in log) - { - Log.Add(entry); - } - } - + public void CopyVerificationLog(IEnumerable log) { foreach (string entry in log) @@ -182,8 +174,6 @@ namespace BizHawk.Client.Common } } - public IStringLog GetLogEntries() => Log; - // TODO: this is 99% copy pasting of bad code public override bool ExtractInputLog(TextReader reader, out string errorMessage) { diff --git a/src/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs b/src/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs index aae9505f6f..be8c67c975 100644 --- a/src/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs +++ b/src/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs @@ -46,11 +46,10 @@ namespace BizHawk.Client.Common public void Attach(IEmulator emulator) { - // TODO: we aren't ready for this, attach is called when converting a bk2 to tasproj and again to officially load the emulator - //if (!_emulator.IsNull()) - //{ - // throw new InvalidOperationException("A core has already been attached!"); - //} + if (!_emulator.IsNull()) + { + throw new InvalidOperationException("A core has already been attached!"); + } if (!emulator.HasSavestates()) {