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; }