Major cleanup of MnemonicsGenerator - change it to a LogEntryGenerator notion, and only expose it through a movie implementation, via an ILogEntryGenerator interface

This commit is contained in:
adelikat 2014-06-14 22:36:32 +00:00
parent 1cefb2dd95
commit 6ec1a45b70
9 changed files with 264 additions and 234 deletions

View File

@ -148,6 +148,7 @@
<Compile Include="movie\bkm\BkmMovie.ModeApi.cs" />
<Compile Include="movie\HeaderKeys.cs" />
<Compile Include="movie\InputAdapters.cs" />
<Compile Include="movie\interfaces\ILogEntryGenerator.cs" />
<Compile Include="movie\interfaces\IMovie.cs" />
<Compile Include="movie\MnemonicsGenerator.cs" />
<Compile Include="movie\MovieImport.cs" />

View File

@ -49,14 +49,6 @@ namespace BizHawk.Client.Common
//the "output" port for the controller chain.
public static CopyControllerAdapter ControllerOutput = new CopyControllerAdapter();
public static string GetOutputControllersAsMnemonic()
{
MnemonicsGenerator mg = new MnemonicsGenerator();
mg.SetSource(ControllerOutput);
return mg.GetControllersAsMnemonic();
}
public static DiscHopper DiscHopper = new DiscHopper();
public static UD_LR_ControllerAdapter UD_LR_ControllerAdapter = new UD_LR_ControllerAdapter();

View File

