extends CharacterBody3D

@export var speed = 14 # m/s
@export var fall_acceleration = 75 # m/s^2
@export var jump_impulse = 20 # m/s
@export var bounce_impulse = 16 # m/s

var target_velocity = Vector3.ZERO

func _physics_process(delta):
	# By default, we are not moving
	var direction = Vector3.ZERO
	
	# Check inputs
	if Input.is_action_pressed("move_right"):
		direction.x += 1
	if Input.is_action_pressed("move_left"):
		direction.x -= 1
	if Input.is_action_pressed("move_back"):
		direction.z += 1
	if Input.is_action_pressed("move_forward"):
		direction.z -= 1
		
	# If in movement, normalize direction and change looking_at
	if direction != Vector3.ZERO:
		direction = direction.normalized()	
		$Pivot.basis = Basis.looking_at(direction)
		
	# Ground velocity
	target_velocity.x = direction.x * speed
	target_velocity.z = direction.z * speed
	
	# Vertical velocity
	if not is_on_floor():
		target_velocity.y = target_velocity.y - (fall_acceleration * delta)
		
	# Jumping
	if is_on_floor() and Input.is_action_just_pressed("jump"):
		target_velocity.y = jump_impulse
	
	for index in range(get_slide_collision_count()):
		var collision = get_slide_collision(index)
		
		if collision.get_collider() == null:
			continue
			
		if collision.get_collider().is_in_group("mob"):
			var mob = collision.get_collider()
			if Vector3.UP.dot(collision.get_normal()) > 0.1:
				mob.squash()
				target_velocity.y = bounce_impulse
				break
	
	# Move the character
	velocity = target_velocity	
	move_and_slide()
