Files
ScrapFrontier/game/entities/weapons/tesla/tesla_projectile.gd
T
2025-11-12 22:14:50 +03:00

70 lines
1.7 KiB
GDScript

extends AbstractProjectile
@export_range(0.01, 0.5) var jink_min_delay: float = 0.01
@export_range(0.01, 0.5) var jink_max_delay: float = 0.01
@export_range(0, 360) var deviation_angle: int = 0
@export_range(0, 1000) var no_deviation_distance: int = 0
@onready var jinkTimer : Timer = $JinkTimer
func _ready() -> void:
super._ready()
_start_jink_timer()
func _start_jink_timer() -> void:
var random_delay := randf_range(jink_min_delay, jink_max_delay)
jinkTimer.start(random_delay)
func _on_jink_timer_timeout() -> void:
var foe := _get_nearest_foe()
if foe:
_target_foe(foe)
if position.distance_to(foe.position) > no_deviation_distance:
_apply_random_deviation()
else:
_apply_random_deviation()
_start_jink_timer()
func _target_foe(foe: AbstractShip) -> void:
var current_speed := _velocity.length()
var foe_direction := position.direction_to(foe.position)
_velocity = current_speed * foe_direction
func _apply_random_deviation() -> void:
var deviation_rad := deg_to_rad(deviation_angle)
var random_angle := randfn(0.0, deviation_rad / 6.0)
_velocity = _velocity.rotated(random_angle)
func _get_nearest_foe() -> AbstractShip:
var nearest_foe : AbstractShip = null
var minimal_distance := 1000000
for foe in _get_foes():
var distance := floori(position.distance_to(foe.position))
if distance < minimal_distance:
minimal_distance = distance
nearest_foe = foe
return nearest_foe
func _get_foes() -> Array[AbstractShip]:
var foes : Array[AbstractShip] = []
if collide_enemies:
foes.append_array(get_tree().get_nodes_in_group("enemies"))
if collide_players:
foes.append_array(get_tree().get_nodes_in_group("players"))
return foes