170 lines
5.9 KiB
C#
170 lines
5.9 KiB
C#
using cfg.FightCfg;
|
|
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(EMoraleType oldState,
|
|
EMoraleType newState)
|
|
{
|
|
// 切换状态
|
|
owner.runtimeData.moraleState = newState;
|
|
// 重置事件
|
|
_protectMoraleStateTime = MoraleStateChangeTime;
|
|
|
|
if (oldState == EMoraleType.Normal && newState == EMoraleType.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(EMoraleType oldState,
|
|
EMoraleType newState)
|
|
{
|
|
|
|
var buffManager = owner.buffManager;
|
|
if (buffManager == null) return;
|
|
// 判断退出状态的buff是否需要移除
|
|
switch (oldState)
|
|
{
|
|
case EMoraleType.Normal:
|
|
// 没有buff
|
|
break;
|
|
case EMoraleType.Retreat:
|
|
// 移除buff
|
|
buffManager.RemoveBuffByIds(GLConfig.Inst.data.RetreatBuffIds, true);
|
|
break;
|
|
case EMoraleType.Suppressed:
|
|
// 移除buff
|
|
buffManager.RemoveBuffByIds(GLConfig.Inst.data.SuppressBuffIds, true);
|
|
break;
|
|
default:
|
|
owner.LogError($"未处理的的士气状态:{oldState}");
|
|
break;
|
|
}
|
|
|
|
// 判断进入状态的buff是否需要添加
|
|
switch (newState)
|
|
{
|
|
case EMoraleType.Normal:
|
|
// 没有buff
|
|
break;
|
|
case EMoraleType.Retreat:
|
|
// 添加buff
|
|
buffManager.AddBuffByIds(GLConfig.Inst.data.RetreatBuffIds);
|
|
break;
|
|
case EMoraleType.Suppressed:
|
|
// 添加buff
|
|
buffManager.AddBuffByIds(GLConfig.Inst.data.SuppressBuffIds);
|
|
break;
|
|
default:
|
|
owner.LogError($"未处理的的士气状态:{newState}");
|
|
break;
|
|
}
|
|
}
|
|
|
|
private EMoraleType _GetMoraleState()
|
|
{
|
|
// 需要根据当前状态做判断
|
|
var cMorale = owner.aliveData.currentMorale;
|
|
switch (owner.runtimeData.moraleState)
|
|
{
|
|
case EMoraleType.Normal:
|
|
if (cMorale <= owner.runtimeData.configData.suppressMorale)
|
|
{
|
|
return EMoraleType.Suppressed;
|
|
}
|
|
return EMoraleType.Normal;
|
|
case EMoraleType.Suppressed:
|
|
if (cMorale <= owner.runtimeData.configData.retreatMorale)
|
|
{
|
|
if (owner.statusData.isNoRetreat)
|
|
{
|
|
return EMoraleType.Suppressed;
|
|
}
|
|
return EMoraleType.Retreat;
|
|
}
|
|
if (cMorale > owner.runtimeData.configData.suppressMorale)
|
|
{
|
|
return EMoraleType.Normal;
|
|
}
|
|
return EMoraleType.Suppressed;
|
|
case EMoraleType.Retreat:
|
|
if (cMorale > owner.runtimeData.configData.retreatMorale)
|
|
{
|
|
return EMoraleType.Normal;
|
|
}
|
|
return EMoraleType.Retreat;
|
|
}
|
|
DebugUtil.LogError("暂未处理的士气状态:{0}", owner.runtimeData.moraleState);
|
|
return EMoraleType.Normal;
|
|
}
|
|
|
|
}
|
|
}
|