NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Character/Data/CharacterAliveData.cs

169 lines
5.9 KiB
C#

using Framework;
using Gameplay.Common;
namespace Gameplay.Character
{
public class CharacterAliveData
{
public readonly Character owner;
private float _protectMoraleStateTime;
private const float MoraleStateChangeTime = 1f;
public CharacterAliveData(Character owner)
{
this.owner = owner;
_protectMoraleStateTime = MoraleStateChangeTime;
}
public void ResetProtectTime()
{
_protectMoraleStateTime = -1;
}
public void LogicUpdate(float dt)
{
_UpdateMoraleState(dt);
}
private void _UpdateMoraleState(float dt)
{
if (owner.statusData.isRetreat) return;
if (_protectMoraleStateTime < 0)
{
// 可以进行状态切换
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;
if (oldState == EMoraleState.Normal && newState == EMoraleState.Suppressed)
{
if (owner.debugShowInfo.cacheConfigId != 0)
{
EventManager.Instance.Send(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_ENTER_LOW_MORALE, owner.debugShowInfo.cacheConfigId);
}
if (owner.statusData.lastAttackUnit != null
&& owner.statusData.lastAttackUnit.debugShowInfo.cacheConfigId != 0)
{
EventManager.Instance.Send(EventManager.EventName.INFIGHT_AUDIO_LET_ENEMY_RETREAT, owner.statusData.lastAttackUnit.debugShowInfo.cacheConfigId);
}
}
// 进行通知
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} 保护时间:{_protectMoraleStateTime}");
// 其他的一些固定逻辑,如添加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;
}
}
}