refactor Bk2LogEntryGenerator to be stateless, refactor some IMovieSession shenangians
This commit is contained in:
parent
cdfeda8b71
commit
0d2f014621
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Simply shortens the verbosity necessary otherwise
|
||||
/// </summary>
|
||||
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);
|
||||
|
|
|
@ -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 ? ' ' : '.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -1,15 +1,12 @@
|
|||
using System.Collections.Generic;
|
||||
using BizHawk.Emulation.Common;
|
||||
|
||||
namespace BizHawk.Client.Common
|
||||
{
|
||||
/// <summary>
|
||||
/// Specifies a class that can take an input source and generate a movie input log entry
|
||||
/// </summary>
|
||||
public interface ILogEntryGenerator
|
||||
{
|
||||
/// <summary>
|
||||
/// Sets the controller source used to generate an input log entry
|
||||
/// </summary>
|
||||
void SetSource(IController source);
|
||||
|
||||
/// <summary>
|
||||
/// Generates an input log entry for the current state of Source
|
||||
/// </summary>
|
||||
|
@ -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)
|
||||
/// </summary>
|
||||
string EmptyEntry { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets a movie controller adapter in the same state as the log entry
|
||||
/// </summary>
|
||||
/// <seealso cref="IMovieController"/>
|
||||
IMovieController MovieControllerAdapter { get; }
|
||||
}
|
||||
}
|
||||
}
|
|
@ -114,9 +114,9 @@ namespace BizHawk.Client.Common
|
|||
void SaveBackup();
|
||||
|
||||
/// <summary>
|
||||
/// Creates an instance of the Input log entry used to generate the input log
|
||||
/// Creates a log generator using the given input source
|
||||
/// </summary>
|
||||
ILogEntryGenerator LogGeneratorInstance();
|
||||
ILogEntryGenerator LogGeneratorInstance(IController source);
|
||||
|
||||
#endregion
|
||||
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
|
@ -290,13 +290,11 @@ namespace BizHawk.Client.Common
|
|||
public void InsertInput(int frame, IEnumerable<IController> inputStates)
|
||||
{
|
||||
// ChangeLog is done in the InsertInput call.
|
||||
var lg = LogGeneratorInstance();
|
||||
|
||||
var inputLog = new List<string>();
|
||||
|
||||
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)
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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++)
|
||||
{
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue