## Summary
- Preserve distinct same-action bindings in rollback input frames.
- Add independent command lifetimes with tap and state-scoped hold buffering.
- Detect second shield bindings and consume shield commands for air dodge.
- Fix duplicate keyboard mappings being overwritten.
Reviewed-on: #79
Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
## Summary
- add a rollback-tracked `FighterSurfaceState` as the single source of truth for stage contact
- move active stage line ownership out of individual grounded fighter states
- update landing, airborne motion, ledge departure, hit reactions, and debug save states to maintain surface contact
- add tests for contact lifecycle, connected-segment traversal, and ledge departure
Reviewed-on: #60
Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
Fixes#22
Extracts shared grounded collision/friction and airborne movement/landing policies while preserving state-specific behavior. Running fighters now pass `can_walk_off = true` so they can run off platform edges. Includes grounded and airborne hitstun call sites.
Reviewed-on: #36
Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>