Implement being able to drop through soft platforms (#64)
CI / build-and-test (push) Successful in 1m47s
CI / production-build (push) Successful in 10m53s

Reviewed-on: #64
Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
This commit was merged in pull request #64.
This commit is contained in:
2026-09-26 10:38:51 +00:00
committed by EIREXE
parent 66a817cd05
commit 615872f29c
8 changed files with 158 additions and 33 deletions
+17 -1
View File
@@ -42,6 +42,7 @@ pub mod turn;
pub mod wait;
pub mod walk;
pub mod crouch;
pub mod platform_pass;
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
pub enum SurfacePolicy {
@@ -127,7 +128,9 @@ pub struct InterruptContext<'a> {
pub facing_direction: &'a mut FighterFacingDirection,
pub game_settings: &'a GameSettings,
pub fighter_attributes: &'a FighterAttributes,
pub surface: &'a FighterSurfaceState,
pub animation: AnimationStatus,
pub stage_collision: &'a StageCollision,
}
impl InterruptContext<'_> {
@@ -148,8 +151,10 @@ pub struct EnterContext<'a> {
pub stale_move_queue: &'a mut FighterStaleMoveQueue,
pub facing_direction: &'a mut FighterFacingDirection,
pub animation_frame: &'a mut FighterAnimationFrame,
pub surface: &'a mut FighterSurfaceState,
pub fighter_attributes: &'a FighterAttributes,
pub attack_script_assets: &'a FighterAttackScriptAssets,
pub game_settings: &'a GameSettings,
}
impl EnterContext<'_> {
@@ -160,6 +165,7 @@ impl EnterContext<'_> {
pub struct ExitContext<'a> {
pub hitboxes: &'a mut FighterHitboxes,
pub surface: &'a mut FighterSurfaceState,
}
pub struct UpdateContext<'a> {
@@ -214,6 +220,7 @@ impl CollisionContext<'_> {
fighter_states! {
Wait => wait::WaitState,
Walk => walk::WalkState,
PlatformPass => platform_pass::PlatformPassState,
Crouch => crouch::CrouchState,
Dash => dash::DashState,
Run => run::RunState,
@@ -268,6 +275,7 @@ impl<'w, 's> FighterFrameQueryItem<'w, 's> {
animations: &'a FighterAnimations,
baked_animations: &'a Assets<BakedFighterAnimations>,
attributes: &'a FighterAttributes,
stage_collision: &'a StageCollision,
) -> InterruptContext<'a> {
let animation = self.animation_status(animations, baked_animations);
InterruptContext {
@@ -276,6 +284,8 @@ impl<'w, 's> FighterFrameQueryItem<'w, 's> {
game_settings,
fighter_attributes: attributes,
animation,
surface: &self.surface,
stage_collision,
}
}
@@ -283,6 +293,7 @@ impl<'w, 's> FighterFrameQueryItem<'w, 's> {
&'a mut self,
attributes: &'a FighterAttributes,
attack_script_assets: &'a FighterAttackScriptAssets,
game_settings: &'a GameSettings,
) -> EnterContext<'a> {
EnterContext {
input: &mut self.input,
@@ -292,14 +303,17 @@ impl<'w, 's> FighterFrameQueryItem<'w, 's> {
stale_move_queue: &mut self.stale_move_queue,
facing_direction: &mut self.facing_direction,
animation_frame: &mut self.animation_frame,
surface: &mut self.surface,
fighter_attributes: attributes,
attack_script_assets,
game_settings
}
}
fn exit_context(&mut self) -> ExitContext<'_> {
ExitContext {
hitboxes: &mut self.hitboxes,
surface: &mut self.surface,
}
}
@@ -407,7 +421,7 @@ fn transition_state(
game_settings.fighter_common.leave_ground_ecb_frame_lock_duration,
);
}
next.on_enter(&mut frame.enter_context(attributes, attack_script_assets));
next.on_enter(&mut frame.enter_context(attributes, attack_script_assets, game_settings));
*current = next;
info!("{} -> {}", old_name, new_name);
}
@@ -417,6 +431,7 @@ pub fn state_interrupt_system(
game_settings: Res<GameSettings>,
baked_animations: Res<Assets<BakedFighterAnimations>>,
fighter_manifests: Res<Assets<FighterManifest>>,
stage_collision: Res<StageCollision>,
) {
for fighter in &mut query {
let StatefulFighterQueryItem {
@@ -490,6 +505,7 @@ pub fn state_interrupt_system(
animations,
&baked_animations,
&manifest.attributes,
&stage_collision
))
};