class_name BossPhase extends Node signal started() signal ended() signal damaged(damage: int) ## Amount of HP this boss stage has. If 0, the boss is invulnerable during ## this phase and must survive until time runs out or [method end_phase] is called. @export_range(0, 1, 1, "or_greater") var hp: int = 0 ## "Survival Time" of the phase. The phase will end when time is up, whether ## HP has been depleted or not. @export_range(0.0, 1.0, 0.01, "or_greater", "suffix:s") var time: float = INF ## The phase to automatically proceed to when this phase ends. @export var next_phase: BossPhase ## [code]true[/code] if the phase is currently active. var active: bool = false var hp_left: int: set(value): hp_left = value if active and hp_left <= 0 and hp > 0: end_phase() var time_left: float = INF: set(value): time_left = value if active and time_left <= 0.0: end_phase() func _physics_process(delta: float) -> void: if active: time_left -= delta func start_phase() -> void: if not active: hp_left = hp time_left = time active = true started.emit() func end_phase() -> void: if active: active = false ended.emit() if next_phase: next_phase.start_phase() func hurt(damage: int) -> void: if active: hp_left = maxi(0, hp_left - damage) damaged.emit(damage)