Files
dusk/.claude/input.md
T
2026-06-18 14:59:21 -05:00

3.2 KiB

Input System

Source: src/dusk/input/

The input system decouples physical hardware buttons from logical game actions via a binding layer. Actions are defined in src/dusk/input/input.csv and code-generated into inputaction_t enum values — see architecture.md.


Concepts

Button (inputbutton_t) — a physical input source: a keyboard scancode, gamepad button, gamepad axis, or pointer axis. The available button types depend on which DUSK_INPUT_* defines are active for the target platform.

Action (inputaction_t) — a logical game input (e.g. INPUT_ACTION_UP, INPUT_ACTION_CONFIRM, INPUT_ACTION_RAGEQUIT). Each action accumulates a float value [0.0, 1.0] from all buttons bound to it.

Binding — a many-to-one mapping from buttons to actions. Bindings are registered at runtime with inputBind(button, action).


Querying actions

// Boolean helpers (current frame):
inputIsDown(action)        // value > 0 this frame
inputPressed(action)       // down this frame but not last
inputReleased(action)      // down last frame but not this

// Last frame state:
inputWasDown(action)

// Raw float value:
inputGetCurrentValue(action)   // [0.0, 1.0]
inputGetLastValue(action)

// Axis helpers — combine two opposing actions into a signed float:
float_t h = inputAxis(INPUT_ACTION_LEFT, INPUT_ACTION_RIGHT);  // -1.0 to 1.0
inputAxis2D(negX, posX, negY, posY, result);   // fills vec2
inputAngle2D(negX, posX, negY, posY, result);  // atan2-based normalized direction

// Deadzone:
float_t clean = inputDeadzone(rawValue, 0.1f);

Dynamic values (DUSK_TIME_DYNAMIC)

On platforms with variable frame rates, each action also tracks dynamicDelta-scaled values:

inputGetCurrentValueDynamic(action)
inputGetLastValueDynamic(action)

These account for the actual time elapsed since the last frame, so movement calculated from them is frame-rate independent.


Events on actions

Each inputactiondata_t exposes onPressed and onReleased events:

eventSubscribe(&INPUT.actions[INPUT_ACTION_CONFIRM].onPressed, myCallback, myUser);

The callback signature is void cb(void *params, void *user). params is always NULL for input events.


Buttons and bindings

Physical buttons are typed via inputbuttontype_t:

Constant When available Payload
INPUT_BUTTON_TYPE_KEYBOARD DUSK_INPUT_KEYBOARD inputscancode_t
INPUT_BUTTON_TYPE_GAMEPAD DUSK_INPUT_GAMEPAD inputgamepadbutton_t
INPUT_BUTTON_TYPE_GAMEPAD_AXIS DUSK_INPUT_GAMEPAD axis + positive direction flag
INPUT_BUTTON_TYPE_POINTER DUSK_INPUT_POINTER inputpointeraxis_t

Button names and default bindings are defined in input.csv. Look up a button by name:

inputbutton_t btn = inputButtonGetByName("keyboard_w");
inputBind(btn, INPUT_ACTION_UP);

INPUT_BUTTON_DATA[] holds runtime state (current/last raw values) for every physical button.


Platform platform-specific reads

inputButtonGetValuePlatform(button) is the one required platform function — it returns the current raw [0.0, 1.0] value for a button. The platform implementations live in src/dusk{platform}/input/.