63 lines
2.1 KiB
Rust
63 lines
2.1 KiB
Rust
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<FighterState> {
|
|
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<FighterState> {
|
|
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)
|
|
}
|
|
}
|