43 lines
1.3 KiB
GDScript3
43 lines
1.3 KiB
GDScript3
|
|
class_name EnemyBigLaserComponent
|
||
|
|
extends Node
|
||
|
|
|
||
|
|
# Fires a heavily telegraphed EnemyBigLaserBeam at the fleet's current
|
||
|
|
# centroid on a long cooldown - the beam itself owns the whole charge/fire/
|
||
|
|
# flash sequence once launched, same "survives the shooter dying" design as
|
||
|
|
# EnemyArtilleryComponent's ArtilleryShell.
|
||
|
|
|
||
|
|
var capability_id: String = "big_laser"
|
||
|
|
|
||
|
|
@export var charge_time: float = 2.5
|
||
|
|
@export var fire_cooldown: float = 9.0
|
||
|
|
@export var beam_range: float = 1200.0
|
||
|
|
@export var beam_half_width: float = 35.0
|
||
|
|
@export var damage: int = 3
|
||
|
|
@export var color: Color = Color(0.55, 0.05, 0.85)
|
||
|
|
|
||
|
|
var cooldown_left: float = 0.0
|
||
|
|
var beam_scene: PackedScene = preload("res://EnemyBigLaserBeam.tscn")
|
||
|
|
|
||
|
|
|
||
|
|
func tick(delta: float) -> void:
|
||
|
|
cooldown_left -= delta
|
||
|
|
if cooldown_left > 0.0:
|
||
|
|
return
|
||
|
|
|
||
|
|
var enemy: Node2D = get_parent()
|
||
|
|
var fleet: Node2D = get_tree().get_first_node_in_group("player_fleet")
|
||
|
|
if fleet == null or fleet.ships.is_empty():
|
||
|
|
return
|
||
|
|
var direction: Vector2 = fleet.get_centroid() - enemy.global_position
|
||
|
|
if direction.length() < 1.0:
|
||
|
|
return
|
||
|
|
|
||
|
|
var beam: Node2D = beam_scene.instantiate()
|
||
|
|
beam.charge_time = charge_time
|
||
|
|
beam.beam_range = beam_range
|
||
|
|
beam.beam_half_width = beam_half_width
|
||
|
|
beam.damage = damage
|
||
|
|
beam.color = color
|
||
|
|
enemy.get_tree().root.add_child(beam)
|
||
|
|
beam.launch(enemy.global_position, direction)
|
||
|
|
cooldown_left = fire_cooldown
|