@ -5,34 +5,193 @@ using BizHawk.Emulation.Common;
namespace BizHawk.Client.Common
{
// Used with the version 1 movie implementation
public class MnemonicsGenerator
public class BkmLogEntryGenerator : ILogEntryGenerator
{
private IController _source;
public bool this[int player, string mnemonic]
{
get
{
return IsBasePressed("P" + player + " " + mnemonic); // TODO: not every controller uses "P"
}
}
public void SetSource(IController source)
{
_source = source;
_controlType = source.Type.Name;
}
public string GenerateLogEntry()
{
if (_controlType == "Null Controller")
{
return "|.|";
}
else if (_controlType == "Atari 7800 ProLine Joystick Controller")
{
return GetA78ControllersAsMnemonic();
}
else if (_controlType == "SNES Controller")
{
return GetSNESControllersAsMnemonic();
}
else if (_controlType == "Commodore 64 Controller")
{
return GetC64ControllersAsMnemonic();
}
else if (_controlType == "GBA Controller")
{
return GetGBAControllersAsMnemonic();
}
else if (_controlType == "Dual Gameboy Controller")
{
return GetDualGameBoyControllerAsMnemonic();
}
else if (_controlType == "WonderSwan Controller")
{
return GetWonderSwanControllerAsMnemonic();
}
else if (_controlType == "Nintento 64 Controller")
{
return GetN64ControllersAsMnemonic();
}
else if (_controlType == "Saturn Controller")
{
return GetSaturnControllersAsMnemonic();
}
else if (_controlType == "PSP Controller")
{
return "|.|"; // TODO
}
else if (_controlType == "GPGX Genesis Controller")
{
return GetGeneis6ButtonControllersAsMnemonic();
}
var input = new StringBuilder("|");
if (_controlType == "PC Engine Controller")
{
input.Append(".");
}
else if (_controlType == "Atari 2600 Basic Controller")
{
input.Append(IsBasePressed("Reset") ? "r" : ".");
input.Append(IsBasePressed("Select") ? "s" : ".");
}
else if (_controlType == "NES Controller")
{
if (IsBasePressed("Power"))
{
input.Append(MnemonicConstants.COMMANDS[_controlType]["Power"]);
}
else if (IsBasePressed("Reset"))
{
input.Append(MnemonicConstants.COMMANDS[_controlType]["Reset"]);
}
else if (IsBasePressed("FDS Eject"))
{
input.Append(MnemonicConstants.COMMANDS[_controlType]["FDS Eject"]);
}
else if (IsBasePressed("FDS Insert 0"))
{
input.Append("0");
}
else if (IsBasePressed("FDS Insert 1"))
{
input.Append("1");
}
else if (IsBasePressed("FDS Insert 2"))
{
input.Append("2");
}
else if (IsBasePressed("FDS Insert 3"))
{
input.Append("3");
}
else if (IsBasePressed("VS Coin 1"))
{
input.Append(MnemonicConstants.COMMANDS[_controlType]["VS Coin 1"]);
}
else if (IsBasePressed("VS Coin 2"))
{
input.Append(MnemonicConstants.COMMANDS[_controlType]["VS Coin 2"]);
}
else
{
input.Append('.');
}
}
else if (_controlType == "Genesis 3-Button Controller")
{
if (IsBasePressed("Power"))
{
input.Append(MnemonicConstants.COMMANDS[_controlType]["Power"]);
}
else if (IsBasePressed("Reset"))
{
input.Append(MnemonicConstants.COMMANDS[_controlType]["Reset"]);
}
else
{
input.Append('.');
}
}
else if (_controlType == "Gameboy Controller")
{
input.Append(IsBasePressed("Power") ? MnemonicConstants.COMMANDS[_controlType]["Power"] : ".");
}
if (_controlType != "SMS Controller" && _controlType != "TI83 Controller" && _controlType != "ColecoVision Basic Controller")
{
input.Append("|");
}
for (int player = 1; player <= MnemonicConstants.PLAYERS[_controlType]; player++)
{
var prefix = String.Empty;
if (_controlType != "Gameboy Controller" && _controlType != "TI83 Controller")
{
prefix = "P" + player + " ";
}
foreach (var button in MnemonicConstants.BUTTONS[_controlType].Keys)
{
input.Append(IsBasePressed(prefix + button) ? MnemonicConstants.BUTTONS[_controlType][button] : ".");
}
input.Append("|");
}
if (_controlType == "SMS Controller")
{
foreach (var command in MnemonicConstants.COMMANDS[_controlType].Keys)
{
input.Append(IsBasePressed(command) ? MnemonicConstants.COMMANDS[_controlType][command] : ".");
}
input.Append("|");
}
if (_controlType == "TI83 Controller")
{
input.Append(".|"); // TODO: perhaps ON should go here?
}
return input.ToString();
}
public string GenerateInputDisplay()
{
return GenerateLogEntry()
.Replace(".", " ")
.Replace("|", "")
.Replace(" 000, 000", " ");
}
public bool IsEmpty
{
get
{
return EmptyMnemonic == GetControllersAsMnemonic();
return EmptyEntry == GenerateLogEntry();
}
}
public string EmptyMnemonic
public string EmptyEntry
{
get
{
@ -380,166 +539,6 @@ namespace BizHawk.Client.Common
return input.ToString();
}
public string GetControllersAsMnemonic()
{
if (_controlType == "Null Controller")
{
return "|.|";
}
else if (_controlType == "Atari 7800 ProLine Joystick Controller")
{
return GetA78ControllersAsMnemonic();
}
else if (_controlType == "SNES Controller")
{
return GetSNESControllersAsMnemonic();
}
else if (_controlType == "Commodore 64 Controller")
{
return GetC64ControllersAsMnemonic();
}
else if (_controlType == "GBA Controller")
{
return GetGBAControllersAsMnemonic();
}
else if (_controlType == "Dual Gameboy Controller")
{
return GetDualGameBoyControllerAsMnemonic();
}
else if (_controlType == "WonderSwan Controller")
{
return GetWonderSwanControllerAsMnemonic();
}
else if (_controlType == "Nintento 64 Controller")
{
return GetN64ControllersAsMnemonic();
}
else if (_controlType == "Saturn Controller")
{
return GetSaturnControllersAsMnemonic();
}
else if (_controlType == "PSP Controller")
{
return "|.|"; // TODO
}
else if (_controlType == "GPGX Genesis Controller")
{
return GetGeneis6ButtonControllersAsMnemonic();
}
var input = new StringBuilder("|");
if (_controlType == "PC Engine Controller")
{
input.Append(".");
}
else if (_controlType == "Atari 2600 Basic Controller")
{
input.Append(IsBasePressed("Reset") ? "r" : ".");
input.Append(IsBasePressed("Select") ? "s" : ".");
}
else if (_controlType == "NES Controller")
{
if (IsBasePressed("Power"))
{
input.Append(MnemonicConstants.COMMANDS[_controlType]["Power"]);
}
else if (IsBasePressed("Reset"))
{
input.Append(MnemonicConstants.COMMANDS[_controlType]["Reset"]);
}
else if (IsBasePressed("FDS Eject"))
{
input.Append(MnemonicConstants.COMMANDS[_controlType]["FDS Eject"]);
}
else if (IsBasePressed("FDS Insert 0"))
{
input.Append("0");
}
else if (IsBasePressed("FDS Insert 1"))
{
input.Append("1");
}
else if (IsBasePressed("FDS Insert 2"))
{
input.Append("2");
}
else if (IsBasePressed("FDS Insert 3"))
{
input.Append("3");
}
else if (IsBasePressed("VS Coin 1"))
{
input.Append(MnemonicConstants.COMMANDS[_controlType]["VS Coin 1"]);
}
else if (IsBasePressed("VS Coin 2"))
{
input.Append(MnemonicConstants.COMMANDS[_controlType]["VS Coin 2"]);
}
else
{
input.Append('.');
}
}
else if (_controlType == "Genesis 3-Button Controller")
{
if (IsBasePressed("Power"))
{
input.Append(MnemonicConstants.COMMANDS[_controlType]["Power"]);
}
else if (IsBasePressed("Reset"))
{
input.Append(MnemonicConstants.COMMANDS[_controlType]["Reset"]);
}
else
{
input.Append('.');
}
}
else if (_controlType == "Gameboy Controller")
{
input.Append(IsBasePressed("Power") ? MnemonicConstants.COMMANDS[_controlType]["Power"] : ".");
}
if (_controlType != "SMS Controller" && _controlType != "TI83 Controller" && _controlType != "ColecoVision Basic Controller")
{
input.Append("|");
}
for (int player = 1; player <= MnemonicConstants.PLAYERS[_controlType]; player++)
{
var prefix = String.Empty;
if (_controlType != "Gameboy Controller" && _controlType != "TI83 Controller")
{
prefix = "P" + player + " ";
}
foreach (var button in MnemonicConstants.BUTTONS[_controlType].Keys)
{
input.Append(IsBasePressed(prefix + button) ? MnemonicConstants.BUTTONS[_controlType][button] : ".");
}
input.Append("|");
}
if (_controlType == "SMS Controller")
{
foreach (var command in MnemonicConstants.COMMANDS[_controlType].Keys)
{
input.Append(IsBasePressed(command) ? MnemonicConstants.COMMANDS[_controlType][command] : ".");
}
input.Append("|");
}
if (_controlType == "TI83 Controller")
{
input.Append(".|"); // TODO: perhaps ON should go here?
}
return input.ToString();
}
#endregion
}
}

View File

@ -148,9 +148,9 @@ namespace BizHawk.Client.Common
else if (Global.Config.MoviePlaybackPokeMode)
{
LatchInputFromPlayer(Global.MovieInputSourceAdapter);
var mg = new MnemonicsGenerator();
mg.SetSource(Global.MovieOutputHardpoint);
if (!mg.IsEmpty)
var lg = Movie.LogGeneratorInstance();
lg.SetSource(Global.MovieOutputHardpoint);
if (!lg.IsEmpty)
{
LatchInputFromPlayer(Global.MovieInputSourceAdapter);
Movie.PokeFrame(Global.Emulator.Frame, Global.MovieOutputHardpoint);

View File

@ -41,6 +41,11 @@ namespace BizHawk.Client.Common
public bool Changes { get; private set; }
public bool IsCountingRerecords { get; set; }
public ILogEntryGenerator LogGeneratorInstance()
{
return new BkmLogEntryGenerator();
}
public double FrameCount
{
get
@ -89,9 +94,9 @@ namespace BizHawk.Client.Common
public void AppendFrame(IController source)
{
var mg = new MnemonicsGenerator();
var mg = new BkmLogEntryGenerator();
mg.SetSource(source);
_log.Add(mg.GetControllersAsMnemonic());
_log.Add(mg.GenerateLogEntry());
Changes = true;
}
@ -105,11 +110,11 @@ namespace BizHawk.Client.Common
}
}
var mg = new MnemonicsGenerator();
mg.SetSource(source);
var lg = LogGeneratorInstance();
lg.SetSource(source);
_log.SetFrameAt(frame, lg.GenerateLogEntry());
Changes = true;
_log.SetFrameAt(frame, mg.GetControllersAsMnemonic());
}
public void Truncate(int frame)
@ -148,6 +153,16 @@ namespace BizHawk.Client.Common
return string.Empty;
}
public void PokeFrame(int frame, IController source)
{
throw new NotImplementedException();
}
public void ClearFrame(int frame)
{
_log.SetFrameAt(frame, LogGeneratorInstance().EmptyEntry);
}
#endregion
private double GetSeconds(int frameCount)
@ -161,19 +176,5 @@ namespace BizHawk.Client.Common
return frames / Fps;
}
#region Probably won't support
public void PokeFrame(int frame, IController source)
{
throw new NotImplementedException();
}
public void ClearFrame(int frame)
{
throw new NotImplementedException();
}
#endregion
}
}

