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

📄 npc_skill.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:
#include "stdafx.h"
#include "NPC.h"
#include "Battle.h"
#include "SkillInfoParser.h"
#include "SkillFactory.h"
#include "Skill.h"


VOID NPC::AddDefaultSkill()
{
	m_SkillSelector.Release();

	// 荤侩啊瓷 胶懦 眠啊
	for( int i = 0; i < 3; ++i )
	{
		if( !m_pBaseInfo->m_wSkillCode[i] )		continue;

		m_SkillSelector.Add( m_pBaseInfo->m_wSkillCode[i],	m_pBaseInfo->m_bySkillRate[i] );
	}
}

VOID NPC::SelectSkill( Character *pTarget, SLOTCODE SkillCode )
{
	SetTargetChar( pTarget );
	m_SelectedSkillCode = SkillCode;
	m_wSelectedSkillDelay = 0;
}

VOID NPC::SelectSkill()
{
	BASE_NPCINFO *pBaseInfo = GetBaseInfo();

	// 漂荐胶懦篮 老沥 林扁付促 胶懦惯悼 炼扒阑 眉农茄促.(何劝, 鳃, 家券)
	if( m_pSkillSelectTimer->IsExpired() )
	{
		WORD wSkillUpdateTime = random( pBaseInfo->m_wSkillUpdateTime, pBaseInfo->m_wSkillUpdateTime*2 );
		m_pSkillSelectTimer->SetTimer( wSkillUpdateTime );

		// 何劝 炼扒阑 父练窍绰瘤 眉农
		if( pBaseInfo->m_byReviveCondition && DrawLots( pBaseInfo->m_byReviveRate ) )
		{
			if( CheckCondition( pBaseInfo->m_byReviveCondition, pBaseInfo->m_wReviveConditionParam ) )
			{
				// 林函俊 矫眉啊 乐栏搁 弊 矫眉肺 鸥百阑 官操绊 秦寸 何劝 胶懦 急琶
				Character *pCorpse = SelectSkillTarget( pBaseInfo->m_wReviveCode );
				if( pCorpse )
				{
					SetTargetChar( pCorpse );
					m_SelectedSkillCode = pBaseInfo->m_wReviveCode;
					m_wSelectedSkillDelay = pBaseInfo->m_wReviveDelay;
					return;
				}
			}
		}

		// 鳃 炼扒阑 父练窍绰瘤 眉农
		if( pBaseInfo->m_byHealCondition && DrawLots( pBaseInfo->m_byHealRate ) )
		{
			Character *pWeakestChar = SelectSkillTarget( pBaseInfo->m_wHealCode, TRUE );
			if( pWeakestChar )
			{
				if( pWeakestChar->CheckCondition( pBaseInfo->m_byHealCondition, pBaseInfo->m_wHealConditionParam ) )
				{
					SetTargetChar( pWeakestChar );
					m_SelectedSkillCode = pBaseInfo->m_wHealCode;
					m_wSelectedSkillDelay = pBaseInfo->m_wHealDelay;
					return;
				}
			}
		}

		// 家券 炼扒阑 父练窍绰瘤 眉农
		if( pBaseInfo->m_bySummonCondition && !m_dwSummonerKey && DrawLots( pBaseInfo->m_bySummonRate ) )
		{
			if( CheckCondition( pBaseInfo->m_bySummonCondition, pBaseInfo->m_wSummonConditionParam ) )
			{
				m_SelectedSkillCode = pBaseInfo->m_wSummonCode;
				m_wSelectedSkillDelay = pBaseInfo->m_wSummonDelay;
				return;
			}
		}

		// 胶懦 荤侩 犬伏俊 蝶扼 "老馆 傍拜" 肚绰 "胶懦 傍拜" 急琶
		if( m_SkillSelector.GetTotalRatio() && DrawLots( pBaseInfo->m_bySkillUsePossible ) )
		{
			DWORD ratio = rand() % m_SkillSelector.GetTotalRatio();

			SLOTCODE skillCode = SKILLCODE_INVALID;
			BOOL bSelected = m_SkillSelector.Select( ratio, skillCode );
			SASSERT( bSelected, "bSelected = FALSE" );					// 急琶且 胶懦捞 绝阑 荐绰 绝促!
			SASSERT( skillCode != SKILLCODE_INVALID, "skillCode == SKILLCODE_INVALID" );

			Character *pSkillTarget = SelectSkillTarget( skillCode );
			if( pSkillTarget )	SetTargetChar( pSkillTarget );

			m_SelectedSkillCode = skillCode;
			m_wSelectedSkillDelay = 1000;

			for( int i = 0; i < 3; ++i )
			{
				if( pBaseInfo->m_wSkillCode[i] == skillCode )	
				{
					m_wSelectedSkillDelay = pBaseInfo->m_wSkillDelay[i];
					break;
				}
			}
		}
		else
		{
			m_SelectedSkillCode = SKILLCODE_NORMAL_ATTACK;
			m_wSelectedSkillDelay = 0;
		}
	}
	else
	{
		m_SelectedSkillCode = SKILLCODE_NORMAL_ATTACK;
		m_wSelectedSkillDelay = 0;
	}
}

