📄 npc_skill.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 + -