View File

@ -32,6 +32,11 @@ namespace BizHawk.Client.Common
#region Properties
public ILogEntryGenerator LogGeneratorInstance()
{
return new BkmLogEntryGenerator();
}
public string PreferredExtension { get { return "bkm"; } }
public BkmHeader Header { get; private set; }
public string Filename { get; set; }
@ -128,15 +133,16 @@ namespace BizHawk.Client.Common
public void ClearFrame(int frame)
{
_log.SetFrameAt(frame, new MnemonicsGenerator().EmptyMnemonic);
var lg = LogGeneratorInstance();
_log.SetFrameAt(frame, lg.EmptyEntry);
_changes = true;
}
public void AppendFrame(IController source)
{
var mg = new MnemonicsGenerator();
mg.SetSource(source);
_log.Add(mg.GetControllersAsMnemonic());
var lg = LogGeneratorInstance();
lg.SetSource(source);
_log.Add(lg.GenerateLogEntry());
_changes = true;
}
@ -148,11 +154,11 @@ namespace BizHawk.Client.Common
public void PokeFrame(int frame, IController source)
{
var mg = new MnemonicsGenerator();
mg.SetSource(source);
var lg = LogGeneratorInstance();
lg.SetSource(source);
_changes = true;
_log.SetFrameAt(frame, mg.GetControllersAsMnemonic());
_log.SetFrameAt(frame, lg.GenerateLogEntry());
}
public void RecordFrame(int frame, IController source)
@ -168,11 +174,11 @@ namespace BizHawk.Client.Common
}
}
var mg = new MnemonicsGenerator();
mg.SetSource(source);
var lg = LogGeneratorInstance();
lg.SetSource(source);
_log.SetFrameAt(frame, lg.GenerateLogEntry());
_changes = true;
_log.SetFrameAt(frame, mg.GetControllersAsMnemonic());
}
#endregion

