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

📄 abilitystatus.cpp

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