X-Git-Url: http://git.purplebirdman.com/frog-ninja.git/blobdiff_plain/3701448ba7e2410adf79dd4a326c0d47a9cc8240..refs/heads/state-machine:/player/moves/dash.gd diff --git a/player/moves/dash.gd b/player/moves/dash.gd index 9ab0583..7bac154 100644 --- a/player/moves/dash.gd +++ b/player/moves/dash.gd @@ -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