149 lines
5.0 KiB
C#
149 lines
5.0 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
}
|