137 lines
5.0 KiB
C#
137 lines
5.0 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|