Rework input buffer to match HDR closer (#79)
CI / build-and-test (push) Successful in 1m24s
CI / production-build (push) Successful in 11m47s

## 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>
This commit was merged in pull request #79.
This commit is contained in:
2026-10-03 09:20:56 +00:00
committed by EIREXE
parent 47f7ae1e69
commit aca3886113
11 changed files with 711 additions and 165 deletions
+14 -1
View File
@@ -15,7 +15,7 @@ pub mod keyboard;
pub mod map;
pub use buffer::{FighterCommands, FighterInput};
pub use frame::FighterInputFrame;
pub use frame::{ActionBindingMask, DigitalAction, DigitalActionBindings, FighterInputFrame};
pub use map::{
BaseInputMap, GamepadBinding, GamepadInputMapElement, InputActionState, InputMapAction,
KeyboardInputMapElement, MenuGamepadInputMapElement, MenuInputMap, MenuInputMapAction,
@@ -78,36 +78,43 @@ impl Plugin for FighterInputPlugin {
KeyboardInputMapElement {
key: KeyCode::KeyD,
action: InputMapAction::MovementXDir(1),
binding_slot: 0,
},
// left
KeyboardInputMapElement {
key: KeyCode::KeyA,
action: InputMapAction::MovementXDir(-1),
binding_slot: 0,
},
// up
KeyboardInputMapElement {
key: KeyCode::KeyW,
action: InputMapAction::MovementYDir(1),
binding_slot: 0,
},
// down
KeyboardInputMapElement {
key: KeyCode::KeyS,
action: InputMapAction::MovementYDir(-1),
binding_slot: 0,
},
// jump
KeyboardInputMapElement {
key: KeyCode::Space,
action: InputMapAction::Jump,
binding_slot: 0,
},
// shield/airdodge
KeyboardInputMapElement {
key: KeyCode::ShiftLeft,
action: InputMapAction::Shield,
binding_slot: 0,
},
// attack
KeyboardInputMapElement {
key: KeyCode::KeyJ,
action: InputMapAction::Attack,
binding_slot: 0,
},
// Menu
],
@@ -116,28 +123,34 @@ impl Plugin for FighterInputPlugin {
GamepadInputMapElement {
binding: GamepadBinding::Axis(GamepadAxis::LeftStickX, 1),
action: InputMapAction::MovementXDir(1),
binding_slot: 0,
},
GamepadInputMapElement {
binding: GamepadBinding::Axis(GamepadAxis::LeftStickY, 1),
action: InputMapAction::MovementYDir(1),
binding_slot: 0,
},
// jump
GamepadInputMapElement {
binding: GamepadBinding::Button(GamepadButton::North),
action: InputMapAction::Jump,
binding_slot: 0,
},
GamepadInputMapElement {
binding: GamepadBinding::Button(GamepadButton::LeftTrigger2),
action: InputMapAction::Shield,
binding_slot: 0,
},
GamepadInputMapElement {
binding: GamepadBinding::Button(GamepadButton::RightTrigger2),
action: InputMapAction::Shield,
binding_slot: 1,
},
// attack
GamepadInputMapElement {
binding: GamepadBinding::Button(GamepadButton::East),
action: InputMapAction::Attack,
binding_slot: 0,
},
],
})