using System; using Cielonos.MainGame.Characters; using Cielonos.MainGame.Inventory.Collections; using UnityEngine; namespace Cielonos.MainGame { /// /// 战斗房间生命周期状态。 /// public enum CombatRoomState { Inactive, // 未进入任何战斗房间 Fighting, // 战斗进行中 Cleared, // 全部敌人已清除 } public partial class CombatManager { /// /// 战斗房间生命周期子模块。 /// 负责监听敌人死亡事件,在房间清空时触发 OnRoomCleared。 /// public class CombatRoomSubmodule : SubmoduleBase { // ---------------------------------------------------------------- // 状态 // ---------------------------------------------------------------- /// 当前战斗房间的生命周期状态。 public CombatRoomState roomState = CombatRoomState.Inactive; // ---------------------------------------------------------------- // 事件 // ---------------------------------------------------------------- /// /// 战斗房间内所有敌人清除时触发。 /// 由外部系统(RunManager、RewardDispatcher 等)监听,执行掉落和阶段切换。 /// public event Action OnRoomCleared; /// /// 单个敌人死亡时触发。参数为死亡的敌人实例,供货币/统计系统使用。 /// public event Action OnEnemyDefeated; // ---------------------------------------------------------------- // 构造 // ---------------------------------------------------------------- public CombatRoomSubmodule(CombatManager owner) : base(owner) { } // ---------------------------------------------------------------- // 公共 API // ---------------------------------------------------------------- /// /// 开始一场战斗房间。绑定敌人移除事件,将状态置为 Fighting。 /// 应在 ZoneManager 完成敌人生成之后调用。 /// 若当前敌人列表为空(已被清空或无敌人配置),立即标记 Cleared 并触发 OnRoomCleared。 /// public void StartRoom() { // 防御性取消订阅,避免因上一场未正确 Reset 导致重复注册 owner.enemySm.OnEnemyRemoved -= HandleEnemyRemoved; if (owner.enemySm.activeEnemiesList.Count == 0) { // 无敌人可战斗,直接标记清空 roomState = CombatRoomState.Cleared; Debug.Log("[CombatManager] 战斗房间无敌人,直接标记已清空。"); OnRoomCleared?.Invoke(); return; } roomState = CombatRoomState.Fighting; owner.enemySm.OnEnemyRemoved += HandleEnemyRemoved; //Debug.Log($"[CombatManager] 战斗房间开始,当前敌人数:{owner.enemySm.activeEnemiesList.Count}"); } /// /// 手动结束/重置战斗房间(场景切换或放弃时调用)。 /// 解绑事件并重置状态,不触发 OnRoomCleared。 /// public void Reset() { owner.enemySm.OnEnemyRemoved -= HandleEnemyRemoved; owner.enemySm.Reset(); owner.coordinatorSm.Reset(); roomState = CombatRoomState.Inactive; //Debug.Log("[CombatManager] 战斗房间已重置。"); } // ---------------------------------------------------------------- // 内部实现 // ---------------------------------------------------------------- /// 监听 EnemySubmodule.OnEnemyRemoved,判断房间是否清空。 private void HandleEnemyRemoved(CharacterBase enemy) { if (roomState != CombatRoomState.Fighting) return; OnEnemyDefeated?.Invoke(enemy); GrantCurrencyDrop(enemy); //Debug.Log($"[CombatManager] 敌人死亡:{enemy.name},剩余:{owner.enemySm.activeEnemiesList.Count}"); if (owner.enemySm.activeEnemiesList.Count > 0) { return; } // 所有敌人已清除 roomState = CombatRoomState.Cleared; owner.enemySm.OnEnemyRemoved -= HandleEnemyRemoved; //Debug.Log("[CombatManager] 战斗房间已清空,触发 OnRoomCleared。"); OnRoomCleared?.Invoke(); } /// /// 根据死亡敌人的 EnemyRank 向玩家发放对应数量的稀有材料。 /// private void GrantCurrencyDrop(CharacterBase enemy) { if (enemy is not Enemy typedEnemy) return; System.Random rng = new System.Random(); int amount = MainGameManager.Config.RollCurrency(typedEnemy.enemyRank, rng); MainGameManager.Player.inventorySc.backpackSm.ObtainItem(amount); //Debug.Log($"[CombatRoomSubmodule] 击杀 {typedEnemy.enemyRank} 敌人,获得稀有材料 x{amount}。"); } } } }