using Cielonos.MainGame.Characters; using SLSUtilities.General; using UnityEngine; namespace Cielonos.MainGame { public partial class RunManager { /// /// 记录一局 Run 的统计数据。 /// 这里只维护计数和计时,不决定节点完成、奖励发放或结算 UI。 /// public class RunProgressSubmodule : SubmoduleBase { private const string RunManagerHurtKey = "RunManager_HurtTracking"; private const string RunManagerDeathKey = "RunManager_Death"; public RunProgressSubmodule(RunManager owner) : base(owner) { } public void SubscribePlayerEvents() { if (MainGameManager.Player == null) return; CharacterBase.EventSubmodule playerEvents = MainGameManager.Player.eventSm; playerEvents.onHurt.InsertByPriority(RunManagerHurtKey, new PrioritizedAction(_ => OnPlayerHurt(), priority: 0)); playerEvents.onDeath.InsertByPriority(RunManagerDeathKey, new PrioritizedAction(OnPlayerDeath, priority: 0)); } public void UnsubscribePlayerEvents() { if (MainGameManager.Player == null) return; CharacterBase.EventSubmodule playerEvents = MainGameManager.Player.eventSm; playerEvents.onHurt.Remove(RunManagerHurtKey); playerEvents.onDeath.Remove(RunManagerDeathKey); } public void RecordEnemyDefeated(CharacterBase enemy) { if (owner.currentRun == null || enemy == null) { return; } owner.currentRun.enemiesDefeated++; } public void TickElapsedTime() { if (owner.currentRun != null && owner.currentPhase != RunPhase.Idle && owner.currentPhase != RunPhase.Settlement) { owner.currentRun.elapsedTime += Time.deltaTime; } } private void OnPlayerHurt() { if (owner.currentRun != null) { owner.currentRun.hurtCount++; } } private void OnPlayerDeath() { if (owner.currentRun == null) return; owner.currentRun.isCompleted = false; Debug.Log("[RunManager] 玩家死亡,进入结算。"); owner.phaseSm.TransitionToPhase(RunPhase.Settlement); owner.RaiseRunEnded(owner.currentRun); } } } }