spaceship/boss/BossEncounter.gd
2026-09-03 11:49:51 +02:00

55 lines
1.9 KiB
GDScript

class_name BossEncounter
extends Node2D
@onready var boss: Node2D = $Boss
@onready var status_label: Label = $EncounterUI/StatusLabel
@onready var hint_label: Label = $EncounterUI/HintLabel
@onready var health_bar: ProgressBar = $EncounterUI/HealthBar
@onready var game_state: Node = get_node("/root/GameState")
func _ready() -> void:
# One persistent objective lets boss victory flow through the same conquest
# state as authored capture-point maps without pretending the boss is a
# configurable capture point.
game_state.register_capture_points(game_state.planet_id, 1,
game_state.planet_definition_id)
if game_state.is_planet_conquered(game_state.planet_id):
boss.suppress_as_defeated()
health_bar.max_value = boss.max_health()
health_bar.value = 0
status_label.text = "THE WARDEN IS DEAD"
hint_label.text = ""
return
boss.defeated.connect(_on_boss_defeated)
boss.phase_changed.connect(_on_boss_phase_changed)
boss.health_changed.connect(_on_boss_health_changed)
health_bar.max_value = boss.max_health()
health_bar.value = boss.current_health()
_refresh_status()
func _refresh_status() -> void:
var phase_name: String = "PHASE II · LASER STORM" \
if boss.phase == boss.Phase.LASER_STORM else "PHASE I · HATCHLINGS"
status_label.text = "THE WARDEN · %s · EYES %d/%d" % [
phase_name, boss.eyes_destroyed, boss.EYE_COUNT]
hint_label.text = "DESTROY GOLDEN HATCHLINGS · FOLLOW THEIR LIGHT · BREAK THE OPEN EYES"
func _on_boss_phase_changed(_phase: int) -> void:
if boss.phase != boss.Phase.DEFEATED:
_refresh_status()
func _on_boss_health_changed(current: int, maximum: int) -> void:
health_bar.max_value = maximum
health_bar.value = current
_refresh_status()
func _on_boss_defeated() -> void:
game_state.mark_point_captured(game_state.planet_id, 0)
health_bar.value = 0
status_label.text = "THE WARDEN IS DEAD · PLANET CONQUERED"
hint_label.text = ""