using System;
using Cielonos.MainGame.Characters;
using SLSUtilities.UI;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.Serialization;
using UnityEngine.UI;
namespace Cielonos.MainGame.UI
{
///
/// 结算画面 UI 页面(Demo 版本)。
/// 在 RunPhase.Settlement 时自动打开,显示通关时间、稀有材料数量和受伤次数。
/// 提供"重新开始"和"回到主菜单"两个按钮。
///
public class SettlementUIPage : UIPageBase
{
// ================================================================
// 序列化字段
// ================================================================
[Header("Stats")]
[SerializeField] private TMP_Text clearTimeText;
[SerializeField] private TMP_Text rareMaterialText;
[SerializeField] private TMP_Text hurtCountText;
[Header("Buttons")]
[SerializeField] private Button restartButton;
[SerializeField] private Button mainMenuButton;
[FormerlySerializedAs("mainMenuSceneName")]
[Header("Settings")]
[Tooltip("回到主菜单时加载的场景名称")]
[SerializeField] private string menuSceneName = "Menu";
// ================================================================
// 生命周期
// ================================================================
protected override void Start()
{
base.Start();
RunManager.Instance.OnPhaseChanged += OnPhaseChanged;
restartButton.onClick.AddListener(OnRestartClicked);
mainMenuButton.onClick.AddListener(OnMainMenuClicked);
}
private void OnDestroy()
{
RunManager.Instance.OnPhaseChanged -= OnPhaseChanged;
}
// ================================================================
// 阶段监听
// ================================================================
/// RunManager 阶段切换回调,进入 Settlement 时打开结算画面。
private void OnPhaseChanged(RunPhase phase)
{
if (phase == RunPhase.Settlement)
Open();
}
/// 页面打开时填充统计数据。
protected override void OnPageOpened()
{
base.OnPageOpened();
PopulateStats();
}
// ================================================================
// 数据填充
// ================================================================
/// 根据当前 RunState 和玩家背包数据填充结算数据。
private void PopulateStats()
{
RunState run = RunManager.Instance?.currentRun;
// 通关时间(MM:SS 或 HH:MM:SS)
if (clearTimeText != null)
{
float elapsed = run?.elapsedTime ?? 0f;
TimeSpan ts = TimeSpan.FromSeconds(elapsed);
clearTimeText.text = ts.TotalHours >= 1
? $"{(int)ts.TotalHours:D2}:{ts.Minutes:D2}:{ts.Seconds:D2}"
: $"{ts.Minutes:D2}:{ts.Seconds:D2}";
}
// 稀有材料数量(从玩家背包读取)
if (rareMaterialText != null)
{
int amount = 0;
Player player = MainGameManager.Player;
if (player != null)
amount = player.inventorySc.GetRareMaterialAmount();
rareMaterialText.text = amount.ToString();
}
// 受伤次数(实际扣血次数,不含被盾完全抵挡的受击)
if (hurtCountText != null)
{
int hurt = run?.hurtCount ?? 0;
hurtCountText.text = hurt.ToString();
}
}
// ================================================================
// 按钮回调
// ================================================================
/// 重新开始一局 Run:关闭结算画面并启动新一局。
public void OnRestartClicked()
{
Close();
if (RunManager.Instance != null)
RunManager.Instance.StartNewRun();
}
/// 回到主菜单:加载主菜单场景。
public void OnMainMenuClicked()
{
SceneManager.LoadScene(menuSceneName);
}
}
}