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(); } } } }