Reviewed-on: #44 Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
This commit was merged in pull request #44.
This commit is contained in:
@@ -2,10 +2,44 @@ use crate::fighter::state::ground::GroundedStateCommon;
|
||||
use crate::fighter::state::land::{LandingState, LandingType};
|
||||
use crate::fighter::state::{CollisionContext, FighterState};
|
||||
use crate::fighter::*;
|
||||
use crate::input::FighterCommands;
|
||||
|
||||
pub fn integrate_gravity(velocity: &mut FighterVelocity, attributes: &FighterAttributes) {
|
||||
#[derive(Default, Debug, Clone, Copy, Hash)]
|
||||
pub struct AirborneStateCommon {
|
||||
pub is_fast_falling: bool,
|
||||
}
|
||||
|
||||
pub fn process_fast_fall(
|
||||
airborne_state_common: &mut AirborneStateCommon,
|
||||
input: &mut FighterInput,
|
||||
velocity: &mut FighterVelocity,
|
||||
attributes: &FighterAttributes,
|
||||
) {
|
||||
if velocity.y.is_negative() {
|
||||
if input.has_command(FighterCommands::SmashMoveDown) {
|
||||
airborne_state_common.is_fast_falling = true;
|
||||
}
|
||||
input.clear_command(FighterCommands::SmashMoveDown);
|
||||
}
|
||||
|
||||
if airborne_state_common.is_fast_falling {
|
||||
velocity.y = -attributes.fast_fall_speed;
|
||||
}
|
||||
}
|
||||
|
||||
pub fn integrate_gravity(
|
||||
velocity: &mut FighterVelocity,
|
||||
attributes: &FighterAttributes,
|
||||
fast_fall: bool
|
||||
) {
|
||||
velocity.y -= attributes.gravity;
|
||||
velocity.y = velocity.y.max(-attributes.terminal_velocity);
|
||||
|
||||
let terminal_vel = if fast_fall {
|
||||
-attributes.fast_fall_speed
|
||||
} else {
|
||||
-attributes.terminal_velocity
|
||||
};
|
||||
velocity.y = velocity.y.max(terminal_vel);
|
||||
}
|
||||
|
||||
pub fn apply_air_drift(
|
||||
@@ -56,8 +90,12 @@ pub fn apply_air_motion(
|
||||
translation.0 += velocity.0;
|
||||
}
|
||||
|
||||
pub fn update_standard_motion(ctx: &mut crate::fighter::state::UpdateContext) {
|
||||
integrate_gravity(ctx.velocity, ctx.fighter_attributes);
|
||||
pub fn update_standard_motion(
|
||||
ctx: &mut crate::fighter::state::UpdateContext,
|
||||
airborne_common: &mut AirborneStateCommon,
|
||||
) {
|
||||
process_fast_fall(airborne_common, ctx.input, &mut ctx.velocity, ctx.fighter_attributes);
|
||||
integrate_gravity(ctx.velocity, ctx.fighter_attributes, airborne_common.is_fast_falling);
|
||||
apply_air_drift(ctx.velocity, ctx.fighter_attributes, ctx.input);
|
||||
apply_air_motion(ctx.velocity, ctx.translation, ctx.prev_translation);
|
||||
}
|
||||
@@ -110,6 +148,7 @@ mod tests {
|
||||
air_drift_max: FGi32::lit("1.2"),
|
||||
ground_friction: FGi32::ZERO,
|
||||
terminal_velocity: FGi32::ZERO,
|
||||
fast_fall_speed: FGi32::ZERO,
|
||||
gravity: FGi32::ZERO,
|
||||
weight: FGi32::lit("1"),
|
||||
air_friction: FGi32::lit("0.001"),
|
||||
|
||||
Reference in New Issue
Block a user