class_name MovementComponent
extends Node

@export var move_speed := 4.5
@export var jump_velocity := 4.5
@export var deceleration := 0.75

var body: CharacterBody3D
var direction: Vector3
var gravity: float

func _ready():
	if owner.has_signal("direction_changed"):
		owner.direction_changed.connect(on_direction_changed)

	if owner.has_signal("jumped"):
		owner.jumped.connect(jump)
	
	body = owner as CharacterBody3D
	gravity = ProjectSettings.get_setting("physics/3d/default_gravity")

func _physics_process(delta):
	if direction:
		body.velocity.x = direction.x * move_speed
		body.velocity.z = direction.z * move_speed
	else:
		body.velocity.x *= deceleration
		body.velocity.z *= deceleration

	if !body.is_on_floor():
		body.velocity.y -= gravity * delta

	body.move_and_slide()

func on_direction_changed(new_direction: Vector3):
	direction = new_direction

func can_jump() -> bool:
	return body.is_on_floor()

func jump():
	body.velocity.y = jump_velocity