extends Move
class_name Dash
+@export var dash_length := 10.0
-func update(input: InputPacket, _delta: float):
- # Get the XZ input direction based on player's input relative to the camera
- var forward := camera.global_basis.z
- var right := camera.global_basis.x
- var move_direction := (
- forward * input.movement_direction.y + right * input.movement_direction.x
- ).normalized()
- move_direction.y = 0
-
- # TODO: check if new_pos is valid!
- var new_pos := player.last_movement_direction * player.dash_length
- player.global_position += new_pos
+@onready var timer: Timer = $Timer
+
+var finished := false
+var new_position: Vector3
+
+
+func should_enter(input: InputPacket) -> String:
+ if finished:
+ input.player_actions.sort_custom(moves_priority_sort)
+ return input.player_actions[0]
+ return state_name
+
+
+func update(input: InputPacket, delta: float):
+ if new_position:
+ player.global_position = lerp(
+ player.global_position,
+ new_position,
+ (player.dash_length / timer.wait_time) * delta
+ )
+ else:
+ new_position = player.global_position + Vector3(
+ input.player_movement_direction.x, 0, input.player_movement_direction.y
+ ) * dash_length
+ rotate_skin(new_position)
+
+
+func on_enter_state():
+ new_position = Vector3.ZERO
+ finished = false
+ timer.start()
+
+
+func _on_timer_timeout() -> void:
+ finished = true
+
+
+func rotate_skin(towards: Vector3):
+ var skin_target_angle := Vector3.BACK.signed_angle_to(
+ towards - player.global_position,
+ Vector3.UP
+ )
+ player.skin.global_rotation.y = skin_target_angle