BOOL NPC::UseSkill( SLOTCODE SkillCode )
{
	SkillScriptInfo *pBaseSkillInfo = SkillInfoParser::Instance()->GetSkillInfo( SkillCode );
	if( !pBaseSkillInfo )	return FALSE;

	// 胶懦俊 措秦 皋葛府甫 且寸罐绊 胶懦沥焊甫 悸泼茄促.
	Skill* pSkill = SkillFactory::Instance()->AllocSkill( SKILL_TYPE_ACTIVE, pBaseSkillInfo );

	SkillInfo skillInfo;
	memset((void*)&skillInfo, 0, sizeof(SkillInfo));
	WzVector vAttackerPos;	GetPos(&vAttackerPos);
	WzVector vTargetPos;	GetTargetChar()->GetPos(&vTargetPos);
	skillInfo.m_SkillCode			= SkillCode;
	skillInfo.m_dwClientSerial		= 0;
	skillInfo.m_wvCurPos			= vAttackerPos;
	skillInfo.m_wvDestPos			= vAttackerPos;
	skillInfo.m_dwMainTargetKey		= GetTargetChar()->GetObjectKey();
	skillInfo.m_wvMainTargetPos		= vTargetPos;

	// 傍拜磊啊 捞悼窍绰 胶懦牢 版快
	if( pBaseSkillInfo->m_byTarget == SKILL_TARGET_REACHABLE_ENEMY )
	{
		// 剐府扁 贸府甫 秦霖促.
		WzVector wvDiff = vTargetPos - vAttackerPos;
		ExecuteThrust( FALSE, &wvDiff, skillInfo.m_wvDestPos, 0, FALSE );
	}

	pSkill->Init( this, &skillInfo, pBaseSkillInfo );		

	// 胶懦阑 NPC狼 胶懦府胶飘俊 殿废茄促.
	AddSkill( pSkill );

	return TRUE;
}

RC::eSKILL_RESULT NPC::CanUseSkill( SLOTCODE SkillCode, BOOL bCoolTimerReset )
{
	RC::eSKILL_RESULT rcResult = Character::CanUseSkill( SkillCode, bCoolTimerReset );
	if( rcResult != RC::RC_SKILL_SUCCESS )	return rcResult;

	SkillScriptInfo *pBaseSkillInfo = (SkillScriptInfo *)SkillInfoParser::Instance()->GetSkillInfo( SkillCode );

	// 胶懦阑 荤侩且 荐 乐绰 某腐磐牢瘤 眉农茄促.
	if( !CheckClassDefine( pBaseSkillInfo->m_bySkillUserType, pBaseSkillInfo->m_dwClassDefine ) )
	{
		return RC::RC_SKILL_CHAR_CLASS_LIMIT;
	}

	if( bCoolTimerReset )
	{
		util::Timer * pTimer = GetCoolTimer( pBaseSkillInfo->m_SkillClassCode );
		if(!pTimer)
		{
			return RC::RC_SKILL_COOLTIME_ERROR;
		}
		pTimer->Reset();
	}

	return RC::RC_SKILL_SUCCESS;
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -