group2 0.1.0
CSE 125 Group 2
Loading...
Searching...
No Matches
InputBindings.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "SDL3/SDL_events.h"
4#include "SDL3/SDL_gamepad.h"
5#include "SDL3/SDL_mouse.h"
6#include "SDL3/SDL_scancode.h"
7
8#include <array>
9#include <cstddef>
10#include <cstdint>
11#include <string>
12#include <string_view>
13
42
43enum class BindingDevice : uint8_t
44{
47};
48
59
61enum class MouseButton : uint8_t
62{
63 None = 0,
64 Left = SDL_BUTTON_LEFT,
65 Middle = SDL_BUTTON_MIDDLE,
66 Right = SDL_BUTTON_RIGHT,
67 X1 = SDL_BUTTON_X1,
68 X2 = SDL_BUTTON_X2,
69};
70
71enum class MouseWheelDirection : uint8_t
72{
76};
77
84
86struct Binding
87{
89 SDL_Scancode key{SDL_SCANCODE_UNKNOWN};
92 SDL_GamepadButton gamepadButton{SDL_GAMEPAD_BUTTON_INVALID};
94
96 static Binding bindKeyboard(SDL_Scancode key) { return Binding{.kind = BindingKind::Keyboard, .key = key}; };
97
100 {
101 return Binding{.kind = BindingKind::MouseButton, .mouseButton = button};
102 };
103
106 {
107 return Binding{.kind = BindingKind::MouseWheel, .mouseWheel = direction};
108 };
109
111 static Binding bindGamepadButton(SDL_GamepadButton button)
112 {
113 return Binding{.kind = BindingKind::GamepadButton, .gamepadButton = button};
114 };
115
118 {
119 return Binding{.kind = BindingKind::GamepadAxis, .gamepadAxis = axis};
120 };
121
123 static Binding unbound() { return Binding{}; };
124};
125
128{
129public:
130 static constexpr std::size_t kBindingSlots = 2;
131
133 static InputBindings defaults();
134
136 [[nodiscard]] Binding
137 get(Action a, BindingDevice device = BindingDevice::KeyboardMouse, std::size_t slot = 0) const;
138
140 void rebind(Action a, Binding b, BindingDevice device = BindingDevice::KeyboardMouse, std::size_t slot = 0);
141
143 bool pressed(Action a, const bool* keyStates, SDL_MouseButtonFlags mouseState) const;
144
146 bool controllerPressed(Action a, SDL_Gamepad* gamepad) const;
147
149 bool eventMatches(Action a, const SDL_Event& event, bool& down) const;
150
178
180 static std::string_view actionLabel(Action a);
181
183 static std::string_view configKey(Action a);
184
186 static bool actionFromConfigKey(std::string_view key, Action& out);
187
189 static std::string bindingLabel(Binding b);
190
192 static std::string bindingConfigValue(Binding b);
193
195 static bool bindingFromConfigValue(std::string_view value, Binding& out);
196
197private:
198 using BindingRow = std::array<Binding, kBindingSlots>;
199 using BindingTable = std::array<BindingRow, size_t(Action::Count)>;
200
201 [[nodiscard]] BindingTable& tableFor(BindingDevice device);
202 [[nodiscard]] const BindingTable& tableFor(BindingDevice device) const;
203
206};
Action
Player-configurable gameplay and HUD actions sampled by the client.
Definition InputBindings.hpp:16
@ Back
Move backward.
Definition InputBindings.hpp:18
@ Jump
Jump and skip respawn while dead.
Definition InputBindings.hpp:21
@ Scoreboard
Show the scoreboard while held.
Definition InputBindings.hpp:37
@ SwitchToSecondary
Switch to the secondary weapon slot.
Definition InputBindings.hpp:31
@ AbilityMenu
Open the ability selection radial menu.
Definition InputBindings.hpp:23
@ Crouch
Crouch and slide.
Definition InputBindings.hpp:22
@ Emote
Hold to open the emote wheel; release to play the selected emote.
Definition InputBindings.hpp:38
@ Reload
Reload the equipped weapon.
Definition InputBindings.hpp:28
@ Scope
Aim/scope the equipped weapon.
Definition InputBindings.hpp:27
@ Forward
Move forward.
Definition InputBindings.hpp:17
@ Ability1
Activate the first ability slot.
Definition InputBindings.hpp:24
@ Ability2
Activate the second ability slot.
Definition InputBindings.hpp:25
@ PushToTalk
Hold to transmit voice chat.
Definition InputBindings.hpp:39
@ PreviousWeapon
Cycle to the previous weapon slot.
Definition InputBindings.hpp:32
@ Right
Strafe right.
Definition InputBindings.hpp:20
@ Left
Strafe left.
Definition InputBindings.hpp:19
@ Pickup
Pick up an interactable weapon or item.
Definition InputBindings.hpp:29
@ NextWeapon
Cycle to the next weapon slot.
Definition InputBindings.hpp:33
@ CycleGrenade
Cycle to the next grenade type that has ammo.
Definition InputBindings.hpp:34
@ ThrowGrenade
Throw the currently selected grenade.
Definition InputBindings.hpp:35
@ KillSelf
Request self-elimination.
Definition InputBindings.hpp:36
@ SwitchToPrimary
Switch to the primary weapon slot.
Definition InputBindings.hpp:30
@ Shoot
Fire the equipped weapon.
Definition InputBindings.hpp:26
@ Count
Keep this last, used for iteration and array sizing.
Definition InputBindings.hpp:40
MouseWheelDirection
Definition InputBindings.hpp:72
@ Down
Definition InputBindings.hpp:75
@ Up
Definition InputBindings.hpp:74
@ None
Definition InputBindings.hpp:73
BindingDevice
Definition InputBindings.hpp:44
@ Controller
Definition InputBindings.hpp:46
@ KeyboardMouse
Definition InputBindings.hpp:45
BindingKind
Physical input source type used by a binding.
Definition InputBindings.hpp:51
@ GamepadButton
SDL gamepad button binding.
Definition InputBindings.hpp:56
@ MouseButton
SDL mouse button binding.
Definition InputBindings.hpp:54
@ MouseWheel
SDL mouse wheel direction binding.
Definition InputBindings.hpp:55
@ Keyboard
SDL keyboard scancode binding.
Definition InputBindings.hpp:53
@ GamepadAxis
SDL gamepad trigger-axis binding.
Definition InputBindings.hpp:57
@ Unbound
No physical input is assigned.
Definition InputBindings.hpp:52
GamepadAxisBinding
Definition InputBindings.hpp:79
@ None
Definition InputBindings.hpp:80
@ RightTrigger
Definition InputBindings.hpp:82
@ LeftTrigger
Definition InputBindings.hpp:81
MouseButton
Mouse buttons supported by the rebind UI.
Definition InputBindings.hpp:62
@ X2
Second extra mouse button.
Definition InputBindings.hpp:68
@ None
No mouse button.
Definition InputBindings.hpp:63
@ Middle
Middle mouse button.
Definition InputBindings.hpp:65
@ X1
First extra mouse button.
Definition InputBindings.hpp:67
Stores action-to-input bindings and helper conversions for UI and persistence.
Definition InputBindings.hpp:128
BindingTable controllerBindings
Controller binding table indexed by Action and slot.
Definition InputBindings.hpp:205
Binding get(Action a, BindingDevice device=BindingDevice::KeyboardMouse, std::size_t slot=0) const
Return the binding assigned to an action/device/slot.
Definition InputBindings.cpp:234
static constexpr std::size_t kBindingSlots
Definition InputBindings.hpp:130
BindingTable & tableFor(BindingDevice device)
Definition InputBindings.cpp:224
static InputBindings defaults()
Return bindings matching the game's historical default controls.
Definition InputBindings.cpp:294
bool pressed(Action a, const bool *keyStates, SDL_MouseButtonFlags mouseState) const
Test whether an action is currently pressed using SDL keyboard and mouse state.
Definition InputBindings.cpp:261
bool eventMatches(Action a, const SDL_Event &event, bool &down) const
Match a key/button/wheel/axis SDL event against any binding for an action.
Definition InputBindings.cpp:281
void rebind(Action a, Binding b, BindingDevice device=BindingDevice::KeyboardMouse, std::size_t slot=0)
Assign a binding to an action/device/slot, clearing any duplicate action use on that device.
Definition InputBindings.cpp:241
static constexpr std::array< Action, size_t(Action::Count)> actions()
Return every configurable action in stable UI/config order.
Definition InputBindings.hpp:152
static std::string_view configKey(Action a)
Stable TOML key for an action.
Definition InputBindings.cpp:409
static std::string bindingLabel(Binding b)
Human-readable binding label shown in settings UI.
Definition InputBindings.cpp:475
bool controllerPressed(Action a, SDL_Gamepad *gamepad) const
Test whether an action is currently pressed on a controller.
Definition InputBindings.cpp:272
static std::string_view actionLabel(Action a)
Human-readable action label shown in settings UI.
Definition InputBindings.cpp:354
static bool actionFromConfigKey(std::string_view key, Action &out)
Parse a TOML action key.
Definition InputBindings.cpp:464
static std::string bindingConfigValue(Binding b)
Stable TOML value for a binding.
Definition InputBindings.cpp:496
BindingTable keyboardMouseBindings
Keyboard/mouse binding table indexed by Action and slot.
Definition InputBindings.hpp:204
static bool bindingFromConfigValue(std::string_view value, Binding &out)
Parse a TOML binding value.
Definition InputBindings.cpp:501
std::array< BindingRow, size_t(Action::Count)> BindingTable
Definition InputBindings.hpp:199
std::array< Binding, kBindingSlots > BindingRow
Definition InputBindings.hpp:198
One configurable action binding.
Definition InputBindings.hpp:87
static Binding bindMouse(MouseButton button)
Create a mouse-button binding.
Definition InputBindings.hpp:99
BindingKind kind
Which physical input source is active.
Definition InputBindings.hpp:88
static Binding unbound()
Create an unbound action binding.
Definition InputBindings.hpp:123
static Binding bindGamepadAxis(GamepadAxisBinding axis)
Create a gamepad trigger-axis binding.
Definition InputBindings.hpp:117
GamepadAxisBinding gamepadAxis
Gamepad trigger when kind is GamepadAxis.
Definition InputBindings.hpp:93
static Binding bindMouseWheel(MouseWheelDirection direction)
Create a mouse-wheel binding.
Definition InputBindings.hpp:105
MouseButton mouseButton
Mouse button when kind is MouseButton.
Definition InputBindings.hpp:90
static Binding bindKeyboard(SDL_Scancode key)
Create a keyboard binding for an SDL scancode.
Definition InputBindings.hpp:96
SDL_GamepadButton gamepadButton
Gamepad button when kind is GamepadButton.
Definition InputBindings.hpp:92
SDL_Scancode key
Keyboard scancode when kind is Keyboard.
Definition InputBindings.hpp:89
static Binding bindGamepadButton(SDL_GamepadButton button)
Create a gamepad-button binding.
Definition InputBindings.hpp:111
MouseWheelDirection mouseWheel
Wheel direction when kind is MouseWheel.
Definition InputBindings.hpp:91
Definition Scoreboard.hpp:9