using Framework; using Gameplay.Common; namespace Gameplay.Character { public class CharacterAliveData { public readonly Character owner; private float _protectMoraleStateTime; private const float MoraleStateChangeTime = 3f; public CharacterAliveData(Character owner) { this.owner = owner; _protectMoraleStateTime = MoraleStateChangeTime; } public void LogicUpdate(float dt) { _UpdateMoraleState(dt); } private void _UpdateMoraleState(float dt) { if (_protectMoraleStateTime < 0 && !owner.statusData.isRetreat) { // 可以进行状态切换 var newState = _GetMoraleState(); var nowState = owner.runtimeData.moraleState; if (newState != nowState) { _OnMoraleChanged(nowState, newState); } return; } _protectMoraleStateTime -= dt; } private void _OnMoraleChanged(EMoraleState oldState, EMoraleState newState) { // 切换状态 owner.runtimeData.moraleState = newState; // 重置事件 _protectMoraleStateTime = MoraleStateChangeTime; // 进行通知 var eventData = new EDMoraleStateChange() { unit = owner, newState = newState, oldState = oldState, }; EventManager.Instance.Send(EventManager.EventName.INFIGHT_MORALE_STATE_CHANGED, eventData); // log owner.Log($"士气状态发生改变{oldState} -> {newState}"); // 其他的一些固定逻辑,如添加buff _HandleMoraleStateBuffs(oldState, newState); } private void _HandleMoraleStateBuffs(EMoraleState oldState, EMoraleState newState) { var buffManager = owner.buffManager; if (buffManager == null) return; // 判断退出状态的buff是否需要移除 switch (oldState) { case EMoraleState.Normal: // 没有buff break; case EMoraleState.Retreat: // 移除buff buffManager.RemoveBuffByIds(GLConfig.Inst.data.RetreatBuffIds); break; case EMoraleState.Suppressed: // 移除buff buffManager.RemoveBuffByIds(GLConfig.Inst.data.SuppressBuffIds); break; default: owner.LogError($"未处理的的士气状态:{oldState}"); break; } // 判断进入状态的buff是否需要添加 switch (newState) { case EMoraleState.Normal: // 没有buff break; case EMoraleState.Retreat: // 添加buff buffManager.AddBuffByIds(GLConfig.Inst.data.RetreatBuffIds); break; case EMoraleState.Suppressed: // 添加buff buffManager.AddBuffByIds(GLConfig.Inst.data.SuppressBuffIds); break; default: owner.LogError($"未处理的的士气状态:{newState}"); break; } } private EMoraleState _GetMoraleState() { // 需要根据当前状态做判断 var cMorale = owner.aliveData.currentMorale; switch (owner.runtimeData.moraleState) { case EMoraleState.Normal: if (cMorale < owner.runtimeData.configData.suppressMorale) { return EMoraleState.Suppressed; } return EMoraleState.Normal; case EMoraleState.Suppressed: if (cMorale < owner.runtimeData.configData.retreatMorale) { if (owner.statusData.isNoRetreat) { return EMoraleState.Suppressed; } return EMoraleState.Retreat; } if (cMorale >= owner.runtimeData.configData.suppressMorale) { return EMoraleState.Normal; } return EMoraleState.Suppressed; case EMoraleState.Retreat: if (cMorale >= owner.runtimeData.configData.retreatMorale) { return EMoraleState.Normal; } return EMoraleState.Retreat; } DebugUtil.LogError("暂未处理的士气状态:{0}", owner.runtimeData.moraleState); return EMoraleState.Normal; } } }