extends State class_name MovingState const skin_lean_limit := PI/8 @export var movement_speed: float func update(input: InputPacket, delta: float): super.update(input, delta) player.velocity = get_new_velocity_from_input(input, delta, movement_speed) player.move_and_slide() update_skin(delta) func update_skin(delta: float): # update skin rotation var skin_target_angle := Vector3.BACK.signed_angle_to( player.last_movement_vector, Vector3.UP ) player.model.global_rotation.y = lerp_angle( player.model.global_rotation.y, skin_target_angle, PlayerVariables.rotation_speed * delta ) # lean into player momentum just a little bit player.model.rotation.z = lerp_angle( player.model.rotation.z, clamp( player.last_movement_vector.signed_angle_to( player.velocity, Vector3.UP ) * player.velocity.length() * 0.08, -skin_lean_limit, skin_lean_limit ), PlayerVariables.rotation_speed * delta * 0.25 ) func get_new_velocity_from_input(input: InputPacket, delta: float, speed: float) -> Vector3: var movement_vector := Vector3( input.player_movement_direction.x, 0, input.player_movement_direction.y ) # save off last movement direction if movement_vector.length() > 0.2: player.last_movement_vector = movement_vector # if we're not stuck, then it's okay to set the velocity player.floor_normal = player.get_floor_normal() player.ground_slope_input = (PI / 2) - player.velocity.angle_to(player.floor_normal) var new_velocity = player.velocity.move_toward( movement_vector * (speed + player.ground_slope_input * speed), PlayerVariables.acceleration * delta ) return new_velocity