BizHawk/BizHawk.Client.Common/movie/bkm/BkmLogEntryGenerator.cs

600 lines
14 KiB
C#

using System;
using System.Text;
using BizHawk.Emulation.Common;
namespace BizHawk.Client.Common
{
public class BkmLogEntryGenerator : ILogEntryGenerator
{
private IController _source;
public void SetSource(IController source)
{
_source = source;
_controlType = source.Type.Name;
}
public string GenerateLogEntry()
{
if (_controlType == "Null Controller")
{
return "|.|";
}
if (_controlType == "Atari 7800 ProLine Joystick Controller")
{
return GetA78ControllersAsMnemonic();
}
if (_controlType == "SNES Controller")
{
return GetSNESControllersAsMnemonic();
}
if (_controlType == "Commodore 64 Controller")
{
return GetC64ControllersAsMnemonic();
}
if (_controlType == "GBA Controller")
{
return GetGBAControllersAsMnemonic();
}
if (_controlType == "Dual Gameboy Controller")
{
return GetDualGameBoyControllerAsMnemonic();
}
if (_controlType == "WonderSwan Controller")
{
return GetWonderSwanControllerAsMnemonic();
}
if (_controlType == "Nintento 64 Controller")
{
return GetN64ControllersAsMnemonic();
}
if (_controlType == "Saturn Controller")
{
return GetSaturnControllersAsMnemonic();
}
if (_controlType == "PSP Controller")
{
return "|.|"; // TODO
}
if (_controlType == "GPGX Genesis Controller")
{
return GetGeneis6ButtonControllersAsMnemonic();
}
if (_controlType == "GPGX 3-Button Controller")
{
return GetGeneis3ButtonControllersAsMnemonic();
}
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(BkmMnemonicConstants.COMMANDS[_controlType]["Power"]);
}
else if (IsBasePressed("Reset"))
{
input.Append(BkmMnemonicConstants.COMMANDS[_controlType]["Reset"]);
}
else if (IsBasePressed("FDS Eject"))
{
input.Append(BkmMnemonicConstants.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(BkmMnemonicConstants.COMMANDS[_controlType]["VS Coin 1"]);
}
else if (IsBasePressed("VS Coin 2"))
{
input.Append(BkmMnemonicConstants.COMMANDS[_controlType]["VS Coin 2"]);
}
else
{
input.Append('.');
}
}
else if (_controlType == "Genesis 3-Button Controller")
{
if (IsBasePressed("Power"))
{
input.Append(BkmMnemonicConstants.COMMANDS[_controlType]["Power"]);
}
else if (IsBasePressed("Reset"))
{
input.Append(BkmMnemonicConstants.COMMANDS[_controlType]["Reset"]);
}
else
{
input.Append('.');
}
}
else if (_controlType == "Gameboy Controller")
{
input.Append(IsBasePressed("Power") ? BkmMnemonicConstants.COMMANDS[_controlType]["Power"] : ".");
}
if (_controlType != "SMS Controller" && _controlType != "TI83 Controller" && _controlType != "ColecoVision Basic Controller")
{
input.Append("|");
}
for (int player = 1; player <= BkmMnemonicConstants.PLAYERS[_controlType]; player++)
{
var prefix = String.Empty;
if (_controlType != "Gameboy Controller" && _controlType != "TI83 Controller")
{
prefix = "P" + player + " ";
}
foreach (var button in BkmMnemonicConstants.BUTTONS[_controlType].Keys)
{
input.Append(IsBasePressed(prefix + button) ? BkmMnemonicConstants.BUTTONS[_controlType][button] : ".");
}
input.Append("|");
}
if (_controlType == "SMS Controller")
{
foreach (var command in BkmMnemonicConstants.COMMANDS[_controlType].Keys)
{
input.Append(IsBasePressed(command) ? BkmMnemonicConstants.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 EmptyEntry == GenerateLogEntry();
}
}
public string EmptyEntry
{
get
{
switch (Global.Emulator.SystemId)
{
default:
case "NULL":
return "|.|";
case "A26":
return "|..|.....|.....|";
case "A78":
return "|....|......|......|";
case "TI83":
return "|..................................................|.|";
case "NES":
return "|.|........|........|........|........|";
case "SNES":
return "|.|............|............|............|............|";
case "SMS":
case "GG":
case "SG":
return "|......|......|..|";
case "GEN":
return "|.|........|........|";
case "GB":
return "|.|........|";
case "DGB":
return "|.|........|.|........|";
case "PCE":
case "PCECD":
case "SGX":
return "|.|........|........|........|........|........|";
case "Coleco":
return "|..................|..................|";
case "C64":
return "|.....|.....|..................................................................|";
case "GBA":
return "|.|..........|";
case "N64":
return "|.|............|............|............|............|";
case "SAT":
return "|.|.............|.............|";
case "WSWAN":
return "|...........|...........|..|";
}
}
}
public IMovieController MovieControllerAdapter
{
get
{
return new BkmControllerAdapter();
}
}
#region Privates
private bool IsBasePressed(string name)
{
return _source.IsPressed(name);
}
private float GetBaseFloat(string name)
{
return _source.GetFloat(name);
}
private string _controlType;
private string GetGBAControllersAsMnemonic()
{
var input = new StringBuilder("|");
if (IsBasePressed("Power"))
{
input.Append(BkmMnemonicConstants.COMMANDS[_controlType]["Power"]);
}
else
{
input.Append(".");
}
input.Append("|");
foreach (var button in BkmMnemonicConstants.BUTTONS[_controlType].Keys)
{
input.Append(IsBasePressed(button) ? BkmMnemonicConstants.BUTTONS[_controlType][button] : ".");
}
input.Append("|");
return input.ToString();
}
private string GetSNESControllersAsMnemonic()
{
var input = new StringBuilder("|");
if (IsBasePressed("Power"))
{
input.Append(BkmMnemonicConstants.COMMANDS[_controlType]["Power"]);
}
else if (IsBasePressed("Reset"))
{
input.Append(BkmMnemonicConstants.COMMANDS[_controlType]["Reset"]);
}
else
{
input.Append('.');
}
input.Append("|");
for (int player = 1; player <= BkmMnemonicConstants.PLAYERS[_controlType]; player++)
{
foreach (var button in BkmMnemonicConstants.BUTTONS[_controlType].Keys)
{
input.Append(IsBasePressed("P" + player + " " + button) ? BkmMnemonicConstants.BUTTONS[_controlType][button] : ".");
}
input.Append("|");
}
return input.ToString();
}
private string GetC64ControllersAsMnemonic()
{
var input = new StringBuilder("|");
for (int player = 1; player <= BkmMnemonicConstants.PLAYERS[_controlType]; player++)
{
foreach (var button in BkmMnemonicConstants.BUTTONS[_controlType].Keys)
{
input.Append(IsBasePressed("P" + player + " " + button) ? BkmMnemonicConstants.BUTTONS[_controlType][button] : ".");
}
input.Append('|');
}
foreach (var button in BkmMnemonicConstants.BUTTONS["Commodore 64 Keyboard"].Keys)
{
input.Append(IsBasePressed(button) ? BkmMnemonicConstants.BUTTONS["Commodore 64 Keyboard"][button] : ".");
}
input.Append('|');
return input.ToString();
}
private string GetDualGameBoyControllerAsMnemonic()
{
// |.|........|.|........|
var input = new StringBuilder();
foreach (var t in BkmMnemonicConstants.DGBMnemonic)
{
if (t.Item1 != null)
{
input.Append(IsBasePressed(t.Item1) ? t.Item2 : '.');
}
else
{
input.Append(t.Item2); // Separator
}
}
return input.ToString();
}
private string GetWonderSwanControllerAsMnemonic()
{
// |....|....|...|
var input = new StringBuilder();
foreach (var t in BkmMnemonicConstants.WSMnemonic)
{
if (t.Item1 != null)
{
input.Append(IsBasePressed(t.Item1) ? t.Item2 : '.');
}
else
{
input.Append(t.Item2); // Separator
}
}
return input.ToString();
}
private string GetA78ControllersAsMnemonic()
{
var input = new StringBuilder("|");
input.Append(IsBasePressed("Power") ? 'P' : '.');
input.Append(IsBasePressed("Reset") ? 'r' : '.');
input.Append(IsBasePressed("Select") ? 's' : '.');
input.Append(IsBasePressed("Pause") ? 'p' : '.');
input.Append('|');
for (int player = 1; player <= BkmMnemonicConstants.PLAYERS[_controlType]; player++)
{
foreach (var button in BkmMnemonicConstants.BUTTONS[_controlType].Keys)
{
input.Append(IsBasePressed("P" + player + " " + button) ? BkmMnemonicConstants.BUTTONS[_controlType][button] : ".");
}
input.Append('|');
}
return input.ToString();
}
private string GetN64ControllersAsMnemonic()
{
var input = new StringBuilder("|");
if (IsBasePressed("Power"))
{
input.Append('P');
}
else if (IsBasePressed("Reset"))
{
input.Append('r');
}
else
{
input.Append('.');
}
input.Append('|');
for (int player = 1; player <= BkmMnemonicConstants.PLAYERS[_controlType]; player++)
{
foreach (var button in BkmMnemonicConstants.BUTTONS[_controlType].Keys)
{
input.Append(IsBasePressed("P" + player + " " + button) ? BkmMnemonicConstants.BUTTONS[_controlType][button] : ".");
}
if (BkmMnemonicConstants.ANALOGS[_controlType].Keys.Count > 0)
{
foreach (var name in BkmMnemonicConstants.ANALOGS[_controlType].Keys)
{
int val;
// Nasty hackery
if (name == "Y Axis")
{
if (IsBasePressed("P" + player + " A Up"))
{
val = 127;
}
else if (IsBasePressed("P" + player + " A Down"))
{
val = -127;
}
else
{
val = (int)GetBaseFloat("P" + player + " " + name);
}
}
else if (name == "X Axis")
{
if (IsBasePressed("P" + player + " A Left"))
{
val = -127;
}
else if (IsBasePressed("P" + player + " A Right"))
{
val = 127;
}
else
{
val = (int)GetBaseFloat("P" + player + " " + name);
}
}
else
{
val = (int)GetBaseFloat("P" + player + " " + name);
}
if (val >= 0)
{
input.Append(' ');
}
input.Append(String.Format("{0:000}", val)).Append(',');
}
input.Remove(input.Length - 1, 1);
}
input.Append('|');
}
return input.ToString();
}
private string GetSaturnControllersAsMnemonic()
{
var input = new StringBuilder("|");
if (IsBasePressed("Power"))
{
input.Append('P');
}
else if (IsBasePressed("Reset"))
{
input.Append('r');
}
else
{
input.Append('.');
}
input.Append('|');
for (int player = 1; player <= BkmMnemonicConstants.PLAYERS[_controlType]; player++)
{
foreach (var button in BkmMnemonicConstants.BUTTONS[_controlType].Keys)
{
input.Append(IsBasePressed("P" + player + " " + button) ? BkmMnemonicConstants.BUTTONS[_controlType][button] : ".");
}
input.Append('|');
}
return input.ToString();
}
private string GetGeneis6ButtonControllersAsMnemonic()
{
var input = new StringBuilder("|");
if (IsBasePressed("Power"))
{
input.Append(BkmMnemonicConstants.COMMANDS[_controlType]["Power"]);
}
else if (IsBasePressed("Reset"))
{
input.Append(BkmMnemonicConstants.COMMANDS[_controlType]["Reset"]);
}
else
{
input.Append('.');
}
input.Append("|");
for (int player = 1; player <= BkmMnemonicConstants.PLAYERS[_controlType]; player++)
{
foreach (var button in BkmMnemonicConstants.BUTTONS[_controlType].Keys)
{
input.Append(IsBasePressed("P" + player + " " + button) ? BkmMnemonicConstants.BUTTONS[_controlType][button] : ".");
}
input.Append("|");
}
input.Append("|");
return input.ToString();
}
private string GetGeneis3ButtonControllersAsMnemonic()
{
var input = new StringBuilder("|");
if (IsBasePressed("Power"))
{
input.Append(BkmMnemonicConstants.COMMANDS[_controlType]["Power"]);
}
else if (IsBasePressed("Reset"))
{
input.Append(BkmMnemonicConstants.COMMANDS[_controlType]["Reset"]);
}
else
{
input.Append('.');
}
input.Append("|");
for (int player = 1; player <= BkmMnemonicConstants.PLAYERS[_controlType]; player++)
{
foreach (var button in BkmMnemonicConstants.BUTTONS[_controlType].Keys)
{
input.Append(IsBasePressed("P" + player + " " + button) ? BkmMnemonicConstants.BUTTONS[_controlType][button] : ".");
}
input.Append("|");
}
input.Append("|");
return input.ToString();
}
#endregion
}
}