extends RigidBody3D var airtime = -1.0 var mouse_input = Vector2(0,0) var raw_mouse_input = Vector2(0,0) var alpha = 10 @export var allow_jump = true # Called when the node enters the scene tree for the first time. func _ready(): #Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) pass # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): # Makes sure everything is sane $grounded.global_position = global_position $grounded.target_position = Globals.global_down * 1.1 $grounded_override.global_position = global_position $grounded_override.target_position = Globals.global_down * 2 $level.position = global_position # Gravity! apply_central_force(Globals.global_down * 9.8 * 100 * delta) # Sets up the input variables # Cursor input raw_mouse_input = Input.get_last_mouse_velocity() * delta * Globals.sensitivity # Zoom in/out var scroll_input = 0.5 * int(Input.is_action_just_released("out")) - int(Input.is_action_just_released("in")) # WASD var move_input := Vector3.ZERO # Filters the mouse input using exponential interpolation mouse_input.x = mouse_input.x * exp(-alpha * delta) + raw_mouse_input.x * (1.0 - exp(-alpha * delta)) mouse_input.y = mouse_input.y * exp(-alpha * delta * 3) + raw_mouse_input.y * (1.0 - exp(-alpha * delta * 3)) # Assigns the controls input move_input.x = Input.get_axis("forward", "backwards") move_input.y = -Input.get_axis("right", "left") move_input = move_input.normalized() # Funky FOV thing if (!Globals.next && !Globals.restart): # Not doing anything special? Track FOV $level/gimbal_y/gimbal_x/stick/camera.fov = $level/gimbal_y/gimbal_x/stick/camera.fov * exp(-0.5 * delta) + Globals.fov * (1.0 - exp(-0.5 * delta)) else: # Either skipping / restarting : explode FOV $level/gimbal_y/gimbal_x/stick/camera.fov = $level/gimbal_y/gimbal_x/stick/camera.fov * exp(-7 * delta) + 179 * (1.0 - exp(-7 * delta)) # Finished animation? if $level/gimbal_y/gimbal_x/stick/camera.fov > 175: # Was it triggered by a restart or by a next? if Globals.restart: # Reset vars and load active scene Globals.restart = false Globals.next = false get_tree().change_scene_to_file(get_tree().current_scene.scene_file_path) else: # Reset vars and load next scene Globals.restart = false Globals.next = false print ("TODO: load next level...") # Rotates the camera $level/gimbal_y.rotate_z(-mouse_input.x) $level/gimbal_y/gimbal_x.rotate_x(-mouse_input.y) # Clamps the up/down $level/gimbal_y/gimbal_x.rotation_degrees.x = clamp ($level/gimbal_y/gimbal_x.rotation_degrees.x, 5, 175) # Zooms in/out $level/gimbal_y/gimbal_x/stick/camera.translate(Vector3(0,0,scroll_input)) $level/gimbal_y/gimbal_x/stick/camera.position.z = clamp($level/gimbal_y/gimbal_x/stick/camera.position.z, 0, 50) # Default size is 0.85 = 1m $player_model.scale = Vector3(1,1,1) * clamp($level/gimbal_y/gimbal_x/stick/camera.position.z/2, 0, 0.85) # Is the player on the ground? if ($grounded.is_colliding() || $grounded_override.is_colliding()): airtime = -0.3 # Moves via rotation apply_torque(Quaternion.from_euler($level/gimbal_y.global_rotation) * (move_input * 2000.0 * delta)) else: #Moves via translation apply_central_force(Quaternion.from_euler($level/gimbal_y.global_rotation) * (Vector3(move_input.y, -move_input.x, 0) * 350.0 * delta)) # Is the break key pressed? if Input.get_action_strength("alternate") > 0.0 && move_input == Vector3(0,0,0) && airtime < 0.0: # Velocity becomes up/down linear_velocity = Globals.global_down * Globals.global_down.dot(linear_velocity) # Updates the air time airtime += delta # Pressed jump and can jump? if (allow_jump && Input.get_action_strength("up") && airtime < 0.0): # Prevents sneaky double-jumping! airtime = 0 # Plays the animation $player_model/AnimationPlayer.play("ArmatureAction") # Find the velocity along the down vector var velocity_along_normal = Globals.global_down * Globals.global_down.dot(linear_velocity) var new_velocity = (linear_velocity - velocity_along_normal) + (Globals.global_down * -25) # Applies the new velocity set_linear_velocity(new_velocity) if (allow_jump && Input.is_action_just_released("up")): # Find the velocity along the down vector var velocity_along_normal = Globals.global_down * Globals.global_down.dot(linear_velocity) var new_velocity = (linear_velocity - velocity_along_normal/3) + (Globals.global_down * 5) # Applies the new velocity set_linear_velocity(new_velocity)