diff --git a/BizHawk.Client.Common/BizHawk.Client.Common.csproj b/BizHawk.Client.Common/BizHawk.Client.Common.csproj
index e25466928f..dad488fba1 100644
--- a/BizHawk.Client.Common/BizHawk.Client.Common.csproj
+++ b/BizHawk.Client.Common/BizHawk.Client.Common.csproj
@@ -148,6 +148,7 @@
+
diff --git a/BizHawk.Client.Common/Global.cs b/BizHawk.Client.Common/Global.cs
index 0160fcc622..bad4ac0c53 100644
--- a/BizHawk.Client.Common/Global.cs
+++ b/BizHawk.Client.Common/Global.cs
@@ -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();
diff --git a/BizHawk.Client.Common/movie/MnemonicsGenerator.cs b/BizHawk.Client.Common/movie/MnemonicsGenerator.cs
index 489aa02c9f..3fdb952db3 100644
--- a/BizHawk.Client.Common/movie/MnemonicsGenerator.cs
+++ b/BizHawk.Client.Common/movie/MnemonicsGenerator.cs
@@ -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
}
}
diff --git a/BizHawk.Client.Common/movie/MovieSession.cs b/BizHawk.Client.Common/movie/MovieSession.cs
index 4189c41efb..b34c8dbd48 100644
--- a/BizHawk.Client.Common/movie/MovieSession.cs
+++ b/BizHawk.Client.Common/movie/MovieSession.cs
@@ -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);
diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs
index a1eccc2ba2..dc06b666a2 100644
--- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs
+++ b/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs
@@ -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
}
}
diff --git a/BizHawk.Client.Common/movie/bkm/BkmMovie.cs b/BizHawk.Client.Common/movie/bkm/BkmMovie.cs
index 43c09aed5e..b55e88da92 100644
--- a/BizHawk.Client.Common/movie/bkm/BkmMovie.cs
+++ b/BizHawk.Client.Common/movie/bkm/BkmMovie.cs
@@ -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
diff --git a/BizHawk.Client.Common/movie/interfaces/ILogEntryGenerator.cs b/BizHawk.Client.Common/movie/interfaces/ILogEntryGenerator.cs
new file mode 100644
index 0000000000..c397fdb980
--- /dev/null
+++ b/BizHawk.Client.Common/movie/interfaces/ILogEntryGenerator.cs
@@ -0,0 +1,37 @@
+using BizHawk.Emulation.Common;
+
+namespace BizHawk.Client.Common
+{
+ 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
+ ///
+ ///
+ string GenerateLogEntry();
+
+ ///
+ /// Generates a display friendly verion of the input log entry
+ ///
+ ///
+ string GenerateInputDisplay();
+
+ ///
+ /// Returns whether or not the current controller state is "empty"
+ ///
+ bool IsEmpty { get; }
+
+ ///
+ /// Returns an input log entry that is considered empty. (booleans will be false, floats will be 0)
+ ///
+ string EmptyEntry { get; }
+
+
+ }
+}
diff --git a/BizHawk.Client.Common/movie/interfaces/IMovie.cs b/BizHawk.Client.Common/movie/interfaces/IMovie.cs
index 4ef3ce31b8..a8890b0f42 100644
--- a/BizHawk.Client.Common/movie/interfaces/IMovie.cs
+++ b/BizHawk.Client.Common/movie/interfaces/IMovie.cs
@@ -91,6 +91,11 @@ namespace BizHawk.Client.Common
///
void SaveBackup();
+ ///
+ /// Creates an instance of the Input log entry used to generate the input log
+ ///
+ ILogEntryGenerator LogGeneratorInstance();
+
#endregion
#region File Handling API
diff --git a/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs b/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs
index ebb629f921..fde0b9b494 100644
--- a/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs
+++ b/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs
@@ -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;
}