View File

@ -0,0 +1,37 @@
using BizHawk.Emulation.Common;
namespace BizHawk.Client.Common
{
public interface ILogEntryGenerator
{
/// <summary>
/// Sets the controller source used to generate an input log entry
/// </summary>
/// <param name="source"></param>
void SetSource(IController source);
/// <summary>
/// Generates an input log entry for the current state of Source
/// </summary>
/// <returns></returns>
string GenerateLogEntry();
/// <summary>
/// Generates a display friendly verion of the input log entry
/// </summary>
/// <returns></returns>
string GenerateInputDisplay();
/// <summary>
/// Returns whether or not the current controller state is "empty"
/// </summary>
bool IsEmpty { get; }
/// <summary>
/// Returns an input log entry that is considered empty. (booleans will be false, floats will be 0)
/// </summary>
string EmptyEntry { get; }
}
}

View File

@ -91,6 +91,11 @@ namespace BizHawk.Client.Common
/// </summary>
void SaveBackup();
/// <summary>
/// Creates an instance of the Input log entry used to generate the input log
/// </summary>
ILogEntryGenerator LogGeneratorInstance();
#endregion
#region File Handling API

View File

@ -230,12 +230,10 @@ namespace BizHawk.Client.EmuHawk
public string InputStrImmediate()
{
var mg = new MnemonicsGenerator();
mg.SetSource(Global.AutofireStickyXORAdapter);
var lg = Global.MovieSession.Movie.LogGeneratorInstance();
lg.SetSource(Global.AutofireStickyXORAdapter);
var sb = new StringBuilder(mg.GetControllersAsMnemonic());
sb.Replace(".", " ").Replace("|", "").Replace(" 000, 000", " ");
return sb.ToString();
return lg.GenerateInputDisplay();
}
public string InputPrevious()
@ -266,12 +264,9 @@ namespace BizHawk.Client.EmuHawk
SourceOr = m
};
var mg = new MnemonicsGenerator();
var mg = Global.MovieSession.Movie.LogGeneratorInstance();
mg.SetSource(orAdaptor);
var sb = new StringBuilder(mg.GetControllersAsMnemonic());
sb.Replace(".", " ").Replace("|", "").Replace(" 000, 000", " ");
return sb.ToString();
return mg.GenerateInputDisplay();
}
public string InputStrSticky()
@ -282,11 +277,9 @@ namespace BizHawk.Client.EmuHawk
SourceStickyOr = Global.AutofireStickyXORAdapter
};
var mg = new MnemonicsGenerator();
mg.SetSource(stickyOr);
var sb = new StringBuilder(mg.GetControllersAsMnemonic());
sb.Replace(".", " ").Replace("|", "").Replace(" 000, 000", " ");
return sb.ToString();
var lg = Global.MovieSession.Movie.LogGeneratorInstance();
lg.SetSource(stickyOr);
return lg.GenerateInputDisplay();
}
public string MakeIntersectImmediatePrevious()
@ -303,15 +296,11 @@ namespace BizHawk.Client.EmuHawk
SourceAnd = m
};
var mg = new MnemonicsGenerator();
mg.SetSource(andAdaptor);
var sb = new StringBuilder(mg.GetControllersAsMnemonic());
sb.Replace(".", " ").Replace("|", "").Replace(" 000, 000", " ");
return sb.ToString();
var lg = Global.MovieSession.Movie.LogGeneratorInstance();
lg.SetSource(andAdaptor);
return lg.GenerateInputDisplay();
}
// TODO: track previous input even when not movie recording
return string.Empty;
}