Input API (decouple input from actions, runtime key remapping, multi-device)

Current State

Input is read ad-hoc from SDL directly where needed. There is no abstraction separating raw devices from game actions, no remapping, and no multi-device support.

Goal

A reusable Input API that decouples physical input from semantic actions, supports runtime remapping, and serializes bindings to settings (#13 (closed)).

Tasks

  • Raw device layer: keyboard, mouse (move/buttons/wheel), gamepad (axes/buttons/triggers), touch (later)
  • Action maps: named actions bound to one or more inputs; button/axis/vector action types
  • Polling API (isPressed, wasPressed, axis, vector) and event subscription
  • Runtime rebinding (listen-for-next-input) and conflict handling
  • Multiple devices / local players (device assignment)
  • Serialize/deserialize bindings via the settings/DataAsset system
  • Editor UI to view/edit action maps (can reuse #14 shortcut conflict UI)
  • Expose to user scripts; wire into examples/basic-project (Player movement)

Acceptance Criteria

  • Game code reacts to actions, never raw key codes.
  • Bindings can be remapped at runtime and persist across restarts.
  • Keyboard + gamepad both drive the same actions.
Edited by Bruno Massa