DragonNest/GameCommon/IDnSkillUsableChecker.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

313 lines
8.9 KiB
C++

#include "StdAfx.h"
#include "IDnSkillUsableChecker.h"
#include "DnActorStateChecker.h"
#include "DnHPChecker.h"
#include "DnProbabilityChecker.h"
#include "DnTargetStateChecker.h"
#include "DnMovableChecker.h"
#include "DnJumpableChecker.h"
#include "DnHitChecker.h"
#include "DnToggleChecker.h"
#include "DnTableDB.h"
#include "DnEnergyChargeChecker.h"
#include "DnGroundMovableChecker.h"
#include "DnRangeChecker.h"
#include "DnBubbleCountChecker.h"
#include "DNSummonChecker.h"
#include "DnTargetStateEffectChecker.h"
#if !defined( USE_BOOST_MEMPOOL )
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#endif // #if !defined( USE_BOOST_MEMPOOL )
IDnSkillUsableChecker::IDnSkillUsableChecker(void)
: m_iType( 0 )
{
}
IDnSkillUsableChecker::~IDnSkillUsableChecker(void)
{
}
// static
int IDnSkillUsableChecker::MapOperator( char* pOperator )
{
int iOperator = -1;
if( strcmp( pOperator, "<" ) == 0 )
{
iOperator = OP_GREATER;
}
else
if( strcmp( pOperator, "==" ) == 0 )
{
iOperator = OP_EQUAL;
}
else
if( strcmp( pOperator, "!=" ) == 0 )
{
iOperator = OP_NOT_EQUAL;
}
else
if( strcmp( pOperator, ">" ) == 0 )
{
iOperator = OP_LESS;
}
else
if( strcmp( pOperator, "<=" ) == 0 )
{
iOperator = OP_GREATER_EQUAL;
}
else
if( strcmp( pOperator, ">=" ) == 0 )
{
iOperator = OP_LESS_EQUAL;
}
else
if( strcmp( pOperator, "&" ) == 0 )
{
iOperator = OP_AND;
}
else
if( strcmp( pOperator, "!&" ) == 0 )
{
iOperator = OP_NOT_AND;
}
return iOperator;
}
// static factory 함수
IDnSkillUsableChecker* IDnSkillUsableChecker::Create( DnActorHandle hActor, int iCheckerIndex, int iSkillLevelTableID, int* pIParamOffset )
{
IDnSkillUsableChecker* pNewChecker = NULL;
DNTableFileFormat* pSkillLevelTable = GetDNTable( CDnTableDB::TSKILLLEVEL );
char caBuf[ 256 ];
ZeroMemory( caBuf, sizeof(caBuf) );
switch( iCheckerIndex )
{
case 0:
// 걍 null 리턴
break;
// StateChecker, 2 param
case 1:
{
// 적절한 파라메터를 뽑아주자.
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pRequiredState = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pRequiredState );
int iRequiredState = (CDnActorState::ActorStateEnum)CDnActorState::String2ActorStateEnum( pRequiredState );
++(*pIParamOffset);
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pOperator = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pOperator );
int iOperator = IDnSkillUsableChecker::MapOperator( pOperator );
//_ASSERT( -1 != iOperator );?
++(*pIParamOffset);
if( pRequiredState && -1 != iOperator )
pNewChecker = new CDnActorStateChecker( hActor, (CDnActorState::ActorStateEnum)iRequiredState, iOperator );
}
break;
// HPChecker, 2 param
case 2:
{
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pPercentStr = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pPercentStr );
int iPercent = atoi( pPercentStr );
++(*pIParamOffset);
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pOperator = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pOperator );
int iOperator = IDnSkillUsableChecker::MapOperator( pOperator );
//_ASSERT( -1 != iOperator );
++(*pIParamOffset);
if( pPercentStr && -1 != iOperator )
pNewChecker = new CDnHPChecker( hActor, (float)iPercent, iOperator );
}
break;
// ProbChecker, 1 param
case 3:
{
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pProb = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pProb );
float fProb = (float)atof( pProb );
++(*pIParamOffset);
if( pProb )
pNewChecker = new CDnProbabilityChecker( hActor, (float)fProb );
}
break;
// TargetStateChecker, 2 param
case 4:
{
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pRequiredState = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pRequiredState );
int iRequiredState = (CDnActorState::ActorStateEnum)CDnActorState::String2ActorStateEnum( pRequiredState );
++(*pIParamOffset);
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pOperator = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pOperator );
int iOperator = IDnSkillUsableChecker::MapOperator( pOperator );
//_ASSERT( -1 != iOperator );
++(*pIParamOffset);
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pRadius = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pRadius );
int iRadius = atoi( pRadius );
++(*pIParamOffset);
if( pRequiredState && -1 != iOperator && pRadius )
pNewChecker = new CDnTargetStateChecker( hActor, (CDnActorState::ActorStateEnum)iRequiredState, iOperator, (float)iRadius );
}
break;
// MovableChecker, 인자는 없다.
case 5:
{
pNewChecker = new CDnMovableChecker( hActor );
}
break;
// JumpableChecker, 인자 없음.
case 6:
{
pNewChecker = new CDnJumpableChecker( hActor );
}
break;
case 7:
{
pNewChecker = new CDnHitChecker( hActor );
}
break;
// ToggleChecker, 인자 1개
case 8:
{
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pToggleSkillID = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pToggleSkillID );
int iToggleSkillID = atoi( pToggleSkillID );
++(*pIParamOffset);
if( pToggleSkillID )
pNewChecker = new CDnToggleChecker( hActor, iToggleSkillID );
}
break;
// EnergyChargeChecker, 인자 없음
case 9:
{
pNewChecker = new CDnEnergyChargeChecker( hActor );
}
break;
// GroundMovableChecker, 인자 없음
case 10:
{
pNewChecker = new CDnGroundMovableChecker( hActor );
}
break;
// RangeChecker, 인자 없음, 게임서버에서는 쓰이지 않는다.
case 11:
{
pNewChecker = new CDnRangeChecker( hActor );
}
break;
// BubbleCountChecker, 인자 2개. 게임 서버, 클라 모두 사용.
case 12:
{
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pBubbleTypeIDStr = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pBubbleTypeIDStr );
int iBubbleTypeID = atoi( pBubbleTypeIDStr );
++(*pIParamOffset);
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pNeedCountStr = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pNeedCountStr );
int iNeedCount = atoi( pNeedCountStr );
++(*pIParamOffset);
if( pBubbleTypeIDStr && pNeedCountStr )
{
pNewChecker = new CDnBubbleCountChecker( hActor, iBubbleTypeID, iNeedCount );
}
}
break;
// SummonChecker , 인자 2개 < 액터 아이디(; 으로 구분. 복수개 가능. 하나라도 만족하면 ok) , 범위 >
case 13:
{
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pActorIDArgs = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pActorIDArgs );
++(*pIParamOffset);
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pRange = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pRange );
int iRange = atoi( pRange );
++(*pIParamOffset);
if( pActorIDArgs && pRange )
pNewChecker = new CDnSummonChecker( hActor , pActorIDArgs, iRange );
}
break;
//#53454 꼭두각시 상태효과 관련 - 설정된 상태효과를 가지는 대상이 있어야 스킬 사용 가능
case 14:
{
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pTargetStateEffectIndex = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pTargetStateEffectIndex );
int nStateEffectIndex = pTargetStateEffectIndex ? atoi(pTargetStateEffectIndex) : 0;
++(*pIParamOffset);
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pRange = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pRange );
float fRange = pRange ? (float)atof( pRange ) : 0.0f;
++(*pIParamOffset);
sprintf_s( caBuf, "_CanUseParam%d", *pIParamOffset+1 );
char* pSkillUserCheck = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pSkillUserCheck );
bool bCheckSkillUser = pSkillUserCheck ? atoi(pSkillUserCheck) == 1 : false;
++(*pIParamOffset);
if( pTargetStateEffectIndex && pRange && pSkillUserCheck )
pNewChecker = new CDnTargetStateEffectChecker( hActor , (STATE_BLOW::emBLOW_INDEX)nStateEffectIndex, fRange, bCheckSkillUser );
}
break;
default:
_ASSERT( !"IDnSkillUsableChecker::Create() -> 알 수 없는 Checker 타입. 생성 실패!" );
break;
}
return pNewChecker;
}