Deduplicate fighter state lifecycle policies (#36)
CI / build-and-test (push) Failing after 10m51s
CI / build-and-test (push) Failing after 10m51s
Fixes #22 Extracts shared grounded collision/friction and airborne movement/landing policies while preserving state-specific behavior. Running fighters now pass `can_walk_off = true` so they can run off platform edges. Includes grounded and airborne hitstun call sites. Reviewed-on: #36 Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
This commit was merged in pull request #36.
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
//! bit-for-bit deterministic for rollback.
|
||||
|
||||
use crate::fighter::state::{
|
||||
CollisionContext, FighterState, InterruptContext, dash, ground_attack, turn, wait, walk,
|
||||
CollisionContext, FighterState, InterruptContext, dash, fall, ground_attack, turn, wait, walk,
|
||||
};
|
||||
use crate::fighter::{
|
||||
FighterAttributes, FighterPreviousTranslation, FighterTranslation, FighterVelocity,
|
||||
@@ -163,6 +163,22 @@ pub fn apply_grounded_motion(
|
||||
translation.0 += FGVec2::new(velocity.0.x, FGi32::ZERO);
|
||||
}
|
||||
|
||||
pub fn update_friction_motion(ctx: &mut crate::fighter::state::UpdateContext) {
|
||||
let friction = if ctx.velocity.x.abs() > ctx.fighter_attributes.max_walk_vel {
|
||||
ctx.fighter_attributes.ground_friction
|
||||
* ctx
|
||||
.game_settings
|
||||
.fighter_common
|
||||
.ground_friction_over_walk_speed_multiplier
|
||||
} else {
|
||||
ctx.fighter_attributes.ground_friction
|
||||
};
|
||||
|
||||
let ground_velocity = ctx.velocity.x;
|
||||
ctx.velocity.x += apply_grounded_friction(friction, ground_velocity);
|
||||
apply_grounded_motion(ctx.velocity, ctx.translation, ctx.prev_translation);
|
||||
}
|
||||
|
||||
pub fn collide_with_stage_grounded(
|
||||
state_context: &mut CollisionContext,
|
||||
ground_common: &mut GroundedStateCommon,
|
||||
@@ -210,6 +226,17 @@ pub fn collide_with_stage_grounded(
|
||||
}
|
||||
}
|
||||
|
||||
pub fn collision_interrupt(
|
||||
ctx: &mut CollisionContext,
|
||||
common: &mut GroundedStateCommon,
|
||||
can_walk_off: bool,
|
||||
) -> Option<FighterState> {
|
||||
match collide_with_stage_grounded(ctx, common, can_walk_off) {
|
||||
GroundedMotionResult::InGround => None,
|
||||
GroundedMotionResult::InAir => Some(FighterState::Fall(fall::FallState)),
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
Reference in New Issue
Block a user