DragonNest/GameCommon/IDnSkillProcessor.cpp

336 lines
11 KiB
C++
Raw Permalink Normal View History

#include "StdAfx.h"
#include "IDnSkillProcessor.h"
#include "DnPlayAniProcess.h"
#include "DnPartialPlayProcessor.h"
#include "DnChangeProjectileProcessor.h"
#include "DnDivideSEArgumentByTargets.h"
#include "DnImpactBlowProcessor.h"
#include "DnChangeActionStrProcessor.h"
#include "DnRangeSEProcessor.h"
#include "DnPetPlayAniProcess.h"
#include "DnCheckKeyProcessor.h"
#include "DnTableDB.h"
#ifdef _GAMESERVER
#include "DnAuraProcessor.h"
#include "DnApplySEWhenActionSetBlowEnabledProcessor.h"
#include "DnApplySEWhenTargetNormalHitProcessor.h"
#include "DnCallMySummonedMonsterProcessor.h"
#include "DnStateEffectApplyOnOffByBubbleProcessor.h"
#endif
#include "DnChangeActionStrByBubbleProcessor.h"
#if !defined( USE_BOOST_MEMPOOL )
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#endif // #if !defined( USE_BOOST_MEMPOOL )
IDnSkillProcessor::IDnSkillProcessor( DnActorHandle hActor ) : m_hHasActor( hActor ),
m_fTimeLength( 0.0f ),
m_iType( COUNT )
{
}
IDnSkillProcessor::~IDnSkillProcessor(void)
{
}
IDnSkillProcessor* IDnSkillProcessor::Create( DnActorHandle hActor, int iProcessorIndex, int iSkillLevelTableID, int* pIParamOffset, set<string>& vlUseActions )
{
IDnSkillProcessor* pNewProcessor = NULL;
DNTableFileFormat* pSkillLevelTable = GetDNTable( CDnTableDB::TSKILLLEVEL );
char caBuf[ 256 ];
ZeroMemory( caBuf, sizeof(caBuf) );
// <20><><EFBFBD>ڸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD>̹Ƿ<CCB9> _GAMSERVER <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD>.
switch( iProcessorIndex-1 )
{
//// none
//case 0:
//
// break;
// PlayAni
case PLAY_ANI:
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>͸<EFBFBD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD>.
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pActionName = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pActionName );
vlUseActions.insert( pActionName );
++(*pIParamOffset);
if( pActionName )
pNewProcessor = new CDnPlayAniProcess( hActor, pActionName );
}
break;
// Partial Play
case PARTIAL_PLAY_ANI:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pStartActionName = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
vlUseActions.insert( pStartActionName );
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pLoopActionName = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
vlUseActions.insert( pLoopActionName );
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pEndActionName = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
vlUseActions.insert( pEndActionName );
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pTimeLength = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pMoveSpeed = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
_ASSERT( pStartActionName && pLoopActionName && pMoveSpeed && pTimeLength && pMoveSpeed );
if( pStartActionName && pLoopActionName && pMoveSpeed && pTimeLength && pMoveSpeed )
{
int iTimeLength = atoi( pTimeLength );
int iMoveSpeed = atoi( pMoveSpeed );
pNewProcessor = new CDnPartialPlayProcessor( hActor, pStartActionName, pLoopActionName, pEndActionName,
iTimeLength, (float)iMoveSpeed );
}
}
break;
// ChangePrj
case CHANGE_PROJECTILE:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pSourceWeaponID = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pChangeWeaponID = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
_ASSERT( pSourceWeaponID && pChangeWeaponID );
if( pSourceWeaponID && pChangeWeaponID )
{
int iSourceWeaponID = atoi( pSourceWeaponID );
int iChangeWeaponID = atoi( pChangeWeaponID );
pNewProcessor = new CDnChangeProjectileProcessor( hActor, iSourceWeaponID, iChangeWeaponID );
}
}
break;
// Divide State Effect Argument
case DIVIDE_STATE_EFFECT_ARG:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pSEArgument = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
_ASSERT( pSEArgument );
if( pSEArgument )
{
int iSEArgument = atoi( pSEArgument );
pNewProcessor = new CDnDivideSEArgumentByTargets( hActor, iSEArgument );
}
}
break;
// Impact Blow, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
case IMPACT_BLOW:
{
pNewProcessor = new CDnImpactBlowProcessor( hActor );
}
break;
// Aura, <20><><EFBFBD>ڴ<EFBFBD> "<22><><EFBFBD><EFBFBD>"<22><> 1<><31> <20>޴´<DEB4>.
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case AURA:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pRangeArg = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
#ifdef _GAMESERVER
_ASSERT( pRangeArg );
if( pRangeArg )
{
float fRange = (float)atof( pRangeArg );
pNewProcessor = new CDnAuraProcessor( hActor, fRange );
}
else
{
g_Log.Log( LogType::_ERROR, L"IDnSkillProcessor* IDnSkillProcessor::Create() - AURA Processor Create Fail!!\n" );
}
#endif
}
break;
// Change Action String
case CHANGE_ACTIONSTR:
{
//char *szAddStr = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_ProcessParam1" )->GetString();
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char *szAddStr = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
DNVector(std::string) szVecList;
char *szActionName;
for( int i=1; i<10; i++ ) {
sprintf_s( caBuf, "_ProcessParam%d", (*pIParamOffset) + 1 );
szActionName = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
if( szActionName == NULL || strlen( szActionName ) == 0 || strcmp( szActionName, "0" ) == 0 ) continue;
++(*pIParamOffset);
szVecList.push_back( szActionName );
}
pNewProcessor = new CDnChangeActionStrProcessor( hActor, szAddStr, szVecList );
}
break;
// RangeStateEffect
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD>ڴ<EFBFBD> <20><><EFBFBD><EFBFBD>, Ȯ<><C8AE>, <20><><EFBFBD>󿡰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>̺<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>, processor <20><><EFBFBD>ӽð<D3BD>
case RANGE_STATE_EFFECT:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pRangeArg = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pProbArg = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pTargetEffectOutputID = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pDurationTime = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
#ifdef _GAMESERVER
_ASSERT( pRangeArg && pProbArg && pTargetEffectOutputID && pDurationTime );
if( pRangeArg && pProbArg && pTargetEffectOutputID && pDurationTime )
{
float fRange = (float)atof( pRangeArg );
float fProb = (float)atof( pProbArg );
int iTargetOutputID = atoi( pTargetEffectOutputID );
int iDurationTime = atoi( pDurationTime );
pNewProcessor = new CDnRangeSEProcessor( hActor, fRange, fProb, iTargetOutputID, iDurationTime );
}
else
g_Log.Log( LogType::_ERROR, L"IDnSkillProcessor* IDnSkillProcessor::Create() - RANGE_STATE_EFFECT Processor Create Fail!!\n" );
#endif // #ifdef _GAMESERVER
}
break;
// ApplySEWhenActionSetEnabled
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
case APPLY_SE_WHEN_ACTIONSET_ENABLED:
#ifdef _GAMESERVER
pNewProcessor = new CDnApplySEWhenActionSetBlowEnabledProcessor( hActor );
#endif // #ifdef _GAMESERVER
break;
// ApplySEWhenTargetNormalHit
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD>ڴ<EFBFBD> Ȯ<><C8AE> <20>ϳ<EFBFBD>.
case APPLY_SE_WHEN_TARGET_NORMAL_HIT:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pProbArg = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
#ifdef _GAMESERVER
float fProb = (float)atof( pProbArg );
pNewProcessor = new CDnApplySEWhenTargetNormalHitProcessor( hActor, fProb );
#endif // #ifdef _GAMESERVER
}
break;
// CallMySummonedMonster
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD>ڴ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IDs
case CALL_MY_SUMMONED_MONSTER:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pProbArg = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
#ifdef _GAMESERVER
int iSummonedMonsterIDToCall = (int)atoi( pProbArg );
pNewProcessor = new CDnCallMySummonedMonsterProcessor( hActor, iSummonedMonsterIDToCall );
#endif // #ifdef _GAMESERVER
}
break;
// ChangeActionStrByBubble
case CHANGE_ACTIONSTR_BY_BUBBLE:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pArg = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
// <20><><EFBFBD><EFBFBD>ID;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;<3B><><EFBFBD><EFBFBD>ID;<3B>׼<EFBFBD><D7BC≯<EFBFBD>;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;<3B>׼<EFBFBD><D7BC≯<EFBFBD>.... 3<><33><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
pNewProcessor = new CDnChangeActionStrByBubbleProcessor( hActor, pArg );
}
break;
case STATE_EFFECT_APPLY_ONOFF_BY_BUBBLE:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pArg = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
// <20><><EFBFBD><EFBFBD>ID;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;[<5B><><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>1][<5B><><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>2];[<5B><><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>1][<5B><><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>2].... 3<><33><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
#ifdef _GAMESERVER
pNewProcessor = new CDnStateEffectApplyOnOffByBubbleProcessor( hActor, pArg );
#endif // #ifdef _GAMESERVER
}
break;
case PLAY_PET_ANI:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pActionName = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pActionName );
vlUseActions.insert( pActionName );
++(*pIParamOffset);
if( pActionName )
pNewProcessor = new CDnPetPlayAniProcess( hActor, pActionName );
}
break;
case CHECK_KEY:
{
sprintf_s(caBuf, "_ProcessParam%d", *pIParamOffset + 1);
char* pActionName = pSkillLevelTable->GetFieldFromLablePtr(iSkillLevelTableID, caBuf)->GetString();
_ASSERT(pActionName);
vlUseActions.insert(pActionName);
++(*pIParamOffset);
if (pActionName)
pNewProcessor = new CDnCheckKeyProcess(hActor, pActionName);
}
break;
}
return pNewProcessor;
}