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
+9 -4
View File
@@ -18,7 +18,10 @@ use crate::fighter::state::hitstun::HitstunState;
use crate::fighter::surface::EcbLockPolicy;
use crate::fighter::visual::FighterAnimations;
use crate::fighter::{
Fighter, FighterDamage, FighterECB, FighterFacingDirection, FighterHitboxes, FighterHitstop, FighterHitstopShake, FighterHitstopShakeKind, FighterHitstopShakeRole, FighterInvulnerabilityState, FighterPendingRespawn, FighterPresentationSnap, FighterPreviousTranslation, FighterSurfaceState, FighterTranslation, FighterVelocity,
Fighter, FighterDamage, FighterECB, FighterFacingDirection, FighterHitboxes, FighterHitstop,
FighterHitstopShake, FighterHitstopShakeKind, FighterHitstopShakeRole,
FighterInvulnerabilityState, FighterPendingRespawn, FighterPresentationSnap,
FighterPreviousTranslation, FighterSurfaceState, FighterTranslation, FighterVelocity,
};
use crate::game_settings::GameSettings;
use crate::input::FighterInput;
@@ -32,6 +35,7 @@ use crate::stage::line::StageCollision;
use crate::stage::manifest::{StageManifest, StageManifestRegistry};
pub mod air;
pub mod air_attack;
pub mod air_dodge;
pub mod angel;
pub mod crouch;
@@ -47,7 +51,6 @@ pub mod run;
pub mod turn;
pub mod wait;
pub mod walk;
pub mod air_attack;
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
pub enum SurfacePolicy {
@@ -170,6 +173,7 @@ impl EnterContext<'_> {
}
pub struct ExitContext<'a> {
pub input: &'a mut FighterInput,
pub hitboxes: &'a mut FighterHitboxes,
pub surface: &'a mut FighterSurfaceState,
pub vulnerability: &'a mut FighterInvulnerabilityState,
@@ -306,7 +310,7 @@ impl<'w, 's> FighterFrameQueryItem<'w, 's> {
animation,
surface: &self.surface,
stage_collision,
attack_script_assets: attack_script_assets
attack_script_assets: attack_script_assets,
}
}
@@ -333,6 +337,7 @@ impl<'w, 's> FighterFrameQueryItem<'w, 's> {
fn exit_context(&mut self) -> ExitContext<'_> {
ExitContext {
input: &mut self.input,
hitboxes: &mut self.hitboxes,
surface: &mut self.surface,
vulnerability: &mut self.vulnerability,
@@ -540,7 +545,7 @@ pub fn state_interrupt_system(
&baked_animations,
&manifest.attributes,
&stage_collision,
attack_script_assets
attack_script_assets,
))
};