extends Node ## Persistent match state. Only WaveManager advances phases or resolves results. signal phase_changed(phase: int) signal changed enum Phase { MENU, BUILD, COMBAT, RESULTS, GAME_OVER } const CORE_MAX_HP := 3000 const ONGOING := -2 const DRAW := -1 const AI_LEARNING := 0 const AI_STANDARD := 1 const MODE_SHORT := "short" const MODE_EXPEDITION := "expedition" var phase: int = Phase.MENU var wave: int = 0 var core_hp: Array = [CORE_MAX_HP, CORE_MAX_HP] var paused: bool = false var speed: int = 1 var outcome: int = ONGOING var last_reports: Array = [{}, {}] var ai_level: int = AI_LEARNING var timed_build: bool = false var factions: Array[String] = ["wurzelbund", "glutpakt"] var match_mode: String = MODE_EXPEDITION func select_mode(value: String) -> bool: if phase not in [Phase.MENU, Phase.GAME_OVER] or value not in [MODE_SHORT, MODE_EXPEDITION]: return false match_mode = value changed.emit() return true func reset_match() -> void: wave = 0 core_hp = [CORE_MAX_HP, CORE_MAX_HP] paused = false speed = 1 outcome = ONGOING last_reports = [{}, {}] set_phase(Phase.MENU) func set_phase(next_phase: int) -> void: phase = next_phase phase_changed.emit(phase) changed.emit() func apply_core_damage(damage: Array) -> void: # Both lanes are applied before anyone checks the winner. for team in range(2): core_hp[team] = maxi(0, int(core_hp[team]) - maxi(0, int(damage[team]))) changed.emit() func decide_winner(final_wave: bool = false) -> int: if core_hp[0] <= 0 and core_hp[1] <= 0: return DRAW if core_hp[0] <= 0: return 1 if core_hp[1] <= 0: return 0 if not final_wave: return ONGOING if core_hp[0] == core_hp[1]: return DRAW return 0 if core_hp[0] > core_hp[1] else 1 func phase_name() -> String: return ["VORBEREITUNG", "BAUPHASE", "AUTOKAMPF", "ABRECHNUNG", "PARTIE BEENDET"][phase] func select_faction(team: int, faction: String) -> bool: if phase not in [Phase.MENU, Phase.GAME_OVER] or team < 0 or team > 1 or faction not in DataCatalog.FACTIONS: return false factions[team] = faction changed.emit() return true