using System; using System.Linq; using Microsoft.Xna.Framework.Input; using StardewValley; namespace StardewModdingAPI { /// <summary>A unified button constant which includes all controller, keyboard, and mouse buttons.</summary> /// <remarks>Derived from <see cref="Keys"/>, <see cref="Buttons"/>, and <see cref="System.Windows.Forms.MouseButtons"/>.</remarks> public enum SButton { /// <summary>No valid key.</summary> None = 0, /********* ** Mouse *********/ /// <summary>The left mouse button.</summary> MouseLeft = 1000, /// <summary>The right mouse button.</summary> MouseRight = 1001, /// <summary>The middle mouse button.</summary> MouseMiddle = 1002, /// <summary>The first mouse XButton.</summary> MouseX1 = 1003, /// <summary>The second mouse XButton.</summary> MouseX2 = 1004, /********* ** Controller *********/ /// <summary>The 'A' button on a controller.</summary> ControllerA = SButtonExtensions.ControllerOffset + Buttons.A, /// <summary>The 'B' button on a controller.</summary> ControllerB = SButtonExtensions.ControllerOffset + Buttons.B, /// <summary>The 'X' button on a controller.</summary> ControllerX = SButtonExtensions.ControllerOffset + Buttons.X, /// <summary>The 'Y' button on a controller.</summary> ControllerY = SButtonExtensions.ControllerOffset + Buttons.Y, /// <summary>The back button on a controller.</summary> ControllerBack = SButtonExtensions.ControllerOffset + Buttons.Back, /// <summary>The start button on a controller.</summary> ControllerStart = SButtonExtensions.ControllerOffset + Buttons.Start, /// <summary>The up button on the directional pad of a controller.</summary> DPadUp = SButtonExtensions.ControllerOffset + Buttons.DPadUp, /// <summary>The down button on the directional pad of a controller.</summary> DPadDown = SButtonExtensions.ControllerOffset + Buttons.DPadDown, /// <summary>The left button on the directional pad of a controller.</summary> DPadLeft = SButtonExtensions.ControllerOffset + Buttons.DPadLeft, /// <summary>The right button on the directional pad of a controller.</summary> DPadRight = SButtonExtensions.ControllerOffset + Buttons.DPadRight, /// <summary>The left bumper (shoulder) button on a controller.</summary> LeftShoulder = SButtonExtensions.ControllerOffset + Buttons.LeftShoulder, /// <summary>The right bumper (shoulder) button on a controller.</summary> RightShoulder = SButtonExtensions.ControllerOffset + Buttons.RightShoulder, /// <summary>The left trigger on a controller.</summary> LeftTrigger = SButtonExtensions.ControllerOffset + Buttons.LeftTrigger, /// <summary>The right trigger on a controller.</summary> RightTrigger = SButtonExtensions.ControllerOffset + Buttons.RightTrigger, /// <summary>The left analog stick on a controller (when pressed).</summary> LeftStick = SButtonExtensions.ControllerOffset + Buttons.LeftStick, /// <summary>The right analog stick on a controller (when pressed).</summary> RightStick = SButtonExtensions.ControllerOffset + Buttons.RightStick, /// <summary>The 'big button' on a controller.</summary> BigButton = SButtonExtensions.ControllerOffset + Buttons.BigButton, /// <summary>The left analog stick on a controller (when pushed left).</summary> LeftThumbstickLeft = SButtonExtensions.ControllerOffset + Buttons.LeftThumbstickLeft, /// <summary>The left analog stick on a controller (when pushed right).</summary> LeftThumbstickRight = SButtonExtensions.ControllerOffset + Buttons.LeftThumbstickRight, /// <summary>The left analog stick on a controller (when pushed down).</summary> LeftThumbstickDown = SButtonExtensions.ControllerOffset + Buttons.LeftThumbstickDown, /// <summary>The left analog stick on a controller (when pushed up).</summary> LeftThumbstickUp = SButtonExtensions.ControllerOffset + Buttons.LeftThumbstickUp, /// <summary>The right analog stick on a controller (when pushed left).</summary> RightThumbstickLeft = SButtonExtensions.ControllerOffset + Buttons.RightThumbstickLeft, /// <summary>The right analog stick on a controller (when pushed right).</summary> RightThumbstickRight = SButtonExtensions.ControllerOffset + Buttons.RightThumbstickRight, /// <summary>The right analog stick on a controller (when pushed down).</summary> RightThumbstickDown = SButtonExtensions.ControllerOffset + Buttons.RightThumbstickDown, /// <summary>The right analog stick on a controller (when pushed up).</summary> RightThumbstickUp = SButtonExtensions.ControllerOffset + Buttons.RightThumbstickUp, /********* ** Keyboard *********/ /// <summary>The A button on a keyboard.</summary> A = Keys.A, /// <summary>The Add button on a keyboard.</summary> Add = Keys.Add, /// <summary>The Applications button on a keyboard.</summary> Apps = Keys.Apps, /// <summary>The Attn button on a keyboard.</summary> Attn = Keys.Attn, /// <summary>The B button on a keyboard.</summary> B = Keys.B, /// <summary>The Backspace button on a keyboard.</summary> Back = Keys.Back, /// <summary>The Browser Back button on a keyboard in Windows 2000/XP.</summary> BrowserBack = Keys.BrowserBack, /// <summary>The Browser Favorites button on a keyboard in Windows 2000/XP.</summary> BrowserFavorites = Keys.BrowserFavorites, /// <summary>The Browser Favorites button on a keyboard in Windows 2000/XP.</summary> BrowserForward = Keys.BrowserForward, /// <summary>The Browser Home button on a keyboard in Windows 2000/XP.</summary> BrowserHome = Keys.BrowserHome, /// <summary>The Browser Refresh button on a keyboard in Windows 2000/XP.</summary> BrowserRefresh = Keys.BrowserRefresh, /// <summary>The Browser Search button on a keyboard in Windows 2000/XP.</summary> BrowserSearch = Keys.BrowserSearch, /// <summary>The Browser Stop button on a keyboard in Windows 2000/XP.</summary> BrowserStop = Keys.BrowserStop, /// <summary>The C button on a keyboard.</summary> C = Keys.C, /// <summary>The Caps Lock button on a keyboard.</summary> CapsLock = Keys.CapsLock, /// <summary>The Green ChatPad button on a keyboard.</summary> ChatPadGreen = Keys.ChatPadGreen, /// <summary>The Orange ChatPad button on a keyboard.</summary> ChatPadOrange = Keys.ChatPadOrange, /// <summary>The CrSel button on a keyboard.</summary> Crsel = Keys.Crsel, /// <summary>The D button on a keyboard.</summary> D = Keys.D, /// <summary>A miscellaneous button on a keyboard; can vary by keyboard.</summary> D0 = Keys.D0, /// <summary>A miscellaneous button on a keyboard; can vary by keyboard.</summary> D1 = Keys.D1, /// <summary>A miscellaneous button on a keyboard; can vary by keyboard.</summary> D2 = Keys.D2, /// <summary>A miscellaneous button on a keyboard; can vary by keyboard.</summary> D3 = Keys.D3, /// <summary>A miscellaneous button on a keyboard; can vary by keyboard.</summary> D4 = Keys.D4, /// <summary>A miscellaneous button on a keyboard; can vary by keyboard.</summary> D5 = Keys.D5, /// <summary>A miscellaneous button on a keyboard; can vary by keyboard.</summary> D6 = Keys.D6, /// <summary>A miscellaneous button on a keyboard; can vary by keyboard.</summary> D7 = Keys.D7, /// <summary>A miscellaneous button on a keyboard; can vary by keyboard.</summary> D8 = Keys.D8, /// <summary>A miscellaneous button on a keyboard; can vary by keyboard.</summary> D9 = Keys.D9, /// <summary>The Decimal button on a keyboard.</summary> Decimal = Keys.Decimal, /// <summary>The Delete button on a keyboard.</summary> Delete = Keys.Delete, /// <summary>The Divide button on a keyboard.</summary> Divide = Keys.Divide, /// <summary>The Down arrow button on a keyboard.</summary> Down = Keys.Down, /// <summary>The E button on a keyboard.</summary> E = Keys.E, /// <summary>The End button on a keyboard.</summary> End = Keys.End, /// <summary>The Enter button on a keyboard.</summary> Enter = Keys.Enter, /// <summary>The Erase EOF button on a keyboard.</summary> EraseEof = Keys.EraseEof, /// <summary>The Escape button on a keyboard.</summary> Escape = Keys.Escape, /// <summary>The Execute button on a keyboard.</summary> Execute = Keys.Execute, /// <summary>The ExSel button on a keyboard.</summary> Exsel = Keys.Exsel, /// <summary>The F button on a keyboard.</summary> F = Keys.F, /// <summary>The F1 button on a keyboard.</summary> F1 = Keys.F1, /// <summary>The F10 button on a keyboard.</summary> F10 = Keys.F10, /// <summary>The F11 button on a keyboard.</summary> F11 = Keys.F11, /// <summary>The F12 button on a keyboard.</summary> F12 = Keys.F12, /// <summary>The F13 button on a keyboard.</summary> F13 = Keys.F13, /// <summary>The F14 button on a keyboard.</summary> F14 = Keys.F14, /// <summary>The F15 button on a keyboard.</summary> F15 = Keys.F15, /// <summary>The F16 button on a keyboard.</summary> F16 = Keys.F16, /// <summary>The F17 button on a keyboard.</summary> F17 = Keys.F17, /// <summary>The F18 button on a keyboard.</summary> F18 = Keys.F18, /// <summary>The F19 button on a keyboard.</summary> F19 = Keys.F19, /// <summary>The F2 button on a keyboard.</summary> F2 = Keys.F2, /// <summary>The F20 button on a keyboard.</summary> F20 = Keys.F20, /// <summary>The F21 button on a keyboard.</summary> F21 = Keys.F21, /// <summary>The F22 button on a keyboard.</summary> F22 = Keys.F22, /// <summary>The F23 button on a keyboard.</summary> F23 = Keys.F23, /// <summary>The F24 button on a keyboard.</summary> F24 = Keys.F24, /// <summary>The F3 button on a keyboard.</summary> F3 = Keys.F3, /// <summary>The F4 button on a keyboard.</summary> F4 = Keys.F4, /// <summary>The F5 button on a keyboard.</summary> F5 = Keys.F5, /// <summary>The F6 button on a keyboard.</summary> F6 = Keys.F6, /// <summary>The F7 button on a keyboard.</summary> F7 = Keys.F7, /// <summary>The F8 button on a keyboard.</summary> F8 = Keys.F8, /// <summary>The F9 button on a keyboard.</summary> F9 = Keys.F9, /// <summary>The G button on a keyboard.</summary> G = Keys.G, /// <summary>The H button on a keyboard.</summary> H = Keys.H, /// <summary>The Help button on a keyboard.</summary> Help = Keys.Help, /// <summary>The Home button on a keyboard.</summary> Home = Keys.Home, /// <summary>The I button on a keyboard.</summary> I = Keys.I, /// <summary>The IME Convert button on a keyboard.</summary> ImeConvert = Keys.ImeConvert, /// <summary>The IME NoConvert button on a keyboard.</summary> ImeNoConvert = Keys.ImeNoConvert, /// <summary>The INS button on a keyboard.</summary> Insert = Keys.Insert, /// <summary>The J button on a keyboard.</summary> J = Keys.J, /// <summary>The K button on a keyboard.</summary> K = Keys.K, /// <summary>The Kana button on a Japanese keyboard.</summary> Kana = Keys.Kana, /// <summary>The Kanji button on a Japanese keyboard.</summary> Kanji = Keys.Kanji, /// <summary>The L button on a keyboard.</summary> L = Keys.L, /// <summary>The Start Applications 1 button on a keyboard in Windows 2000/XP.</summary> LaunchApplication1 = Keys.LaunchApplication1, /// <summary>The Start Applications 2 button on a keyboard in Windows 2000/XP.</summary> LaunchApplication2 = Keys.LaunchApplication2, /// <summary>The Start Mail button on a keyboard in Windows 2000/XP.</summary> LaunchMail = Keys.LaunchMail, /// <summary>The Left arrow button on a keyboard.</summary> Left = Keys.Left, /// <summary>The Left Alt button on a keyboard.</summary> LeftAlt = Keys.LeftAlt, /// <summary>The Left Control button on a keyboard.</summary> LeftControl = Keys.LeftControl, /// <summary>The Left Shift button on a keyboard.</summary> LeftShift = Keys.LeftShift, /// <summary>The Left Windows button on a keyboard.</summary> LeftWindows = Keys.LeftWindows, /// <summary>The M button on a keyboard.</summary> M = Keys.M, /// <summary>The MediaNextTrack button on a keyboard in Windows 2000/XP.</summary> MediaNextTrack = Keys.MediaNextTrack, /// <summary>The MediaPlayPause button on a keyboard in Windows 2000/XP.</summary> MediaPlayPause = Keys.MediaPlayPause, /// <summary>The MediaPreviousTrack button on a keyboard in Windows 2000/XP.</summary> MediaPreviousTrack = Keys.MediaPreviousTrack, /// <summary>The MediaStop button on a keyboard in Windows 2000/XP.</summary> MediaStop = Keys.MediaStop, /// <summary>The Multiply button on a keyboard.</summary> Multiply = Keys.Multiply, /// <summary>The N button on a keyboard.</summary> N = Keys.N, /// <summary>The Num Lock button on a keyboard.</summary> NumLock = Keys.NumLock, /// <summary>The Numeric keypad 0 button on a keyboard.</summary> NumPad0 = Keys.NumPad0, /// <summary>The Numeric keypad 1 button on a keyboard.</summary> NumPad1 = Keys.NumPad1, /// <summary>The Numeric keypad 2 button on a keyboard.</summary> NumPad2 = Keys.NumPad2, /// <summary>The Numeric keypad 3 button on a keyboard.</summary> NumPad3 = Keys.NumPad3, /// <summary>The Numeric keypad 4 button on a keyboard.</summary> NumPad4 = Keys.NumPad4, /// <summary>The Numeric keypad 5 button on a keyboard.</summary> NumPad5 = Keys.NumPad5, /// <summary>The Numeric keypad 6 button on a keyboard.</summary> NumPad6 = Keys.NumPad6, /// <summary>The Numeric keypad 7 button on a keyboard.</summary> NumPad7 = Keys.NumPad7, /// <summary>The Numeric keypad 8 button on a keyboard.</summary> NumPad8 = Keys.NumPad8, /// <summary>The Numeric keypad 9 button on a keyboard.</summary> NumPad9 = Keys.NumPad9, /// <summary>The O button on a keyboard.</summary> O = Keys.O, /// <summary>A miscellaneous button on a keyboard; can vary by keyboard.</summary> Oem8 = Keys.Oem8, /// <summary>The OEM Auto button on a keyboard.</summary> OemAuto = Keys.OemAuto, /// <summary>The OEM Angle Bracket or Backslash button on the RT 102 keyboard in Windows 2000/XP.</summary> OemBackslash = Keys.OemBackslash, /// <summary>The Clear button on a keyboard.</summary> OemClear = Keys.OemClear, /// <summary>The OEM Close Bracket button on a US standard keyboard in Windows 2000/XP.</summary> OemCloseBrackets = Keys.OemCloseBrackets, /// <summary>The ',' button on a keyboard in any country/region in Windows 2000/XP.</summary> OemComma = Keys.OemComma, /// <summary>The OEM Copy button on a keyboard.</summary> OemCopy = Keys.OemCopy, /// <summary>The OEM Enlarge Window button on a keyboard.</summary> OemEnlW = Keys.OemEnlW, /// <summary>The '-' button on a keyboard in any country/region in Windows 2000/XP.</summary> OemMinus = Keys.OemMinus, /// <summary>The OEM Open Bracket button on a US standard keyboard in Windows 2000/XP.</summary> OemOpenBrackets = Keys.OemOpenBrackets, /// <summary>The '.' button on a keyboard in any country/region.</summary> OemPeriod = Keys.OemPeriod, /// <summary>The OEM Pipe button on a US standard keyboard.</summary> OemPipe = Keys.OemPipe, /// <summary>The '+' button on a keyboard in Windows 2000/XP.</summary> OemPlus = Keys.OemPlus, /// <summary>The OEM Question Mark button on a US standard keyboard.</summary> OemQuestion = Keys.OemQuestion, /// <summary>The OEM Single/Double Quote button on a US standard keyboard.</summary> OemQuotes = Keys.OemQuotes, /// <summary>The OEM Semicolon button on a US standard keyboard.</summary> OemSemicolon = Keys.OemSemicolon, /// <summary>The OEM Tilde button on a US standard keyboard.</summary> OemTilde = Keys.OemTilde, /// <summary>The P button on a keyboard.</summary> P = Keys.P, /// <summary>The PA1 button on a keyboard.</summary> Pa1 = Keys.Pa1, /// <summary>The Page Down button on a keyboard.</summary> PageDown = Keys.PageDown, /// <summary>The Page Up button on a keyboard.</summary> PageUp = Keys.PageUp, /// <summary>The Pause button on a keyboard.</summary> Pause = Keys.Pause, /// <summary>The Play button on a keyboard.</summary> Play = Keys.Play, /// <summary>The Print button on a keyboard.</summary> Print = Keys.Print, /// <summary>The Print Screen button on a keyboard.</summary> PrintScreen = Keys.PrintScreen, /// <summary>The IME Process button on a keyboard in Windows 95/98/ME/NT 4.0/2000/XP.</summary> ProcessKey = Keys.ProcessKey, /// <summary>The Q button on a keyboard.</summary> Q = Keys.Q, /// <summary>The R button on a keyboard.</summary> R = Keys.R, /// <summary>The Right Arrow button on a keyboard.</summary> Right = Keys.Right, /// <summary>The Right Alt button on a keyboard.</summary> RightAlt = Keys.RightAlt, /// <summary>The Right Control button on a keyboard.</summary> RightControl = Keys.RightControl, /// <summary>The Right Shift button on a keyboard.</summary> RightShift = Keys.RightShift, /// <summary>The Right Windows button on a keyboard.</summary> RightWindows = Keys.RightWindows, /// <summary>The S button on a keyboard.</summary> S = Keys.S, /// <summary>The Scroll Lock button on a keyboard.</summary> Scroll = Keys.Scroll, /// <summary>The Select button on a keyboard.</summary> Select = Keys.Select, /// <summary>The Select Media button on a keyboard in Windows 2000/XP.</summary> SelectMedia = Keys.SelectMedia, /// <summary>The Separator button on a keyboard.</summary> Separator = Keys.Separator, /// <summary>The Computer Sleep button on a keyboard.</summary> Sleep = Keys.Sleep, /// <summary>The Space bar on a keyboard.</summary> Space = Keys.Space, /// <summary>The Subtract button on a keyboard.</summary> Subtract = Keys.Subtract, /// <summary>The T button on a keyboard.</summary> T = Keys.T, /// <summary>The Tab button on a keyboard.</summary> Tab = Keys.Tab, /// <summary>The U button on a keyboard.</summary> U = Keys.U, /// <summary>The Up Arrow button on a keyboard.</summary> Up = Keys.Up, /// <summary>The V button on a keyboard.</summary> V = Keys.V, /// <summary>The Volume Down button on a keyboard in Windows 2000/XP.</summary> VolumeDown = Keys.VolumeDown, /// <summary>The Volume Mute button on a keyboard in Windows 2000/XP.</summary> VolumeMute = Keys.VolumeMute, /// <summary>The Volume Up button on a keyboard in Windows 2000/XP.</summary> VolumeUp = Keys.VolumeUp, /// <summary>The W button on a keyboard.</summary> W = Keys.W, /// <summary>The X button on a keyboard.</summary> X = Keys.X, /// <summary>The Y button on a keyboard.</summary> Y = Keys.Y, /// <summary>The Z button on a keyboard.</summary> Z = Keys.Z, /// <summary>The Zoom button on a keyboard.</summary> Zoom = Keys.Zoom } /// <summary>Provides extension methods for <see cref="SButton"/>.</summary> public static class SButtonExtensions { /********* ** Accessors *********/ /// <summary>The offset added to <see cref="Buttons"/> values when converting them to <see cref="SButton"/> to avoid collisions with <see cref="Keys"/> values.</summary> internal const int ControllerOffset = 2000; /********* ** Public methods *********/ /// <summary>Get the <see cref="SButton"/> equivalent for the given button.</summary> /// <param name="key">The keyboard button to convert.</param> internal static SButton ToSButton(this Keys key) { return (SButton)key; } /// <summary>Get the <see cref="SButton"/> equivalent for the given button.</summary> /// <param name="key">The controller button to convert.</param> internal static SButton ToSButton(this Buttons key) { return (SButton)(SButtonExtensions.ControllerOffset + key); } /// <summary>Get the <see cref="SButton"/> equivalent for the given button.</summary> /// <param name="input">The Stardew Valley button to convert.</param> internal static SButton ToSButton(this InputButton input) { // derived from InputButton constructors if (input.mouseLeft) return SButton.MouseLeft; if (input.mouseRight) return SButton.MouseRight; return input.key.ToSButton(); } /// <summary>Get the <see cref="Keys"/> equivalent for the given button.</summary> /// <param name="input">The button to convert.</param> /// <param name="key">The keyboard equivalent.</param> /// <returns>Returns whether the value was converted successfully.</returns> public static bool TryGetKeyboard(this SButton input, out Keys key) { if (Enum.IsDefined(typeof(Keys), (int)input)) { key = (Keys)input; return true; } key = Keys.None; return false; } /// <summary>Get the <see cref="Buttons"/> equivalent for the given button.</summary> /// <param name="input">The button to convert.</param> /// <param name="button">The controller equivalent.</param> /// <returns>Returns whether the value was converted successfully.</returns> public static bool TryGetController(this SButton input, out Buttons button) { if (Enum.IsDefined(typeof(Buttons), (int)input - SButtonExtensions.ControllerOffset)) { button = (Buttons)(input - SButtonExtensions.ControllerOffset); return true; } button = 0; return false; } /// <summary>Get the <see cref="InputButton"/> equivalent for the given button.</summary> /// <param name="input">The button to convert.</param> /// <param name="button">The Stardew Valley input button equivalent.</param> /// <returns>Returns whether the value was converted successfully.</returns> public static bool TryGetStardewInput(this SButton input, out InputButton button) { // keyboard if (input.TryGetKeyboard(out Keys key)) { button = new InputButton(key); return true; } // mouse if (input == SButton.MouseLeft || input == SButton.MouseRight) { button = new InputButton(mouseLeft: input == SButton.MouseLeft); return true; } // not valid button = default(InputButton); return false; } /// <summary>Get whether the given button is equivalent to <see cref="Options.useToolButton"/>.</summary> /// <param name="input">The button.</param> public static bool IsUseToolButton(this SButton input) { return input == SButton.ControllerX || Game1.options.useToolButton.Any(p => p.ToSButton() == input); } /// <summary>Get whether the given button is equivalent to <see cref="Options.actionButton"/>.</summary> /// <param name="input">The button.</param> public static bool IsActionButton(this SButton input) { return input == SButton.ControllerA || Game1.options.actionButton.Any(p => p.ToSButton() == input); } } }