2023-11-11 09:15:31 -07:00
|
|
|
extends Node3D
|
|
|
|
|
|
|
|
@export var camera: Camera3D
|
2023-11-11 13:08:24 -07:00
|
|
|
@export var initial_target: Node3D
|
|
|
|
var target: Targetable = null
|
2023-11-11 09:15:31 -07:00
|
|
|
@export var sensitivity := 0.01
|
2023-11-11 17:24:52 -07:00
|
|
|
@export var charge_time := 1.7
|
|
|
|
@export var min_charge := 0.2
|
2023-11-11 09:15:31 -07:00
|
|
|
|
2023-11-11 13:08:24 -07:00
|
|
|
func _ready():
|
|
|
|
set_target(initial_target)
|
|
|
|
|
2023-11-11 16:12:46 -07:00
|
|
|
func get_charge():
|
|
|
|
return %radial_ui.charge_amount
|
|
|
|
|
2023-11-11 09:15:31 -07:00
|
|
|
func _input(event):
|
2023-11-11 17:24:52 -07:00
|
|
|
var billiard := target.get_billiard()
|
2023-11-11 16:12:46 -07:00
|
|
|
if event is InputEventMouseMotion and MouseControl.mouse_is_locked() and get_charge() == 0.0:
|
2023-11-11 09:15:31 -07:00
|
|
|
rotate_view(event.relative*sensitivity)
|
2023-11-11 17:24:52 -07:00
|
|
|
if event.is_action_released("charge") and not billiard.can_hit and charge_tween != null:
|
|
|
|
release()
|
|
|
|
if event.is_action_pressed("charge") and billiard.can_hit and charge_tween == null:
|
2023-11-11 14:56:43 -07:00
|
|
|
charge(event.get_action_strength("charge"))
|
2023-11-11 17:24:52 -07:00
|
|
|
|
2023-11-11 09:15:31 -07:00
|
|
|
func _process(_delta):
|
|
|
|
transform.origin = target.global_position
|
|
|
|
camera.global_position = %camera_spot.global_position
|
|
|
|
camera.look_at(target.global_position)
|
2023-11-11 17:24:52 -07:00
|
|
|
if get_charge() >= 1.0:
|
|
|
|
cancel_charge()
|
2023-11-11 09:15:31 -07:00
|
|
|
|
2023-11-11 17:24:52 -07:00
|
|
|
func cancel_charge():
|
|
|
|
%radial_ui.set_charge(0.0)
|
|
|
|
%ChargeSound.stop()
|
2023-11-11 14:56:43 -07:00
|
|
|
if charge_tween != null:
|
|
|
|
charge_tween.kill()
|
2023-11-11 17:24:52 -07:00
|
|
|
charge_tween = null
|
|
|
|
var billiard := target.get_billiard()
|
|
|
|
billiard.can_hit = true
|
|
|
|
|
|
|
|
func release():
|
|
|
|
if get_charge() <= min_charge:
|
|
|
|
cancel_charge()
|
2023-11-11 14:56:43 -07:00
|
|
|
return
|
2023-11-11 17:24:52 -07:00
|
|
|
%ChargeReleaseSound.volume_db = get_charge() * 12
|
|
|
|
%ChargeReleaseSound.play()
|
|
|
|
var billiard := target.get_billiard()
|
2023-11-11 18:48:23 -07:00
|
|
|
billiard.hit((target.global_position - %camera_spot.global_position).normalized(), get_charge())
|
2023-11-11 17:24:52 -07:00
|
|
|
%radial_ui.set_charge(0.0)
|
|
|
|
%ChargeSound.stop()
|
|
|
|
if charge_tween != null:
|
|
|
|
charge_tween.kill()
|
|
|
|
charge_tween = null
|
|
|
|
|
|
|
|
var charge_tween: Tween = null
|
|
|
|
func charge(_amount: float):
|
|
|
|
var billiard := target.get_billiard()
|
|
|
|
billiard.can_hit = false
|
|
|
|
if charge_tween != null:
|
|
|
|
charge_tween.kill()
|
2023-11-11 14:56:43 -07:00
|
|
|
charge_tween = create_tween()
|
|
|
|
charge_tween.tween_method(%radial_ui.set_charge, 0.0, 1.0, charge_time)
|
2023-11-11 17:24:52 -07:00
|
|
|
%ChargeSound.play()
|
2023-11-11 14:56:43 -07:00
|
|
|
|
2023-11-11 09:15:31 -07:00
|
|
|
func rotate_view(amount: Vector2):
|
|
|
|
rotate_y(-amount.x)
|
|
|
|
%rotate_helper.rotate_z(amount.y)
|
|
|
|
%rotate_helper.rotation_degrees.z = clampf(%rotate_helper.rotation_degrees.z, -77, 77)
|
|
|
|
|
2023-11-11 13:08:24 -07:00
|
|
|
func set_target(node: Node3D):
|
|
|
|
var ntarget = Targetable.is_targetable(node)
|
|
|
|
if ntarget == null:
|
|
|
|
push_error("Node is node targetable", node)
|
|
|
|
return
|
|
|
|
if target != null:
|
|
|
|
target.unmake_target()
|
|
|
|
ntarget.make_target()
|
|
|
|
target = ntarget
|