use super::{CollisionContext, EnterContext, FighterStateImpl, InterruptContext, UpdateContext}; use crate::fighter::animation::AnimKind; use crate::fighter::state::air::AirborneStateCommon; use crate::fighter::state::{ExitContext, FighterState, air, jump}; #[derive(Debug, Clone, Copy, Hash, Default)] pub struct PlatformPassState { airborne_state_common: AirborneStateCommon, ignored_polygon: usize, } impl PlatformPassState { pub fn new(airborne_state_common: AirborneStateCommon, ignored_polygon: usize) -> Self { Self { airborne_state_common, ignored_polygon } } } impl FighterStateImpl for PlatformPassState { const NAME: &'static str = "PlatformPass"; fn check_interrupt(&self, state_context: &mut InterruptContext) -> Option { jump::check_input_double_jump(state_context) } fn on_enter(&mut self, state_context: &mut EnterContext) { state_context.surface.ignore_polygon(self.ignored_polygon, state_context.game_settings.fighter_common.platform_pass_platform_ignore_duration_frames); state_context.velocity.y = state_context.game_settings.fighter_common.platform_pass_initial_downwards_velocity; state_context.play_animation(AnimKind::PlatformPass, false); } fn on_exit(&mut self, state_context: &mut ExitContext) { state_context.surface.clear_polygon_ignore(self.ignored_polygon); } fn update(&mut self, state_context: &mut UpdateContext) { air::update_standard_motion(state_context, &mut self.airborne_state_common); } fn check_collision_interrupt( &mut self, state_context: &mut CollisionContext, ) -> Option { air::collision_interrupt( state_context, crate::fighter::state::land::LandingType::Normal, true, ) } fn is_visually_grounded<'a>( &'a self, ) -> bool { false } fn surface_policy(&self) -> super::SurfacePolicy { super::SurfacePolicy::Airborne(crate::fighter::surface::EcbLockPolicy::StartOnDetach) } }