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
41
42enum class BindingDevice : uint8_t
43{
46};
47
58
60enum class MouseButton : uint8_t
61{
62 None = 0,
63 Left = SDL_BUTTON_LEFT,
64 Middle = SDL_BUTTON_MIDDLE,
65 Right = SDL_BUTTON_RIGHT,
66 X1 = SDL_BUTTON_X1,
67 X2 = SDL_BUTTON_X2,
68};
69
70enum class MouseWheelDirection : uint8_t
71{
75};
76
83
85struct Binding
86{
88 SDL_Scancode key{SDL_SCANCODE_UNKNOWN};
91 SDL_GamepadButton gamepadButton{SDL_GAMEPAD_BUTTON_INVALID};
93
95 static Binding bindKeyboard(SDL_Scancode key) { return Binding{.kind = BindingKind::Keyboard, .key = key}; };
96
99 {
100 return Binding{.kind = BindingKind::MouseButton, .mouseButton = button};
101 };
102
105 {
106 return Binding{.kind = BindingKind::MouseWheel, .mouseWheel = direction};
107 };
108
110 static Binding bindGamepadButton(SDL_GamepadButton button)
111 {
112 return Binding{.kind = BindingKind::GamepadButton, .gamepadButton = button};
113 };
114
117 {
118 return Binding{.kind = BindingKind::GamepadAxis, .gamepadAxis = axis};
119 };
120
122 static Binding unbound() { return Binding{}; };
123};
124
127{
128public:
129 static constexpr std::size_t kBindingSlots = 2;
130
132 static InputBindings defaults();
133
135 [[nodiscard]] Binding
136 get(Action a, BindingDevice device = BindingDevice::KeyboardMouse, std::size_t slot = 0) const;
137
139 void rebind(Action a, Binding b, BindingDevice device = BindingDevice::KeyboardMouse, std::size_t slot = 0);
140
142 bool pressed(Action a, const bool* keyStates, SDL_MouseButtonFlags mouseState) const;
143
145 bool controllerPressed(Action a, SDL_Gamepad* gamepad) const;
146
148 bool eventMatches(Action a, const SDL_Event& event, bool& down) const;
149
176
178 static std::string_view actionLabel(Action a);
179
181 static std::string_view configKey(Action a);
182
184 static bool actionFromConfigKey(std::string_view key, Action& out);
185
187 static std::string bindingLabel(Binding b);
188
190 static std::string bindingConfigValue(Binding b);
191
193 static bool bindingFromConfigValue(std::string_view value, Binding& out);
194
195private:
196 using BindingRow = std::array<Binding, kBindingSlots>;
197 using BindingTable = std::array<BindingRow, size_t(Action::Count)>;
198
199 [[nodiscard]] BindingTable& tableFor(BindingDevice device);
200 [[nodiscard]] const BindingTable& tableFor(BindingDevice device) const;
201
204};
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:36
@ 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
@ 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:38
@ 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
Quick-throw or open the grenade radial menu.
Definition InputBindings.hpp:34
@ BuyMenu
Toggle the buy menu.
Definition InputBindings.hpp:37
@ KillSelf
Request self-elimination.
Definition InputBindings.hpp:35
@ 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:39
MouseWheelDirection
Definition InputBindings.hpp:71
@ Down
Definition InputBindings.hpp:74
@ Up
Definition InputBindings.hpp:73
@ None
Definition InputBindings.hpp:72
BindingDevice
Definition InputBindings.hpp:43
@ Controller
Definition InputBindings.hpp:45
@ KeyboardMouse
Definition InputBindings.hpp:44
BindingKind
Physical input source type used by a binding.
Definition InputBindings.hpp:50
@ GamepadButton
SDL gamepad button binding.
Definition InputBindings.hpp:55
@ MouseButton
SDL mouse button binding.
Definition InputBindings.hpp:53
@ MouseWheel
SDL mouse wheel direction binding.
Definition InputBindings.hpp:54
@ Keyboard
SDL keyboard scancode binding.
Definition InputBindings.hpp:52
@ GamepadAxis
SDL gamepad trigger-axis binding.
Definition InputBindings.hpp:56
@ Unbound
No physical input is assigned.
Definition InputBindings.hpp:51
GamepadAxisBinding
Definition InputBindings.hpp:78
@ None
Definition InputBindings.hpp:79
@ RightTrigger
Definition InputBindings.hpp:81
@ LeftTrigger
Definition InputBindings.hpp:80
MouseButton
Mouse buttons supported by the rebind UI.
Definition InputBindings.hpp:61
@ X2
Second extra mouse button.
Definition InputBindings.hpp:67
@ None
No mouse button.
Definition InputBindings.hpp:62
@ Middle
Middle mouse button.
Definition InputBindings.hpp:64
@ X1
First extra mouse button.
Definition InputBindings.hpp:66
Stores action-to-input bindings and helper conversions for UI and persistence.
Definition InputBindings.hpp:127
BindingTable controllerBindings
Controller binding table indexed by Action and slot.
Definition InputBindings.hpp:203
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:129
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:151
static std::string_view configKey(Action a)
Stable TOML key for an action.
Definition InputBindings.cpp:397
static std::string bindingLabel(Binding b)
Human-readable binding label shown in settings UI.
Definition InputBindings.cpp:461
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:344
static bool actionFromConfigKey(std::string_view key, Action &out)
Parse a TOML action key.
Definition InputBindings.cpp:450
static std::string bindingConfigValue(Binding b)
Stable TOML value for a binding.
Definition InputBindings.cpp:482
BindingTable keyboardMouseBindings
Keyboard/mouse binding table indexed by Action and slot.
Definition InputBindings.hpp:202
static bool bindingFromConfigValue(std::string_view value, Binding &out)
Parse a TOML binding value.
Definition InputBindings.cpp:487
std::array< BindingRow, size_t(Action::Count)> BindingTable
Definition InputBindings.hpp:197
std::array< Binding, kBindingSlots > BindingRow
Definition InputBindings.hpp:196
One configurable action binding.
Definition InputBindings.hpp:86
static Binding bindMouse(MouseButton button)
Create a mouse-button binding.
Definition InputBindings.hpp:98
BindingKind kind
Which physical input source is active.
Definition InputBindings.hpp:87
static Binding unbound()
Create an unbound action binding.
Definition InputBindings.hpp:122
static Binding bindGamepadAxis(GamepadAxisBinding axis)
Create a gamepad trigger-axis binding.
Definition InputBindings.hpp:116
GamepadAxisBinding gamepadAxis
Gamepad trigger when kind is GamepadAxis.
Definition InputBindings.hpp:92
static Binding bindMouseWheel(MouseWheelDirection direction)
Create a mouse-wheel binding.
Definition InputBindings.hpp:104
MouseButton mouseButton
Mouse button when kind is MouseButton.
Definition InputBindings.hpp:89
static Binding bindKeyboard(SDL_Scancode key)
Create a keyboard binding for an SDL scancode.
Definition InputBindings.hpp:95
SDL_GamepadButton gamepadButton
Gamepad button when kind is GamepadButton.
Definition InputBindings.hpp:91
SDL_Scancode key
Keyboard scancode when kind is Keyboard.
Definition InputBindings.hpp:88
static Binding bindGamepadButton(SDL_GamepadButton button)
Create a gamepad-button binding.
Definition InputBindings.hpp:110
MouseWheelDirection mouseWheel
Wheel direction when kind is MouseWheel.
Definition InputBindings.hpp:90
Definition BuyMenu.hpp:7
Definition Scoreboard.hpp:9