📄 abilitystatus.cpp
字号:
#include "stdafx.h"
#include "Ability.h"
#include "AbilityStatus.h"
#include "SkillAttrCalculator.h"
#include "StateInfoParser.h"
VOID AbilityStatus::Init( Character *pOwner, Character *pAttacker, Ability *pAbility )
{
m_bApplied = FALSE;
m_pAttacker = pAttacker;
BASE_ABILITYINFO *pBaseAbilityInfo = pAbility->GetBaseAbilityInfo();
m_SkillCode = pAbility->GetSkillCode();
m_eAbilityID = (eABILITY)pBaseAbilityInfo->m_wAbilityID;
m_eAttrID = pAbility->GetAttrID();
// 蜡瘤矫埃, 林扁
BaseStatus::Init( pOwner, pAbility->GetStateID(), pBaseAbilityInfo->m_iParam[2], pBaseAbilityInfo->m_iParam[3] );
m_iValueType = pBaseAbilityInfo->m_iParam[0];
m_iValue = pBaseAbilityInfo->m_iParam[1];
m_iSumValue = 0;
}
VOID AbilityStatus::Start()
{
BaseStatus::Start();
// 林扁利牢 惑怕甸篮 Execute()俊辑 贸府茄促.
if( BaseStatus::ISPeriodicStatus() ) return;
// Buff 拌凯狼 绢呼府萍甸阑 贸府茄促.
if( m_eAttrID == eATTR_CUR_HP )
{
ChangeHP( TRUE );
}
else if( m_eAttrID == eATTR_CUR_MP )
{
ChangeMP( TRUE );
}
else if( m_eAttrID != eATTR_TYPE_INVALID )
{
SkillAttrCalculator SkillCalc( m_pOwner->GetAttr() );
int iAddValue = SkillCalc.AddAttr( m_eAttrID, m_iValueType, m_iValue ); // AttrType, 荐摹鸥涝, 荐摹
// 唱吝俊 促矫 棵妨霖父怒 别扁困秦辑 m_iValue甫 促矫 汲沥茄促.
m_iSumValue = iAddValue;
m_bApplied = TRUE;
}
}
VOID AbilityStatus::Execute()
{
// Buff 拌凯狼 绢呼府萍甸阑 贸府茄促.
if( m_eAttrID == eATTR_CUR_HP )
{
ChangeHP( TRUE );
}
else if( m_eAttrID == eATTR_CUR_MP )
{
ChangeMP( TRUE );
}
else if( m_eAttrID != eATTR_TYPE_INVALID )
{
SkillAttrCalculator SkillCalc( m_pOwner->GetAttr() );
int iAddValue = SkillCalc.AddAttr( m_eAttrID, m_iValueType, m_iValue );
// 唱吝俊 促矫 棵妨霖父怒 别扁困秦辑 m_iValue甫 促矫 汲沥茄促.
m_iSumValue += iAddValue;
m_bApplied = TRUE;
}
BaseStatus::Execute();
}
VOID AbilityStatus::End()
{
BaseStatus::End();
// 惑怕利侩捞 场车澜阑 努扼捞攫飘俊霸 舅妨霖促.
if( m_wStateID != eCHAR_STATE_INVALID )
{
MSG_CG_STATUS_REMOVE_BRD BrdMsg;
BrdMsg.m_byCategory = CG_STATUS;
BrdMsg.m_byProtocol = CG_STATUS_REMOVE_BRD;
BrdMsg.m_dwTargetKey = m_pOwner->GetObjectKey();
BrdMsg.m_dwStatusCode = m_wStateID;
m_pOwner->SendPacketAround( &BrdMsg, BrdMsg.GetSize() );
}
// Buff 拌凯狼 绢呼府萍甸阑 贸府茄促.
if( m_eAttrID != eATTR_TYPE_INVALID && m_bApplied )
{
SkillAttrCalculator SkillCalc( m_pOwner->GetAttr() );
SkillCalc.DelAttr( m_eAttrID, VALUE_TYPE_VALUE, m_iSumValue );
}
}
VOID AbilityStatus::ChangeHP( BOOL bIncrease )
{
int iValue = m_iValue;
if( m_iValueType == VALUE_TYPE_PERCENT_PER_MAX ) iValue = (int)m_pOwner->GetMaxHP() * iValue / 1000;
else if( m_iValueType == VALUE_TYPE_PERCENT_PER_CUR ) iValue = (int)m_pOwner->GetHP() * iValue / 1000;
if( !bIncrease ) iValue = -iValue;
m_pOwner->OnRecover( iValue, 0 );
}
VOID AbilityStatus::ChangeMP( BOOL bIncrease )
{
int iValue = m_iValue;
if( m_iValueType == VALUE_TYPE_PERCENT_PER_MAX ) iValue = (int)m_pOwner->GetMaxMP() * iValue / 1000;
else if( m_iValueType == VALUE_TYPE_PERCENT_PER_CUR ) iValue = (int)m_pOwner->GetMP() * iValue / 1000;
if( !bIncrease ) iValue = -iValue;
m_pOwner->OnRecover( 0, iValue );
}
BOOL AbilityStatus::ComparePriority( Ability *pAbility )
{
BASE_ABILITYINFO *pBaseAbilityInfo = pAbility->GetBaseAbilityInfo();
eATTR_TYPE eAttrType1 = pAbility->GetAttrID();
int iValueType1 = pBaseAbilityInfo->m_iParam[0];
int iValue1 = pBaseAbilityInfo->m_iParam[1];
if( eAttrType1 == eATTR_TYPE_INVALID )
{
return FALSE;
}
SkillAttrCalculator SkillCalc( m_pOwner->GetAttr() );
// pAbility俊 措茄 搬苞 荐摹
if( iValueType1 == VALUE_TYPE_PERCENT_PER_MAX ) iValue1 = (int)SkillCalc.GetMaxAttrValue( eAttrType1 ) * iValue1 / 1000;
else if( iValueType1 == VALUE_TYPE_PERCENT_PER_CUR ) iValue1 = (int)SkillCalc.GetCurAttrValue( eAttrType1 ) * iValue1 / 1000;
// this俊 措茄 搬苞 荐摹(m_iValue)
// 荐摹 厚背
return abs(m_iValue) > abs(iValue1);
}
BOOL AbilityStatus::IsBad()
{
BASE_STATEINFO *pStateInfo = StateInfoParser::Instance()->GetStateInfo( m_wStateID );
if( !pStateInfo ) return TRUE;
if( pStateInfo->m_byType == eSTATE_TYPE_ABNORMAL || pStateInfo->m_byType == eSTATE_TYPE_WEAKENING )
{
return TRUE;
}
return FALSE;
}
BOOL AbilityStatus::IsReflectStatus()
{
switch( m_wStateID )
{
case eCHAR_STATE_REFLECT_DAMAGE: case eCHAR_STATE_REFLECT_SLOW: case eCHAR_STATE_REFLECT_FROZEN:
case eCHAR_STATE_REFLECT_SLOWDOWN: case eCHAR_STATE_REFLECT_STUN: case eCHAR_STATE_REFLECT_FEAR:
return TRUE;
default:
return FALSE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -