📄 ability.cpp
字号:
#include "stdafx.h"
#include "Ability.h"
#include "Battle.h"
#include "Skill.h"
#include "StateInfoParser.h"
#include "SkillInfoParser.h"
#include "StatusManager.h"
VOID Ability::Init( Skill *pSkill, BASE_ABILITYINFO *pBaseInfo )
{
Init( pSkill->GetOwner(), pSkill->GetSkillCode(), pSkill->GetSkillnfo(), pSkill->GetSkillBaseInfo()->m_bySkillStatType, pBaseInfo );
}
VOID Ability::Init( Character *pAttacker, SLOTCODE SkillCode, SkillInfo *pSkillInfo, BYTE bySkillStatType, BASE_ABILITYINFO *pBaseInfo )
{
m_SkillCode = SkillCode;
m_bySkillStatType = bySkillStatType;
m_pBaseAbilityInfo = pBaseInfo;
m_eAttrID = m_pBaseAbilityInfo->GetAttrType();
m_eStateID = (eCHAR_STATE_TYPE)pBaseInfo->m_wStateID;
// 颇扼固磐 悸泼
m_pAttacker= pAttacker;
m_dwMainTargetKey = pSkillInfo->m_dwMainTargetKey;
m_wvMainTargetPos = pSkillInfo->m_wvMainTargetPos;
m_pSkillEffect = &pSkillInfo->m_bySkillEffect;
m_bTempApply = TRUE;
m_iSkillAttackPower = 0;
m_fSkillPercentDamage = 0;
}
BOOL Ability::Execute( BYTE byOrder, Character *pTarget, BYTE *pMsg, WORD &wMsgSize )
{
// 惑怕 胶懦阑 贸府茄促.
if( Execute_Status( byOrder, pTarget, pMsg, wMsgSize ) ) return TRUE;
// 惑怕寇狼 胶懦阑 贸府茄促.
switch( m_pBaseAbilityInfo->m_wAbilityID )
{
case eABILITY_DAMAGE:
return Execute_Damage( byOrder, pTarget, pMsg, wMsgSize );
case eABILITY_DAMAGE_PER_TIME:
return Execute_PeriodicDamage( byOrder, pTarget, pMsg, wMsgSize );
case eABILITY_KNOCKBACK:
return Execute_KnockBack( byOrder, pTarget, pMsg, wMsgSize );
case eABILITY_EXHAUST_HP: case eABILITY_EXHAUST_MP:
return Execute_ExhaustAttr( byOrder, pTarget, pMsg, wMsgSize );
case eABILITY_AGGROPOINT_INCREASE:
return Execute_Aggro( byOrder, pTarget, pMsg, wMsgSize );
case eABILITY_FIGHTING_ENERGY_NUM_INCREASE: case eABILITY_BONUS_DAMAGE_PER_FIGHTING_ENERGY:
return Execute_FightingEnergy( byOrder, pTarget, pMsg, wMsgSize );
case eABILITY_TELEPORT:
return Execute_Teleport( byOrder, pTarget, pMsg, wMsgSize );
case eABILITY_RESURRECTION:
return Execute_Resurrection( byOrder, pTarget, pMsg, wMsgSize );
case eABILITY_BUFF_RANGE_DAMAGE:
return Execute_BuffRangeDamage( byOrder, pTarget, pMsg, wMsgSize );
case eABILITY_BONUS_DAMAGE_PER_STATUS:
return Execute_BonusDamage( byOrder, pTarget, pMsg, wMsgSize );
}
return FALSE;
}
BOOL Ability::ExecuteEffect( BYTE byOrder, BYTE *pMsg, WORD &wMsgSize )
{
if( m_pBaseAbilityInfo->m_wAbilityID == eABILITY_BUFF_RANGE_DAMAGE )
{
return Execute_BuffRangeDamage( byOrder, NULL, pMsg, wMsgSize );
}
else if( m_pBaseAbilityInfo->m_wAbilityID == eABILITY_SUMMON )
{
return Execute_Summon( byOrder, NULL, pMsg, wMsgSize );
}
return FALSE;
}
BOOL Ability::CanExecute( Character *pAttacker, Character *pTarget, DWORD dwMainTargetKey, WzVector wvMainTargetPos )
{
// 犬伏阑 八荤秦辑 胶诺茄促.
if( GetRandProb() > m_pBaseAbilityInfo->m_wSuccessRate / 10 )
{
return FALSE;
}
// 胶懦 傍拜裹困俊 甸绢啊绰瘤 眉农
BOOL bAreaCheckFlag = CheckAbilityRange( pAttacker, pTarget, dwMainTargetKey, m_pBaseAbilityInfo->m_byRangeType );
if( !bAreaCheckFlag ) return FALSE;
// 利茄抛 荤侩窍绰 胶懦老 版快
if( m_pBaseAbilityInfo->m_byRangeType == SKILL_ABILITY_ENEMY ||
m_pBaseAbilityInfo->m_byRangeType == SKILL_ABILITY_TARGETAREA_ENEMY ||
m_pBaseAbilityInfo->m_byRangeType == SKILL_ABILITY_MYAREA_ENEMY )
{
// 鸥百捞 傍拜阑 罐阑 荐 乐绰 惑怕牢瘤 眉农茄促.
if( !pTarget->CanBeAttacked() )
{
return FALSE;
}
}
// 惑怕胶懦老 版快 焊龋加己捞 乐促搁 距拳惑怕绰 吧府瘤 臼绰促.
if( pTarget->GetStatusManager()->FindStatus( eCHAR_STATE_PROTECTION ) )
{
BASE_STATEINFO *pStateInfo = StateInfoParser::Instance()->GetStateInfo( m_eStateID );
if( !pStateInfo ) return TRUE;
if( pStateInfo->m_byType == eSTATE_TYPE_ABNORMAL || pStateInfo->m_byType == eSTATE_TYPE_WEAKENING )
{
return FALSE;
}
}
return TRUE;
}
BOOL Ability::CheckAbilityRange( Character *pAttacker, Character* pTarget, DWORD dwMainTargetKey, BYTE byAbilityRangeType )
{
// 措惑捞 矫眉牢 版快
if( byAbilityRangeType == SKILL_ABILITY_CORPSE_FRIEND )
{
if( !pTarget->IsDead() ) return FALSE;
if( !pAttacker->IsFriend( pTarget ) ) return FALSE;
}
// 措惑捞 老馆牢 版快 鸥百捞 磷菌栏搁 力寇
else if( pTarget->IsDead() )
{
return FALSE;
}
// 鞘靛俊 利侩登绢具且 绢呼府萍牢 版快
if( byAbilityRangeType == SKILL_ABILITY_FIELD ) return FALSE;
// 绢呼府萍 利侩鸥涝捞 酒焙牢瘤 利焙牢瘤 眉农
switch( byAbilityRangeType )
{
case SKILL_ABILITY_FRIEND: case SKILL_ABILITY_TARGETAREA_FRIEND:
case SKILL_ABILITY_MYAREA_FRIEND: case SKILL_ABILITY_CORPSE_FRIEND:
if( !pAttacker->IsFriend( pTarget ) ) return FALSE;
break;
case SKILL_ABILITY_ENEMY: case SKILL_ABILITY_TARGETAREA_ENEMY: case SKILL_ABILITY_MYAREA_ENEMY:
if( pAttacker->IsFriend( pTarget ) ) return FALSE;
break;
}
// 窜老 鸥百俊霸父 利侩登绢具且 鸥涝牢 版快
if( byAbilityRangeType == SKILL_ABILITY_FRIEND || byAbilityRangeType == SKILL_ABILITY_ENEMY )
{
if( dwMainTargetKey != pTarget->GetObjectKey() ) return FALSE;
}
else if( byAbilityRangeType == SKILL_ABILITY_ME )
{
if( pAttacker->GetObjectKey() != pTarget->GetObjectKey() ) return FALSE;
}
return TRUE;
}
BOOL Ability::IsDownAbility()
{
switch( m_eStateID )
{
case eCHAR_STATE_STUN: case eCHAR_STATE_DOWN: case eCHAR_STATE_DELAY:
case eCHAR_STATE_FROZEN: case eCHAR_STATE_SLEEP: case eCHAR_STATE_STONE:
return TRUE;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -