47 lines
1.4 KiB
GDScript3
47 lines
1.4 KiB
GDScript3
|
|
class_name VesselWeaponComponent
|
||
|
|
extends Node
|
||
|
|
|
||
|
|
var capability_id: String = "weapon"
|
||
|
|
var fire_range: float
|
||
|
|
var fire_cooldown: float
|
||
|
|
var projectile_damage: int
|
||
|
|
var fire_timer: float = 0.0
|
||
|
|
var projectile_scene: PackedScene = preload("res://Projectile.tscn")
|
||
|
|
|
||
|
|
|
||
|
|
func apply_stats() -> void:
|
||
|
|
var ship: Node = get_parent()
|
||
|
|
var state: Node = ship.get_tree().root.get_node("GameState")
|
||
|
|
fire_range = state.vessel_stat(ship.vessel_type, "fire_range")
|
||
|
|
fire_cooldown = state.vessel_stat(ship.vessel_type, "fire_cooldown")
|
||
|
|
projectile_damage = int(state.vessel_stat(ship.vessel_type, "damage"))
|
||
|
|
|
||
|
|
|
||
|
|
func tick(delta: float) -> void:
|
||
|
|
fire_timer -= delta
|
||
|
|
if fire_timer > 0.0:
|
||
|
|
return
|
||
|
|
var ship: Node2D = get_parent()
|
||
|
|
var target: Node2D = _find_nearest_enemy(ship)
|
||
|
|
if target == null:
|
||
|
|
fire_timer = 0.25
|
||
|
|
return
|
||
|
|
var projectile: Node2D = projectile_scene.instantiate()
|
||
|
|
projectile.position = ship.position
|
||
|
|
projectile.damage = projectile_damage
|
||
|
|
ship.get_tree().root.add_child(projectile)
|
||
|
|
projectile.launch(target.position - ship.position)
|
||
|
|
fire_timer = fire_cooldown
|
||
|
|
|
||
|
|
|
||
|
|
func _find_nearest_enemy(ship: Node2D) -> Node2D:
|
||
|
|
var nearest: Node2D = null
|
||
|
|
var best_distance: float = fire_range
|
||
|
|
for enemy in ship.get_tree().get_nodes_in_group("enemies"):
|
||
|
|
if not is_instance_valid(enemy):
|
||
|
|
continue
|
||
|
|
var distance: float = ship.position.distance_to(enemy.position)
|
||
|
|
if distance <= best_distance:
|
||
|
|
best_distance = distance
|
||
|
|
nearest = enemy
|
||
|
|
return nearest
|