⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ability.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 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 + -