spaceship/VesselWeaponComponent.gd

47 lines
1.4 KiB
GDScript3
Raw Normal View History

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