]> Untitled Git - frog-ninja.git/blobdiff - player/moves/dash.gd
Refactoring
[frog-ninja.git] / player / moves / dash.gd
index 9ab05839bb4be58f697067b24c8f0418e48c38f1..7bac154e8f149ac81917fd48d2cb9172ef4979a5 100644 (file)
@@ -1,16 +1,48 @@
 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