using System.Collections.Generic;
using BizHawk.Client.ApiHawk;
namespace BizHawk.Client.Common
{
///
/// This class holds logic for System information.
/// That means specifiactions about a system that BizHawk emulate
///
public sealed class SystemInfo
{
#region Fields
private const JoypadButton UpDownLeftRight = JoypadButton.Up | JoypadButton.Down | JoypadButton.Left | JoypadButton.Right;
private const JoypadButton StandardButtons = JoypadButton.A | JoypadButton.B | JoypadButton.Start | JoypadButton.Select | UpDownLeftRight;
private static readonly List allSystemInfos;
private string _DisplayName;
private CoreSystem _System;
private JoypadButton _AvailableButtons;
private int _MaxControllers;
#endregion
#region cTor(s)
///
/// Global initialization stuff
///
/// DO NOT CHANGE List order because properties depends on it (and it is hardcoded)
static SystemInfo()
{
allSystemInfos = new List(26);
allSystemInfos.Add(new SystemInfo(string.Empty));
allSystemInfos.Add(new SystemInfo("NES", CoreSystem.NES, 2, StandardButtons));
allSystemInfos.Add(new SystemInfo("Intellivision", CoreSystem.Intellivision, 2));
allSystemInfos.Add(new SystemInfo("Sega Master System", CoreSystem.MasterSystem, 2, UpDownLeftRight | JoypadButton.B1 | JoypadButton.B2));
allSystemInfos.Add(new SystemInfo("SG-1000", CoreSystem.MasterSystem, 1));
allSystemInfos.Add(new SystemInfo("Game Gear", CoreSystem.MasterSystem, 1, UpDownLeftRight | JoypadButton.B1 | JoypadButton.B2));
allSystemInfos.Add(new SystemInfo("TurboGrafx-16", CoreSystem.PCEngine, 1));
allSystemInfos.Add(new SystemInfo("TurboGrafx - 16(CD)", CoreSystem.PCEngine, 1));
allSystemInfos.Add(new SystemInfo("SuperGrafx", CoreSystem.PCEngine, 1));
allSystemInfos.Add(new SystemInfo("Genesis", CoreSystem.Genesis, 2, UpDownLeftRight | JoypadButton.A | JoypadButton.B | JoypadButton.C | JoypadButton.X | JoypadButton.Y | JoypadButton.Z));
allSystemInfos.Add(new SystemInfo("TI - 83", CoreSystem.TI83, 1));
allSystemInfos.Add(new SystemInfo("SNES", CoreSystem.SNES, 8, StandardButtons | JoypadButton.X | JoypadButton.Y | JoypadButton.L | JoypadButton.R));
allSystemInfos.Add(new SystemInfo("GB", CoreSystem.GameBoy, 1, StandardButtons));
allSystemInfos.Add(new SystemInfo("Gameboy Color", CoreSystem.GameBoy, 1, StandardButtons)); //13 (0 based)
allSystemInfos.Add(new SystemInfo("Atari 2600", CoreSystem.Atari2600, 1));
allSystemInfos.Add(new SystemInfo("Atari 7800", CoreSystem.Atari7800, 1));
allSystemInfos.Add(new SystemInfo("Commodore 64", CoreSystem.Commodore64, 1));
allSystemInfos.Add(new SystemInfo("ColecoVision", CoreSystem.ColecoVision, 1));
allSystemInfos.Add(new SystemInfo("Gameboy Advance", CoreSystem.GameBoyAdvance, 1, StandardButtons | JoypadButton.L | JoypadButton.R));
allSystemInfos.Add(new SystemInfo("Nintendo 64", CoreSystem.Nintendo64, 4, StandardButtons ^ JoypadButton.Select | JoypadButton.Z | JoypadButton.CUp | JoypadButton.CDown | JoypadButton.CLeft | JoypadButton.CRight | JoypadButton.AnalogStick | JoypadButton.L | JoypadButton.R));
allSystemInfos.Add(new SystemInfo("Saturn", CoreSystem.Saturn, 2, UpDownLeftRight | JoypadButton.A | JoypadButton.B | JoypadButton.C | JoypadButton.X | JoypadButton.Y | JoypadButton.Z));
allSystemInfos.Add(new SystemInfo("Game Boy Link", CoreSystem.DualGameBoy, 2, StandardButtons));
allSystemInfos.Add(new SystemInfo("WonderSwan", CoreSystem.WonderSwan, 1));
allSystemInfos.Add(new SystemInfo("Lynx", CoreSystem.Lynx, 1));
allSystemInfos.Add(new SystemInfo("PlayStation", CoreSystem.Playstation, 2));
allSystemInfos.Add(new SystemInfo("Apple II", CoreSystem.AppleII, 1));
}
///
/// Initialize a new instance of
///
/// A that specify how the system name is displayed
/// A that specify what core is used
/// Maximum controller allowed by this system
/// Which buttons are available (i.e. are actually on the controller) for this system
private SystemInfo(string displayName, CoreSystem system, int maxControllers, JoypadButton availableButtons)
{
_DisplayName = displayName;
_System = system;
_MaxControllers = maxControllers;
_AvailableButtons = availableButtons;
}
///
/// Initialize a new instance of
///
/// A that specify how the system name is displayed
/// A that specify what core is used
/// Maximum controller allowed by this system
private SystemInfo(string displayName, CoreSystem system, int maxControllers)
: this(displayName, system, maxControllers, 0)
{ }
///
/// Initialize a new instance of
///
/// A that specify how the system name is displayed
private SystemInfo(string displayName)
: this(displayName, CoreSystem.Null, 0, 0)
{ }
#endregion
#region Methods
#region Get SystemInfo
///
/// Gets the instance for Apple II
///
/// Gets the instance for Atari 2600
///
/// Gets the instance for Atari 7800
///
public static SystemInfo Atari7800
{
get
{
return allSystemInfos[15];
}
}
///
/// Gets the instance for Commodore 64
///
public static SystemInfo C64
{
get
{
return allSystemInfos[16];
}
}
///
/// Gets the instance for Coleco Vision
///
public static SystemInfo Coleco
{
get
{
return allSystemInfos[17];
}
}
///
/// Gets the instance for Dual Gameboy
///
public static SystemInfo DualGB
{
get
{
return allSystemInfos[21];
}
}
///
/// Gets the instance for Gameboy
///
public static SystemInfo GB
{
get
{
return allSystemInfos[12];
}
}
///
/// Gets the instance for Gameboy Advance
///
public static SystemInfo GBA
{
get
{
return allSystemInfos[18];
}
}
///
/// Gets the instance for Gameboy Color
///
public static SystemInfo GBC
{
get
{
return allSystemInfos[13];
}
}
///
/// Gets the instance for Genesis
///
public static SystemInfo Genesis
{
get
{
return allSystemInfos[9];
}
}
///
/// Gets the instance for Game Gear
///
public static SystemInfo GG
{
get
{
return allSystemInfos[5];
}
}
///
/// Gets the instance for Intellivision
///
public static SystemInfo Intellivision
{
get
{
return allSystemInfos[2];
}
}
///
/// Gets the instance for Lynx
///
public static SystemInfo Lynx
{
get
{
return allSystemInfos[23];
}
}
///
/// Gets the instance for NES
///
public static SystemInfo Nes
{
get
{
return allSystemInfos[1];
}
}
///
/// Gets the instance for Nintendo 64
///
public static SystemInfo N64
{
get
{
return allSystemInfos[19];
}
}
///
/// Gets the instance for Null (i.e. nothing is emulated) emulator
///
public static SystemInfo Null
{
get
{
return allSystemInfos[0];
}
}
///
/// Gets the instance for PCEngine (TurboGrafx-16)
///
public static SystemInfo PCE
{
get
{
return allSystemInfos[6];
}
}
///
/// Gets the instance for PCEngine (TurboGrafx-16) + CD
///
public static SystemInfo PCECD
{
get
{
return allSystemInfos[7];
}
}
///
/// Gets the instance for PlayStation
///
public static SystemInfo PSX
{
get
{
return allSystemInfos[24];
}
}
///
/// Gets the instance for Sega Saturn
///
public static SystemInfo Saturn
{
get
{
return allSystemInfos[20];
}
}
///
/// Gets the instance for SG-1000 (Sega Game 1000)
///
public static SystemInfo SG
{
get
{
return allSystemInfos[4];
}
}
///
/// Gets the instance for PCEngine (Supergraph FX)
///
public static SystemInfo SGX
{
get
{
return allSystemInfos[8];
}
}
///
/// Gets the instance for Sega Master System
///
public static SystemInfo SMS
{
get
{
return allSystemInfos[3];
}
}
///
/// Gets the instance for SNES
///
public static SystemInfo SNES
{
get
{
return allSystemInfos[11];
}
}
///
/// Gets the instance for TI-83
///
public static SystemInfo TI83
{
get
{
return allSystemInfos[10];
}
}
///
/// Gets the instance for TI-83
///
public static SystemInfo WonderSwan
{
get
{
return allSystemInfos[22];
}
}
#endregion Get SystemInfo
///
/// Get a by its
///
/// you're looking for
/// Mathing
public static SystemInfo FindByCoreSystem(CoreSystem system)
{
return allSystemInfos.Find(s => s._System == system);
}
///
/// Determine if this is equal to specified
///
/// to comapre to
/// True if object is equal to this instance; otherwise, false
public override bool Equals(object obj)
{
if (obj is SystemInfo)
{
return this == (SystemInfo)obj;
}
else
{
return base.Equals(obj);
}
}
///
/// Gets the haschode for current insance
///
/// This instance hashcode
public override int GetHashCode()
{
return base.GetHashCode();
}
///
/// Returns a representation of current
/// In fact, return the same as DisplayName property
///
///
public override string ToString()
{
return _DisplayName;
}
///
/// Determine if two are equals.
/// As it is all static instance, it just compare their reference
///
/// First
/// Second
/// True if both system are equals; otherwise, false
public static bool operator ==(SystemInfo system1, SystemInfo system2)
{
return ReferenceEquals(system1, system2);
}
///
/// Determine if two are different.
/// As it is all static instance, it just compare their reference
///
/// First
/// Second
/// True if both system are diferent; otherwise, false
public static bool operator !=(SystemInfo system1, SystemInfo system2)
{
return !(system1 == system2);
}
#endregion
#region Properties
///
/// Gets available for this system
///
public JoypadButton AvailableButtons
{
get
{
return _AvailableButtons;
}
}
///
/// Gets the sytem name as
///
public string DisplayName
{
get
{
return _DisplayName;
}
}
///
/// Gets the maximum amount of controller allowed for this system
///
public int MaxControllers
{
get
{
return _MaxControllers;
}
}
///
/// Gets core used for this system as enum
///
public CoreSystem System
{
get
{
return _System;
}
}
#endregion
}
}