using System;
using Cielonos.MainGame.Characters;
using UnityEngine;
namespace Cielonos.MainGame
{
///
/// CombatRoomSubmodule 的运行状态。
/// 这里只描述“本次战斗遭遇是否进行中/已清空”,不描述 Run 节点是否完成。
///
public enum CombatRoomState
{
Inactive,
Fighting,
Cleared,
}
public partial class CombatManager
{
///
/// 战斗房生命周期子模块。
/// 它负责监听 EnemySubmodule 的敌人移除事件,并在所有敌人清空时广播 OnRoomCleared。
/// Run 节点推进、奖励生成、UI 提示等上层语义应由 RunManager 或其它订阅方处理。
///
public class CombatRoomSubmodule : SubmoduleBase
{
/// 当前战斗遭遇的生命周期状态。
public CombatRoomState roomState = CombatRoomState.Inactive;
///
/// 当前战斗遭遇内所有敌人被清空时触发。
/// 该事件只表示 CombatRoom 清空;调用方需要自行判断当前 Run 节点类型和阶段。
///
public event Action OnRoomCleared;
///
/// 单个敌人被移除时触发。CombatRoom 只广播事实,统计和奖励由 Run/Reward 层处理。
///
public event Action OnEnemyDefeated;
public CombatRoomSubmodule(CombatManager owner) : base(owner)
{
}
///
/// 启动一次战斗遭遇。应在 ZoneManager 完成敌人生成,并等待敌人完成注册后调用。
///
public void StartRoom()
{
// 防御性取消订阅,避免上一场战斗没有正确 Reset 时重复监听。
owner.enemySm.OnEnemyRemoved -= HandleEnemyRemoved;
if (owner.enemySm.ActiveEnemyCount == 0)
{
roomState = CombatRoomState.Cleared;
Debug.Log("[CombatManager] 战斗房间无敌人,直接标记已清空。");
OnRoomCleared?.Invoke();
return;
}
roomState = CombatRoomState.Fighting;
owner.enemySm.OnEnemyRemoved += HandleEnemyRemoved;
//Debug.Log($"[CombatManager] 战斗房间开始,当前敌人数:{owner.enemySm.ActiveEnemyCount}");
}
///
/// 重置战斗遭遇的运行时缓存。场景切换或放弃战斗时调用,不触发 OnRoomCleared。
///
public void Reset()
{
owner.enemySm.OnEnemyRemoved -= HandleEnemyRemoved;
owner.enemySm.Reset();
owner.coordinatorSm.Reset();
roomState = CombatRoomState.Inactive;
//Debug.Log("[CombatManager] 战斗房间已重置。");
}
///
/// 响应敌人移除事件,并在最后一个敌人离场时结束本次战斗遭遇。
///
private void HandleEnemyRemoved(CharacterBase enemy)
{
if (roomState != CombatRoomState.Fighting) return;
OnEnemyDefeated?.Invoke(enemy);
//Debug.Log($"[CombatManager] 敌人死亡:{enemy.name},剩余:{owner.enemySm.ActiveEnemyCount}");
if (owner.enemySm.ActiveEnemyCount > 0)
{
return;
}
roomState = CombatRoomState.Cleared;
owner.enemySm.OnEnemyRemoved -= HandleEnemyRemoved;
//Debug.Log("[CombatManager] 战斗房间已清空,触发 OnRoomCleared。");
OnRoomCleared?.Invoke();
}
}
}
}