@export_range(0.0, 1.0) var mouse_sensitivity := 0.15
@export_range(0.0, 1.0) var mouse_sensitivity_x := 1.0
@export_range(0.0, 1.0) var mouse_sensitivity_y := 0.5
@export_range(0.0, 1.0) var mouse_sensitivity := 0.15
@export_range(0.0, 1.0) var mouse_sensitivity_x := 1.0
@export_range(0.0, 1.0) var mouse_sensitivity_y := 0.5
@onready var _debug: CanvasLayer = %debug
@onready var _camera_pivot: Node3D = %camera_pivot
@onready var _camera: Camera3D = %camera
@onready var _debug: CanvasLayer = %debug
@onready var _camera_pivot: Node3D = %camera_pivot
@onready var _camera: Camera3D = %camera
var _camera_input_direction := Vector2.ZERO
enum {CAMERA_MOUSE_INPUT, CAMERA_JOYSTICK_INPUT}
var _camera_input_method := CAMERA_MOUSE_INPUT
var _idle_time: float = 0.0
var _camera_input_direction := Vector2.ZERO
enum {CAMERA_MOUSE_INPUT, CAMERA_JOYSTICK_INPUT}
var _camera_input_method := CAMERA_MOUSE_INPUT
var _idle_time: float = 0.0
_debug.draw.add_vector(self, "velocity", 1, 1, Color(0,1,0,1))
_debug.draw.add_vector(self, "velocity", 1, 1, Color(0,1,0,1))
_debug.draw.add_vector(self, "_last_movement_direction", 1, 1, Color(1,0,0,1))
_debug.stats.add_property(self, "velocity", "length")
_debug.stats.add_property(self, "_idle_time", "round")
_debug.draw.add_vector(self, "_last_movement_direction", 1, 1, Color(1,0,0,1))
_debug.stats.add_property(self, "velocity", "length")
_debug.stats.add_property(self, "_idle_time", "round")
if event.is_action_pressed("player_attack") and velocity.length() > jog_speed * .75:
_player_speed = charge_speed
if event.is_action_pressed("player_attack") and velocity.length() > jog_speed * .75:
_player_speed = charge_speed
# reset mouse movement vector if mouse input
if _camera_input_method == CAMERA_MOUSE_INPUT:
_camera_input_direction = Vector2.ZERO
# reset mouse movement vector if mouse input
if _camera_input_method == CAMERA_MOUSE_INPUT:
_camera_input_direction = Vector2.ZERO
func _process_player_on_floor(delta: float):
var move_direction := _get_player_move_direction()
# if we're not stuck, then it's okay to set the velocity
func _process_player_on_floor(delta: float):
var move_direction := _get_player_move_direction()
# if we're not stuck, then it's okay to set the velocity
- var floor_normal := move_direction.angle_to(get_floor_normal() * Vector3(1, 0, 1)) + 1
- velocity = velocity.move_toward(move_direction * (_player_speed + 1 / floor_normal * 20), acceleration * delta)
+ _floor_normal = get_floor_normal()
+ var ground_angle := move_direction.angle_to(_floor_normal * Vector3(1, 0, 1))
+ #print(str(ground_angle))
+ velocity = velocity.move_toward(move_direction * (_player_speed + ground_angle), acceleration * delta)
var movement_speed := Vector3(velocity.x, 0, velocity.z).length()
# also, if we're moving, we're not idle
if move_direction.length() < 0.2:
if velocity == Vector3.ZERO:
_idle_time += delta
var movement_speed := Vector3(velocity.x, 0, velocity.z).length()
# also, if we're moving, we're not idle
if move_direction.length() < 0.2:
if velocity == Vector3.ZERO:
_idle_time += delta
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
)
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
# handle collisions
for i in get_slide_collision_count():
var c := get_slide_collision(i)
if c.get_collider() is RigidBody3D:
var col: RigidBody3D = c.get_collider()
# handle collisions
for i in get_slide_collision_count():
var c := get_slide_collision(i)
if c.get_collider() is RigidBody3D:
var col: RigidBody3D = c.get_collider()