diff --git a/BizHawk.Client.Common/Api/Classes/JoypadApi.cs b/BizHawk.Client.Common/Api/Classes/JoypadApi.cs index da42cea7b4..b1fbf1664b 100644 --- a/BizHawk.Client.Common/Api/Classes/JoypadApi.cs +++ b/BizHawk.Client.Common/Api/Classes/JoypadApi.cs @@ -28,7 +28,7 @@ namespace BizHawk.Client.Common public void SetFromMnemonicStr(string inputLogEntry) { - var lg = Global.MovieSession.MovieControllerInstance(); + var lg = Global.MovieSession.GenerateMovieController(Global.Emulator.ControllerDefinition); try { lg.SetFromMnemonic(inputLogEntry); diff --git a/BizHawk.Client.Common/movie/MovieSession.cs b/BizHawk.Client.Common/movie/MovieSession.cs index 443d177fa1..2e8fd51f80 100644 --- a/BizHawk.Client.Common/movie/MovieSession.cs +++ b/BizHawk.Client.Common/movie/MovieSession.cs @@ -27,7 +27,7 @@ namespace BizHawk.Client.Common public bool MovieIsQueued => QueuedMovie != null; public MultitrackRecorder MultiTrack { get; } = new MultitrackRecorder(); - public IMovieController MovieController { get; set; } = MovieService.DefaultInstance.LogGeneratorInstance().MovieControllerAdapter; + public IMovieController MovieController { get; set; } = new Bk2Controller("", NullController.Instance.Definition); public IMovie Movie { get; set; } public bool ReadOnly { get; set; } = true; @@ -52,19 +52,18 @@ namespace BizHawk.Client.Common MovieController = new Bk2Controller(definition); } + public IMovieController GenerateMovieController(ControllerDefinition definition) + { + // TODO: expose Movie.LogKey and pass in here + return new Bk2Controller("", definition); + } + /// /// Simply shortens the verbosity necessary otherwise /// public ILogEntryGenerator LogGeneratorInstance(IController source) { - var lg = Movie.LogGeneratorInstance(); - lg.SetSource(source); - return lg; - } - - public IMovieController MovieControllerInstance() - { - return Movie.LogGeneratorInstance().MovieControllerAdapter; + return Movie.LogGeneratorInstance(source); } // Convenience property that gets the controller state from the movie for the most recent frame @@ -277,8 +276,7 @@ namespace BizHawk.Client.Common else if (Global.Config.MoviePlaybackPokeMode) { LatchInputFromPlayer(Global.InputManager.MovieInputSourceAdapter); - var lg = Movie.LogGeneratorInstance(); - lg.SetSource(Global.InputManager.MovieOutputHardpoint); + var lg = Movie.LogGeneratorInstance(Global.InputManager.MovieOutputHardpoint); if (!lg.IsEmpty) { LatchInputFromPlayer(Global.InputManager.MovieInputSourceAdapter); diff --git a/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs b/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs index 814cd1a8fb..3dd2db5365 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs @@ -6,20 +6,17 @@ using BizHawk.Emulation.Common; namespace BizHawk.Client.Common { - public class Bk2LogEntryGenerator : ILogEntryGenerator + internal class Bk2LogEntryGenerator : ILogEntryGenerator { - private readonly string _logKey; - private IController _source = NullController.Instance; + private readonly string _systemId; + private readonly IController _source; - public Bk2LogEntryGenerator(string logKey) + public Bk2LogEntryGenerator(string systemId, IController source) { - _logKey = logKey; + _systemId = systemId; + _source = source; } - public IMovieController MovieControllerAdapter => new Bk2Controller(_logKey, _source.Definition); - - public void SetSource(IController source) => _source = source; - public string GenerateInputDisplay() => CreateLogEntry(forInputDisplay: true); public bool IsEmpty => EmptyEntry == GenerateLogEntry(); @@ -38,9 +35,7 @@ namespace BizHawk.Client.Common sb.Append("#"); foreach (var button in group) { - sb - .Append(button) - .Append('|'); + sb.Append(button).Append('|'); } } @@ -56,11 +51,11 @@ namespace BizHawk.Client.Common { if (_source.Definition.BoolButtons.Contains(button)) { - dict.Add(button, Bk2MnemonicLookup.Lookup(button, Global.Emulator.SystemId).ToString()); + dict.Add(button, Bk2MnemonicLookup.Lookup(button, _systemId).ToString()); } else if (_source.Definition.AxisControls.Contains(button)) { - dict.Add(button, Bk2MnemonicLookup.LookupAxis(button, Global.Emulator.SystemId)); + dict.Add(button, Bk2MnemonicLookup.LookupAxis(button, _systemId)); } } } @@ -115,7 +110,9 @@ namespace BizHawk.Client.Common } else { - sb.Append(_source.IsPressed(button) ? Bk2MnemonicLookup.Lookup(button, Global.Emulator.SystemId) : forInputDisplay ? ' ' : '.'); + sb.Append(_source.IsPressed(button) + ? Bk2MnemonicLookup.Lookup(button, _systemId) + : forInputDisplay ? ' ' : '.'); } } } diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs index e377dc3235..f40538d299 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs @@ -288,9 +288,7 @@ namespace BizHawk.Client.Common protected void WriteRawInputLog(TextWriter writer) { - var lg = new Bk2LogEntryGenerator(LogKey); - lg.SetSource(Global.InputManager.MovieOutputHardpoint); - + var lg = new Bk2LogEntryGenerator(LogKey, Global.InputManager.MovieOutputHardpoint); writer.WriteLine(lg.GenerateLogKey()); foreach (var record in Log) diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs index d0d85079e3..decb6d8d02 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs @@ -38,9 +38,10 @@ namespace BizHawk.Client.Common public virtual bool Changes { get; protected set; } public bool IsCountingRerecords { get; set; } = true; - public ILogEntryGenerator LogGeneratorInstance() + public ILogEntryGenerator LogGeneratorInstance(IController source) { - return new Bk2LogEntryGenerator(LogKey); + // TODO: when Bk2 movies have an instance of the core, use that + return new Bk2LogEntryGenerator(Global.Emulator.SystemId, source); } public double FrameCount @@ -84,8 +85,7 @@ namespace BizHawk.Client.Common public void AppendFrame(IController source) { - var lg = LogGeneratorInstance(); - lg.SetSource(source); + var lg = LogGeneratorInstance(source); Log.Add(lg.GenerateLogEntry()); Changes = true; } @@ -100,8 +100,7 @@ namespace BizHawk.Client.Common } } - var lg = LogGeneratorInstance(); - lg.SetSource(source); + var lg = LogGeneratorInstance(source); SetFrameAt(frame, lg.GenerateLogEntry()); Changes = true; @@ -154,17 +153,14 @@ namespace BizHawk.Client.Common public virtual void PokeFrame(int frame, IController source) { - var lg = LogGeneratorInstance(); - lg.SetSource(source); - - Changes = true; + var lg = LogGeneratorInstance(source); SetFrameAt(frame, lg.GenerateLogEntry()); + Changes = true; } public virtual void ClearFrame(int frame) { - var lg = LogGeneratorInstance(); - lg.SetSource(Global.MovieSession.MovieControllerInstance()); + var lg = LogGeneratorInstance(Global.MovieSession.MovieController); SetFrameAt(frame, lg.EmptyEntry); Changes = true; } diff --git a/BizHawk.Client.Common/movie/interfaces/ILogEntryGenerator.cs b/BizHawk.Client.Common/movie/interfaces/ILogEntryGenerator.cs index 37fc502473..c893431d43 100644 --- a/BizHawk.Client.Common/movie/interfaces/ILogEntryGenerator.cs +++ b/BizHawk.Client.Common/movie/interfaces/ILogEntryGenerator.cs @@ -1,15 +1,12 @@ using System.Collections.Generic; -using BizHawk.Emulation.Common; namespace BizHawk.Client.Common { + /// + /// Specifies a class that can take an input source and generate a movie input log entry + /// public interface ILogEntryGenerator { - /// - /// Sets the controller source used to generate an input log entry - /// - void SetSource(IController source); - /// /// Generates an input log entry for the current state of Source /// @@ -42,11 +39,5 @@ namespace BizHawk.Client.Common /// Gets an input log entry that is considered empty. (booleans will be false, floats will be 0) /// string EmptyEntry { get; } - - /// - /// Gets a movie controller adapter in the same state as the log entry - /// - /// - IMovieController MovieControllerAdapter { get; } } -} +} \ No newline at end of file diff --git a/BizHawk.Client.Common/movie/interfaces/IMovie.cs b/BizHawk.Client.Common/movie/interfaces/IMovie.cs index 2d0b106dfb..00f34eb65f 100644 --- a/BizHawk.Client.Common/movie/interfaces/IMovie.cs +++ b/BizHawk.Client.Common/movie/interfaces/IMovie.cs @@ -114,9 +114,9 @@ namespace BizHawk.Client.Common void SaveBackup(); /// - /// Creates an instance of the Input log entry used to generate the input log + /// Creates a log generator using the given input source /// - ILogEntryGenerator LogGeneratorInstance(); + ILogEntryGenerator LogGeneratorInstance(IController source); #endregion diff --git a/BizHawk.Client.Common/movie/interfaces/IMovieSession.cs b/BizHawk.Client.Common/movie/interfaces/IMovieSession.cs index 9a3d37e0ef..5d010104b2 100644 --- a/BizHawk.Client.Common/movie/interfaces/IMovieSession.cs +++ b/BizHawk.Client.Common/movie/interfaces/IMovieSession.cs @@ -8,7 +8,6 @@ namespace BizHawk.Client.Common IMovie Movie { get; set; } IMovie QueuedMovie { get; } IMovieController MovieController { get; } - IMovieController MovieControllerInstance(); MultitrackRecorder MultiTrack { get; } IController PreviousFrame { get; } @@ -16,6 +15,8 @@ namespace BizHawk.Client.Common void CreateMovieController(ControllerDefinition definition); + IMovieController GenerateMovieController(ControllerDefinition definition); + bool ReadOnly { get; set; } bool MovieIsQueued { get; } diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.Editing.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.Editing.cs index 89d9612ac3..7598d6d7d8 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.Editing.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasMovie.Editing.cs @@ -290,13 +290,11 @@ namespace BizHawk.Client.Common public void InsertInput(int frame, IEnumerable inputStates) { // ChangeLog is done in the InsertInput call. - var lg = LogGeneratorInstance(); - var inputLog = new List(); foreach (var input in inputStates) { - lg.SetSource(input); + var lg = LogGeneratorInstance(input); inputLog.Add(lg.GenerateLogEntry()); } @@ -307,7 +305,7 @@ namespace BizHawk.Client.Common { int firstChangedFrame = -1; ChangeLog.BeginNewBatch($"Copy Over Input: {frame}"); - var lg = LogGeneratorInstance(); + var states = inputStates.ToList(); if (Log.Count < states.Count + frame) @@ -324,7 +322,7 @@ namespace BizHawk.Client.Common break; } - lg.SetSource(states[i]); + var lg = LogGeneratorInstance(states[i]); var entry = lg.GenerateLogEntry(); if (firstChangedFrame == -1 && Log[frame + i] != entry) { @@ -347,8 +345,7 @@ namespace BizHawk.Client.Common bool endBatch = ChangeLog.BeginNewBatch($"Insert Empty Frame: {frame}", true); ChangeLog.AddGeneralUndo(frame, InputLogLength + count - 1); - var lg = LogGeneratorInstance(); - lg.SetSource(Global.MovieSession.MovieControllerInstance()); + var lg = LogGeneratorInstance(Global.MovieSession.MovieController); if (frame > Log.Count()) { @@ -395,8 +392,8 @@ namespace BizHawk.Client.Common Global.MovieSession.MovieController.SetFromSticky(Global.InputManager.AutofireStickyXorAdapter); - var lg = LogGeneratorInstance(); - lg.SetSource(Global.InputManager.MovieOutputHardpoint); // account for autohold. needs autohold pattern to be already recorded in the current frame + // account for autohold. needs autohold pattern to be already recorded in the current frame + var lg = LogGeneratorInstance(Global.InputManager.MovieOutputHardpoint); for (int i = 0; i < numFrames; i++) { @@ -422,8 +419,7 @@ namespace BizHawk.Client.Common var adapter = GetInputState(frame); adapter.SetBool(buttonName, !adapter.IsPressed(buttonName)); - var lg = LogGeneratorInstance(); - lg.SetSource(adapter); + var lg = LogGeneratorInstance(adapter); Log[frame] = lg.GenerateLogEntry(); Changes = true; InvalidateAfter(frame); @@ -442,8 +438,7 @@ namespace BizHawk.Client.Common var old = adapter.IsPressed(buttonName); adapter.SetBool(buttonName, val); - var lg = LogGeneratorInstance(); - lg.SetSource(adapter); + var lg = LogGeneratorInstance(adapter); Log[frame] = lg.GenerateLogEntry(); if (old != val) @@ -470,8 +465,7 @@ namespace BizHawk.Client.Common bool old = adapter.IsPressed(buttonName); adapter.SetBool(buttonName, val); - var lg = LogGeneratorInstance(); - lg.SetSource(adapter); + var lg = LogGeneratorInstance(adapter); Log[frame + i] = lg.GenerateLogEntry(); if (changed == -1 && old != val) @@ -500,8 +494,7 @@ namespace BizHawk.Client.Common var old = adapter.AxisValue(buttonName); adapter.SetAxis(buttonName, val); - var lg = LogGeneratorInstance(); - lg.SetSource(adapter); + var lg = LogGeneratorInstance(adapter); Log[frame] = lg.GenerateLogEntry(); if (old != val) @@ -528,8 +521,7 @@ namespace BizHawk.Client.Common float old = adapter.AxisValue(buttonName); adapter.SetAxis(buttonName, val); - var lg = LogGeneratorInstance(); - lg.SetSource(adapter); + var lg = LogGeneratorInstance(adapter); Log[frame + i] = lg.GenerateLogEntry(); if (changed == -1 && old != val) diff --git a/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs b/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs index b4b772a708..e03763772f 100644 --- a/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs +++ b/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs @@ -233,7 +233,7 @@ namespace BizHawk.Client.EmuHawk { var m = Global.MovieSession.Movie.IsPlayingOrRecording() ? Global.MovieSession.Movie.GetInputState(Global.Emulator.Frame - 1) - : Global.MovieSession.MovieControllerInstance(); + : Global.MovieSession.MovieController; return MakeStringFor(Global.InputManager.AutofireStickyXorAdapter.And(m)); } diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs index f0e7ff1bfe..78593e02e9 100644 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ b/BizHawk.Client.EmuHawk/MainForm.cs @@ -210,7 +210,6 @@ namespace BizHawk.Client.EmuHawk MovieSession = new MovieSession { Movie = MovieService.DefaultInstance, - MovieController = MovieService.DefaultInstance.LogGeneratorInstance().MovieControllerAdapter, MessageCallback = AddOnScreenMessage, PopupCallback = ShowMessageCoreComm, AskYesNoCallback = StateErrorAskUser, diff --git a/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs b/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs index 9bbc1d814f..f62a5bcd73 100644 --- a/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs +++ b/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs @@ -779,7 +779,7 @@ namespace BizHawk.Client.EmuHawk if (index < _bestBotAttempt.Log.Count) { var logEntry = _bestBotAttempt.Log[index]; - var lg = Global.MovieSession.MovieControllerInstance(); + var lg = Global.MovieSession.GenerateMovieController(Emulator.ControllerDefinition); lg.SetFromMnemonic(logEntry); foreach (var button in lg.Definition.BoolButtons) diff --git a/BizHawk.Client.EmuHawk/tools/Macros/MovieZone.cs b/BizHawk.Client.EmuHawk/tools/Macros/MovieZone.cs index d05de07645..1d4a40a80b 100644 --- a/BizHawk.Client.EmuHawk/tools/Macros/MovieZone.cs +++ b/BizHawk.Client.EmuHawk/tools/Macros/MovieZone.cs @@ -20,8 +20,7 @@ namespace BizHawk.Client.EmuHawk { _emulator = emulator; _tools = tools; - var lg = movie.LogGeneratorInstance(); - lg.SetSource(Global.MovieSession.MovieController); + var lg = movie.LogGeneratorInstance(Global.MovieSession.MovieController); _targetController = new Bk2Controller(_emulator.ControllerDefinition); _targetController.SetFrom(_targetController); // Reference and create all buttons @@ -55,8 +54,7 @@ namespace BizHawk.Client.EmuHawk } _controller = new Bk2Controller(d); - var logGenerator = new Bk2LogEntryGenerator(""); - logGenerator.SetSource(_controller); + var logGenerator = Global.MovieSession.LogGeneratorInstance(_controller); logGenerator.GenerateLogEntry(); // Reference and create all buttons. string movieKey = logGenerator.GenerateLogKey().Replace("LogKey:", "").Replace("#", ""); @@ -109,14 +107,11 @@ namespace BizHawk.Client.EmuHawk } var newController = new Bk2Controller(d); - var logGenerator = new Bk2LogEntryGenerator(""); - - logGenerator.SetSource(newController); + var logGenerator = Global.MovieSession.LogGeneratorInstance(newController); logGenerator.GenerateLogEntry(); // Reference and create all buttons. // Reset all buttons in targetController (it may still have buttons that aren't being set here set true) - var tC = new Bk2LogEntryGenerator(""); - tC.SetSource(_targetController); + var tC = Global.MovieSession.LogGeneratorInstance(_targetController); _targetController.SetFromMnemonic(tC.EmptyEntry); for (int i = 0; i < Length; i++) { diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs index 50c54b53a1..5273c7fc14 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs @@ -450,8 +450,7 @@ namespace BizHawk.Client.EmuHawk } _tasClipboard.Add(new TasClipboardEntry(index, input)); - var lg = CurrentTasMovie.LogGeneratorInstance(); - lg.SetSource(input); + var lg = CurrentTasMovie.LogGeneratorInstance(input); sb.AppendLine(lg.GenerateLogEntry()); } @@ -568,8 +567,7 @@ namespace BizHawk.Client.EmuHawk } _tasClipboard.Add(new TasClipboardEntry(index, input)); - var lg = CurrentTasMovie.LogGeneratorInstance(); - lg.SetSource(input); + var lg = CurrentTasMovie.LogGeneratorInstance(input); sb.AppendLine(lg.GenerateLogEntry()); } diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs index 9bf9295f4d..62ad1ba3e9 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs @@ -580,12 +580,10 @@ namespace BizHawk.Client.EmuHawk { get { - var lg = CurrentTasMovie.LogGeneratorInstance(); - lg.SetSource(Global.MovieSession.MovieControllerInstance()); + var lg = CurrentTasMovie.LogGeneratorInstance(Global.MovieSession.MovieController); var empty = lg.EmptyEntry; foreach (var row in TasView.SelectedRows) { - if (CurrentTasMovie[row].LogEntry != empty) { return row; @@ -599,7 +597,9 @@ namespace BizHawk.Client.EmuHawk private void AddColumn(RollColumn column) { if (TasView.AllColumns[column.Name] == null) + { TasView.AllColumns.Add(column); + } } private void EngageTastudio() diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudioClipboard.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudioClipboard.cs index be6181e49d..84ca02c4b3 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudioClipboard.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudioClipboard.cs @@ -19,7 +19,7 @@ namespace BizHawk.Client.EmuHawk public override string ToString() { - var lg = Global.MovieSession.Movie.LogGeneratorInstance(); + var lg = Global.MovieSession.Movie.LogGeneratorInstance(ControllerState); return lg.GenerateLogEntry(); } @@ -27,7 +27,7 @@ namespace BizHawk.Client.EmuHawk { try { - var lg = Global.MovieSession.MovieControllerInstance(); + var lg = Global.MovieSession.GenerateMovieController(Global.Emulator.ControllerDefinition); lg.SetFromMnemonic(inputLogEntry); foreach (var button in lg.Definition.BoolButtons)