using System; namespace VirtualNes.Core { public struct ControllerState { public uint raw0; public uint raw1; public uint raw2; public uint raw3; public bool valid; public ControllerState( EnumButtonType player0_buttons, EnumButtonType player1_buttons, EnumButtonType player2_buttons, EnumButtonType player3_buttons) { raw0 = (uint)player0_buttons; raw1 = (uint)player1_buttons; raw2 = (uint)player2_buttons; raw3 = (uint)player3_buttons; valid = true; } public static bool operator ==(ControllerState left, ControllerState right) { return left.raw0 == right.raw0 && left.raw1 == right.raw1 && left.raw2 == right.raw2 && left.raw3 == right.raw3; } public static bool operator !=(ControllerState left, ControllerState right) { return !(left == right); } public override string ToString() { return $"{raw0}|{raw1}|{raw2}|{raw3}"; } public bool HasButton(int player, EnumButtonType button) { uint raw = 0; switch (player) { case 0: raw = raw0; break; case 1: raw = raw1; break; case 2: raw = raw2; break; case 3: raw = raw3; break; } return (raw & (uint)button) == (uint)button; } } [Flags] public enum EnumButtonType { NONE = 0, UP = 1, DOWN = 2, LEFT = 4, RIGHT = 8, A = 16, B = 32, SELECT = 64, START = 128, MIC = 256 } }