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