Add authoritative fighter surface state (#60)
## 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:
+10
-23
@@ -3,24 +3,18 @@ use super::{
|
||||
};
|
||||
use crate::fighter::animation::AnimKind;
|
||||
use crate::fighter::state::FighterState;
|
||||
use crate::fighter::state::ground::GroundedStateCommon;
|
||||
|
||||
#[derive(Debug, Clone, Hash)]
|
||||
pub struct WaitState {
|
||||
pub grounded_common: GroundedStateCommon,
|
||||
}
|
||||
pub struct WaitState;
|
||||
|
||||
impl FighterStateImpl for WaitState {
|
||||
const NAME: &'static str = "Wait";
|
||||
fn check_interrupt(&self, state_context: &mut InterruptContext) -> Option<FighterState> {
|
||||
if let Some(state) =
|
||||
ground::grounded_movement_common_interrupts(state_context, &self.grounded_common)
|
||||
{
|
||||
if let Some(state) = ground::grounded_movement_common_interrupts(state_context) {
|
||||
Some(state)
|
||||
} else if let Some(state) = ground::grounded_movement_standstill_common_interrupts(
|
||||
state_context,
|
||||
&self.grounded_common,
|
||||
) {
|
||||
} else if let Some(state) =
|
||||
ground::grounded_movement_standstill_common_interrupts(state_context)
|
||||
{
|
||||
// Don't transition into yourself
|
||||
if let FighterState::Wait(_) = state {
|
||||
None
|
||||
@@ -44,26 +38,19 @@ impl FighterStateImpl for WaitState {
|
||||
&mut self,
|
||||
state_context: &mut CollisionContext,
|
||||
) -> Option<FighterState> {
|
||||
ground::collision_interrupt(state_context, &mut self.grounded_common, false)
|
||||
ground::collision_interrupt(state_context, false)
|
||||
}
|
||||
|
||||
fn is_visually_grounded<'a>(
|
||||
&'a self,
|
||||
) -> bool {
|
||||
|
||||
fn is_visually_grounded<'a>(&'a self) -> bool {
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
pub fn check_input(
|
||||
state_context: &InterruptContext,
|
||||
ground_state_common: &GroundedStateCommon,
|
||||
) -> Option<FighterState> {
|
||||
pub fn check_input(state_context: &InterruptContext) -> Option<FighterState> {
|
||||
let input_frame = state_context.input.get_last_frame();
|
||||
|
||||
if input_frame.movement.x.abs() < state_context.game_settings.input_common.stick_deadzone {
|
||||
return Some(FighterState::Wait(WaitState {
|
||||
grounded_common: ground_state_common.clone(),
|
||||
}));
|
||||
return Some(FighterState::Wait(WaitState));
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user