using TMPro; using UnityEngine; using UnityEngine.UI; using WarGame.Managers; namespace WarGame.UI { public class BattleHUD : MonoBehaviour { [Header("Ongoing Unit Count Display")] [SerializeField] private TMP_Text playerUnitsCountText; [SerializeField] private TMP_Text enemyUnitsCountText; [Header("Round & State Display")] [SerializeField] private TMP_Text waveTitleText; [SerializeField] private TMP_Text battleStatusText; [Header("Controls")] [SerializeField] private Button startBattleButton; [SerializeField] private Button speed1xButton; [SerializeField] private Button speed2xButton; [SerializeField] private Button speed4xButton; private void Start() { if (BattleManager.Instance != null) { BattleManager.Instance.OnUnitCountsChanged += UpdateOngoingUnitCounts; BattleManager.Instance.OnBattleStateChanged += HandleBattleStateChanged; BattleManager.Instance.OnWaveChanged += UpdateWaveDisplay; UpdateWaveDisplay(BattleManager.Instance.CurrentWave); UpdateOngoingUnitCounts(BattleManager.Instance.PlayerAliveCount, BattleManager.Instance.EnemyAliveCount); HandleBattleStateChanged(BattleManager.Instance.CurrentBattleState); } if (startBattleButton != null) { startBattleButton.onClick.AddListener(OnStartBattleClicked); } if (speed1xButton != null) speed1xButton.onClick.AddListener(() => SetGameSpeed(1f)); if (speed2xButton != null) speed2xButton.onClick.AddListener(() => SetGameSpeed(2f)); if (speed4xButton != null) speed4xButton.onClick.AddListener(() => SetGameSpeed(4f)); } private void OnDestroy() { if (BattleManager.Instance != null) { BattleManager.Instance.OnUnitCountsChanged -= UpdateOngoingUnitCounts; BattleManager.Instance.OnBattleStateChanged -= HandleBattleStateChanged; BattleManager.Instance.OnWaveChanged -= UpdateWaveDisplay; } } private void UpdateOngoingUnitCounts(int playerAlive, int enemyAlive) { if (playerUnitsCountText != null) { int totalPlayer = BattleManager.Instance != null ? BattleManager.Instance.PlayerTotalCount : playerAlive; playerUnitsCountText.text = $"Player Army: {playerAlive} / {totalPlayer}"; } if (enemyUnitsCountText != null) { int totalEnemy = BattleManager.Instance != null ? BattleManager.Instance.EnemyTotalCount : enemyAlive; enemyUnitsCountText.text = $"Enemy Force: {enemyAlive} / {totalEnemy}"; } UpdateStartButtonState(); } private void UpdateWaveDisplay(int wave) { if (waveTitleText != null) { waveTitleText.text = $"Battle Round: {wave}"; } } private void HandleBattleStateChanged(BattleState state) { if (battleStatusText != null) { switch (state) { case BattleState.Preparation: battleStatusText.text = "PHASE: RECRUITMENT & PREPARATION"; battleStatusText.color = new Color(0.3f, 0.8f, 1f); break; case BattleState.BattleInProgress: battleStatusText.text = "PHASE: BATTLE IN PROGRESS"; battleStatusText.color = new Color(1f, 0.4f, 0.2f); break; case BattleState.Victory: battleStatusText.text = "VICTORY ACHIEVED!"; battleStatusText.color = new Color(0.3f, 1f, 0.4f); break; case BattleState.Defeat: battleStatusText.text = "DEFEAT!"; battleStatusText.color = new Color(1f, 0.2f, 0.2f); break; } } UpdateStartButtonState(); } private void UpdateStartButtonState() { if (startBattleButton == null || BattleManager.Instance == null) return; bool isPrep = BattleManager.Instance.CurrentBattleState == BattleState.Preparation; bool hasUnits = BattleManager.Instance.PlayerTotalCount > 0; startBattleButton.interactable = isPrep && hasUnits; } private void OnStartBattleClicked() { if (BattleManager.Instance != null) { BattleManager.Instance.StartBattle(); } } private void SetGameSpeed(float speed) { if (BattleManager.Instance != null) { BattleManager.Instance.SetGameSpeed(speed); } } } }