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