Add authoritative fighter surface state (#60)
CI / build-and-test (push) Successful in 1m28s
CI / production-build (push) Successful in 11m59s

## 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>
This commit was merged in pull request #60.
This commit is contained in:
2026-09-25 10:45:27 +00:00
committed by EIREXE
parent 3daf8f2e21
commit d521461625
18 changed files with 411 additions and 301 deletions
+16 -8
View File
@@ -1,9 +1,16 @@
use crate::{
fighter::{
animation::AnimKind, state::{
CollisionContext, EnterContext, FighterState, FighterStateImpl, InterruptContext, UpdateContext, air::{self, AirborneStateCommon}, fall::FallState, land::LandingType,
animation::AnimKind,
state::{
CollisionContext, EnterContext, FighterState, FighterStateImpl, InterruptContext,
UpdateContext,
air::{self, AirborneStateCommon},
fall::FallState,
land::LandingType,
},
}, input, math::vec::FGVec2,
},
input,
math::vec::FGVec2,
};
#[derive(Debug, Clone, Hash)]
@@ -16,7 +23,9 @@ impl FighterStateImpl for AirDodgeState {
fn check_interrupt(&self, state_context: &mut InterruptContext) -> Option<FighterState> {
if state_context.is_current_animation_finished() {
Some(FighterState::Fall(FallState::new(AirborneStateCommon::default())))
Some(FighterState::Fall(FallState::new(
AirborneStateCommon::default(),
)))
} else {
None
}
@@ -29,6 +38,7 @@ impl FighterStateImpl for AirDodgeState {
state_context.velocity,
state_context.translation,
state_context.prev_translation,
state_context.surface,
);
}
@@ -45,10 +55,8 @@ impl FighterStateImpl for AirDodgeState {
state_context.velocity.0 =
self.direction * state_context.fighter_attributes.air_dodge_velocity;
}
fn is_visually_grounded<'a>(
&'a self,
) -> bool {
fn is_visually_grounded<'a>(&'a self) -> bool {
false
}
}