stick-the-quick/characters/abilities/DoubleJumpAbility.gd

43 lines
1.2 KiB
GDScript3
Raw Permalink Normal View History

class_name DoubleJumpAbility extends RunnerAbility
const DECELERATION_FACTOR: float = 0.9
const INITIAL_COMPENSATION_FACTOR: float = 2.5
func begin(runner: Runner) -> void:
if not runner.floor_normal.is_zero_approx():
runner.change_state(&'jump')
else:
runner.linear_velocity += (
runner.up_normal*runner.jump_strength*INITIAL_COMPENSATION_FACTOR
)
func integrate_forces(
runner: Runner,
body_state: PhysicsDirectBodyState3D
) -> void:
if runner.animation_player.current_animation != &'fall':
body_state.linear_velocity = (
body_state.linear_velocity.slide(runner.up_normal) +
body_state.linear_velocity.project(runner.up_normal)*(
DECELERATION_FACTOR
)
)
if not runner.floor_normal.is_zero_approx():
runner._play_land_sound_if_landing_hard_enough()
runner.change_state(&'run')
elif not runner.wall_normal.is_zero_approx():
runner.change_state(&'wall_slide')
elif (
body_state.linear_velocity.normalized().dot(runner.up_normal) < 0.125
):
runner.animation_player.play(&'fall')
elif runner.abnormal_gravity(body_state):
runner.change_state(&'swim')
func orientation(runner: Runner) -> Vector3:
return runner.linear_velocity
func animation_speed(_runner: Runner) -> float:
return 1.0