- # also, if we're moving, we're not idle
- if move_direction.length() < 0.2:
- if velocity == Vector3.ZERO:
- _idle_time += delta
- else:
- _last_movement_direction = move_direction
- _idle_time = 0.0
-
- # if camera is unlocked, rotate whole skin to face movement direction
- var skin_target_angle := Vector3.BACK.signed_angle_to(_last_movement_direction, Vector3.UP)
- _skin.global_rotation.y = lerp_angle(
- _skin.global_rotation.y,
- skin_target_angle,
- rotation_speed * delta
- )
-
- # lean into player momentum just a little bit
- _skin.rotation.z = lerp_angle(
- _skin.rotation.z,
- clamp(_last_movement_direction.signed_angle_to(velocity, Vector3.UP) * movement_speed * 0.08, -PI/4, PI/ 4),
- rotation_speed * delta * 0.25
- )
-
- # let skin know how fast player is moving along the ground
- _skin.set_walking_speed(movement_speed)
-
-
-func _process_player(delta: float) -> void:
- if is_on_floor():
- _process_player_on_floor(delta)
-
- if _idle_time > idle_timeout:
- _skin.transition_move()
- else:
- _skin.transition_move()
- else:
- _skin.transition_falling()
- velocity += get_gravity() * air_speed * delta
-
- move_and_slide()
-
-#########
-# actions
-#########
-
-func _player_dash():
- if _last_movement_direction != Vector3.ZERO:
- var dash_local_pos = _last_movement_direction * dash_length
- # TODO: check if valid position, crop the vector to last valid position
- global_position += dash_local_pos