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