using System.Collections.Generic;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace SepCore.CustomComponent
{
///
/// 单局战斗组件。
/// 负责本局临时角色状态、计时、探索暂停标志和战斗占用的最小状态。
/// 本局种子与共享随机源由独立的 RandomComponent 持有,战斗只沿用,不创建私有随机源。
/// 战斗协调(构建请求、打开 UI、回写结果)由独立的 RunBattleCoordinator 负责。
///
public class TurnBattleComponent : GameFrameworkComponent
{
private readonly List _players = new List();
private float _elapsedMs;
private bool _timerPaused;
private bool _explorationPaused;
private bool _battleActive;
///
/// 获取本局临时角色状态列表(只读)。
///
public IReadOnlyList Players => _players;
///
/// 获取本局已流逝时间(毫秒)。
///
public long RunElapsedMs => (long)_elapsedMs;
///
/// 获取单局计时是否已暂停。
///
public bool IsTimerPaused => _timerPaused;
///
/// 获取探索更新是否已暂停。
/// 战斗期间为 true,地图更新统一以此作为门禁。
///
public bool IsExplorationPaused => _explorationPaused;
///
/// 获取当前是否存在战斗占用。
/// 战斗重复进入由此标志拒绝。
///
public bool IsBattleActive => _battleActive;
///
/// 开始一局新的单局:重置全部临时状态。
///
public void BeginRun()
{
_players.Clear();
_elapsedMs = 0;
_timerPaused = false;
_explorationPaused = false;
_battleActive = false;
}
///
/// 结束当前单局,清空全部临时状态。
///
public void EndRun()
{
_players.Clear();
_elapsedMs = 0;
_timerPaused = false;
_explorationPaused = false;
_battleActive = false;
}
///
/// 用指定状态替换本局临时角色列表,保持战备顺序。
///
/// 新的临时角色状态,可为空。
public void ReplacePlayers(IEnumerable players)
{
_players.Clear();
if (players != null)
{
_players.AddRange(players);
}
}
///
/// 预留战斗占用,拒绝同一帧或未结束战斗的重复进入。
///
/// 预留成功返回 true;已存在战斗占用时返回 false。
public bool TryReserveBattle()
{
if (_battleActive)
{
return false;
}
_battleActive = true;
return true;
}
///
/// 释放战斗占用。
///
public void ReleaseBattle()
{
_battleActive = false;
}
///
/// 设置探索更新暂停状态。
///
/// 是否暂停探索更新。
public void SetExplorationPaused(bool paused)
{
_explorationPaused = paused;
}
///
/// 设置单局计时暂停状态。
///
/// 是否暂停单局计时。
public void SetTimerPaused(bool paused)
{
_timerPaused = paused;
}
private void Update()
{
if (_timerPaused)
{
return;
}
_elapsedMs += Time.deltaTime * 1000f;
}
}
}