DragonNest/Client/DnTableVerifier/skill_data_test.cpp

651 lines
40 KiB
C++
Raw Normal View History

2024-12-20 16:56:44 +08:00
<EFBFBD><EFBFBD>#include "StdAfx.h"
#include "skill_data_test.h"
#include "EtActionBase.h"
#include "EtActionSignal.h"
#include "SignalHeader.h"
const int MAX_STATE_EFEFCT_COUNT = 5;
const int MAX_PROCESSOR = 5;
DNTableFileFormat* skill_data_test::s_pSkillTable = NULL;
DNTableFileFormat* skill_data_test::s_pSkillLevelTable = NULL;
DNTableFileFormat* skill_data_test::s_pItemTable = NULL;
set<int> skill_data_test::s_setSkillBookItemID;
CEtActionBase* skill_data_test::s_pWarrior = NULL;
CEtActionBase* skill_data_test::s_pArcher = NULL;
CEtActionBase* skill_data_test::s_pCleric = NULL;
CEtActionBase* skill_data_test::s_pSoceress = NULL;
#define SKILL_T skill_data_test::s_pSkillTable
#define SKILL_LEVEL_T skill_data_test::s_pSkillLevelTable
skill_data_test::skill_data_test(void)
{
}
skill_data_test::~skill_data_test(void)
{
}
void skill_data_test::SetUpTestCase( void )
{
s_pSkillTable = LoadExtFile( "SkillTable.dnt" );
s_pSkillLevelTable = LoadExtFile( "SkillLevelTable.dnt", "_SkillIndex" );
s_pItemTable = LoadExtFile( "ItemTable.dnt" );
for( int i = 0; i < s_pItemTable->GetItemCount(); ++i )
{
int iItemID = s_pItemTable->GetItemID( i );
// <EFBFBD>¬Ё<EFBFBD> <EFBFBD>Ѕ<EFBFBD>@<EFBFBD> 10
if( 10 == s_pItemTable->GetFieldFromLablePtr( iItemID, "_Type" )->GetInteger() )
{
s_setSkillBookItemID.insert( iItemID );
}
}
s_pWarrior = new CEtActionBase;
s_pWarrior->LoadAction( (g_strResourcePathA+"\\Resource\\Char\\Player\\Warrior\\Warrior.act").c_str() );
s_pArcher = new CEtActionBase;
s_pArcher->LoadAction( (g_strResourcePathA+"\\Resource\\Char\\Player\\Archer\\Archer.act").c_str() );
s_pCleric = new CEtActionBase;
s_pCleric->LoadAction( (g_strResourcePathA+"\\Resource\\Char\\Player\\Cleric\\Cleric.act").c_str() );
s_pSoceress = new CEtActionBase;
s_pSoceress->LoadAction( (g_strResourcePathA+"\\Resource\\Char\\Player\\Soceress\\Soceress.act").c_str() );
}
void skill_data_test::TearDownTestCase( void )
{
SAFE_DELETE( s_pSkillTable );
SAFE_DELETE( s_pSkillLevelTable );
// <EFBFBD>\<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD≯ <EFBFBD> L<EFBFBD> ActionCoreMng <EFBFBD><EFBFBD><EFBFBD> ׾$<EFBFBD> `1`1
// |<EFBFBD><EFBFBD><EFBFBD> delete X<EFBFBD><EFBFBD><EFBFBD> J<EFBFBD><EFBFBD><EFBFBD> ]<EFBFBD>İ..
//SAFE_DELETE( s_pWarrior );
//SAFE_DELETE( s_pArcher );
//SAFE_DELETE( s_pCleric );
//SAFE_DELETE( s_pSoceress );
}
void skill_data_test::SetUp( void )
{
//m_pTestActionLoad = shared_ptr<CEtActionBase>(new CEtActionBase);
//m_pTestActionLoad->LoadAction( "R:/GameRes/Resource/Char/Player/Cleric/Cleric.act" );
}
void skill_data_test::TearDown( void )
{
}
TEST_F( skill_data_test, PASSIVESKILL_MUST_NOT_HAVE_PLAYANI_PROCESSOR )
{
int iNumItemCount = SKILL_T->GetItemCount();
for( int iSkill = 0; iSkill < iNumItemCount; ++iSkill )
{
int iSkillTableID = SKILL_T->GetItemID( iSkill );
int iSkillType = SKILL_T->GetFieldFromLablePtr( iSkillTableID, "_SkillType" )->GetInteger();
TCHAR atcBuf[ 512 ];
char acLabel[ 64 ];
// 1t<EFBFBD> (<EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD>¬Є<EFBFBD>
if( 1 == iSkillType )
{
int iProcessor = -1;
for( int i = 0; i < MAX_PROCESSOR; ++i )
{
sprintf_s( acLabel, "_Processor%d", i + 1 );
iProcessor = SKILL_T->GetFieldFromLablePtr( iSkillTableID, acLabel )->GetInteger();
// 1 <EFBFBD><EFBFBD>t<EFBFBD> PlayAni
ZeroMemory( atcBuf, sizeof(atcBuf) );
_stprintf_s( atcBuf, _T("{TableName:SkillTable, Index:%d, Note:(<28><><EFBFBD> <0C> <00>¬<EFBFBD>@<40> a<>X<EFBFBD>4<EFBFBD><34><EFBFBD><1C> <00><><11> InputHasPassiveSkill \<EFBFBD> <00>̬<EFBFBD>)<29>Ȳ<EFBFBD><C8B2>...}"), iSkillTableID );
SCOPED_TRACE( atcBuf );
EXPECT_NE( 1, iProcessor );
}
}
}
}
void ValidateProcessArgument( int iLevelTableID, int iArgument )
{
char acBuf[ 64 ];
sprintf_s( acBuf, "_ProcessParam%d", iArgument+1 );
const char* pArgument = SKILL_LEVEL_T->GetFieldFromLablePtr( iLevelTableID, acBuf )->GetString();
//EXPECT_STRNE( "0", pArgument );
EXPECT_STRNE( "", pArgument );
}
// PlayAni <EFBFBD><EFBFBD> <EFBFBD>Ѕ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD>Ŕ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TEST_F( skill_data_test, PROCESSOR_ARGUMENT_VERIFY )
{
const char* apProcessTypeName [] = { "PlayAni", "TimePlay", "ChangePrj", "DivideSEArgByTargetNum", "ImpactBlow", "Aura", "ChangeAction", "RangeStateEffect" };
int iNumItemCount = SKILL_T->GetItemCount();
for( int iSkill = 0; iSkill < iNumItemCount; ++iSkill )
{
int iSkillTableID = SKILL_T->GetItemID( iSkill );
// PlayAni <EFBFBD><EFBFBD> <EFBFBD>Ѕ<EFBFBD>t<EFBFBD> <EFBFBD>ǔ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
int aiUseProcessorType[ 5 ];
ZeroMemory( aiUseProcessorType, sizeof(aiUseProcessorType) );
for( int iProcessor = 0; iProcessor < MAX_PROCESSOR; ++iProcessor )
{
char acBuf[ 64 ];
sprintf_s( acBuf, "_Processor%d", iProcessor+1 );
int iUseType = SKILL_T->GetFieldFromLablePtr( iSkillTableID, acBuf )->GetInteger();
aiUseProcessorType[ iProcessor ] = iUseType;
}
vector<int> vlSkillLevelList;
if( SKILL_LEVEL_T->GetItemIDListFromField( "_SkillIndex", iSkillTableID, vlSkillLevelList ) == 0 )
FAIL();
int iNumSkillLevel = (int)vlSkillLevelList.size();
for( int iLevel = 0; iLevel < iNumSkillLevel; ++iLevel )
{
bool bChangeActionStr = false; // a<EFBFBD>X<EFBFBD> 8<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ѕ<EFBFBD>@<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD> L<EFBFBD>8<EFBFBD><EFBFBD><EFBFBD> /<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>!<EFBFBD>t<EFBFBD> H<EFBFBD>(<EFBFBD>.
int iNowProcessor = 0;
int iSkillLevelID = vlSkillLevelList.at( iLevel );
for( int iArgument = 0; iArgument < 10; )
{
// <EFBFBD><EFBFBD><EFBFBD>Ѕ<EFBFBD> $<EFBFBD><EFBFBD> \<EFBFBD><EFBFBD> /<EFBFBD>”<EFBFBD> 5<EFBFBD><EFBFBD><EFBFBD>.
if( MAX_PROCESSOR == iNowProcessor )
break;
// NONE <<EFBFBD>\<EFBFBD> K<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> (Ӥ<EFBFBD>
if( 0 == aiUseProcessorType[ iNowProcessor ] )
{
++iNowProcessor;
continue;
}
TCHAR atcTraceBuf[ 1024 ];
if( bChangeActionStr )
{
_stprintf_s( atcTraceBuf, _T("{TableName:SkillTable, Index:%d, Level:%d, Note:ChangeActionStr <1C><04> <00>Ѕ<EFBFBD> <00><>L<EFBFBD><4C><EFBFBD> <00><>x<EFBFBD> <1C><04><>Ѕ<EFBFBD>t<EFBFBD> $<24>t<EFBFBD> H<>)<29>Ȳ<EFBFBD><C8B2>.}"), iSkillTableID, iLevel+1 );
EXPECT_TRUE( bChangeActionStr );
}
ZeroMemory( atcTraceBuf, sizeof(atcTraceBuf) );
const char* pNowProcessorTypeName = NULL;
int iNumArgument = 0;
switch( aiUseProcessorType[ iNowProcessor ] )
{
// playani xǐǔ<EFBFBD> 1<EFBFBD>
case 1:
iNumArgument = 1;
pNowProcessorTypeName = apProcessTypeName[ 0 ];
break;
// timeplay xǐǔ<EFBFBD> 5<EFBFBD>
case 2:
iNumArgument = 5;
pNowProcessorTypeName = apProcessTypeName[ 1 ];
break;
// changeproj xǐǔ<EFBFBD> 2<EFBFBD>
case 3:
iNumArgument = 2;
pNowProcessorTypeName = apProcessTypeName[ 2 ];
break;
// divideseargbytargetnum xǐǔ<EFBFBD> 1<EFBFBD>
case 4:
iNumArgument = 1;
pNowProcessorTypeName = apProcessTypeName[ 3 ];
break;
// impactblow <EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD>
case 5:
iNumArgument = 0;
pNowProcessorTypeName = apProcessTypeName[ 4 ];
break;
// aura xǐǔ<EFBFBD> 1<EFBFBD>
case 6:
iNumArgument = 1;
pNowProcessorTypeName = apProcessTypeName[ 5 ];
break;
// change action xǐǔ<EFBFBD> <EFBFBD>t<EFBFBD>8<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>L<EFBFBD>.
// <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>0<EFBFBD> L<EFBFBD>8<EFBFBD><EFBFBD><EFBFBD> ֬<EFBFBD> l<EFBFBD>p<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>x<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>Ѕ<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><<EFBFBD>t<EFBFBD> H<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
case 7:
bChangeActionStr = true;
//iNumArgument = 7;
//pNowProcessorTypeName = apProcessTypeName[ 6 ];
break;
// RangeStateEffect xǐǔ<EFBFBD> 4<EFBFBD>
case 8:
iNumArgument = 4;
pNowProcessorTypeName = apProcessTypeName[ 7 ];
break;
default:
break;
}
TCHAR atcProcessorTypeName[256];
MultiByteToWideChar( CP_ACP, 0, pNowProcessorTypeName, -1, atcProcessorTypeName, 256 );
for( int i = 0; i < iNumArgument; ++i )
{
_stprintf_s( atcTraceBuf, _T("{TableName:SkillTable, Index:%d, Level:%d, Note:<1C><04><>Ѕ<EFBFBD>(%s) <78>x<EFBFBD>q<EFBFBD><71><EFBFBD>(%d) <78><12>t<EFBFBD> <00>ŵ<EFBFBD>Ȳ<EFBFBD><C8B2>.}"), iSkillTableID, iLevel+1, atcProcessorTypeName, iArgument+1 );
SCOPED_TRACE( atcTraceBuf );
ValidateProcessArgument( iSkillLevelID, iArgument );
++iArgument;
}
++iNowProcessor;
}
}
}
}
void ValidateSemiColonDivide( const char* pArgumentString, int iNumArgument )
{
int iOffset = 0;
int iSemiColonIndex = 0;
string strArgument( pArgumentString );
for( int i = 0; i < iNumArgument; ++i )
{
iOffset = iSemiColonIndex + 1;
iSemiColonIndex = (int)strArgument.find_first_of( ';', iOffset );
bool bInvalid = false;
if( i != iNumArgument-1 )
bInvalid = ( string::npos == iSemiColonIndex ); // <EFBFBD><EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> 8<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD>`<EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ǩ<EFBFBD>t<EFBFBD>|<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>,
else
bInvalid = (strArgument.at( strArgument.length()-1 ) == ';'); // ȹ<EFBFBD><EFBFBD>ɹ x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD> ]<EFBFBD>t<EFBFBD> ; \<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><<EFBFBD>t<EFBFBD> H<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
EXPECT_FALSE( bInvalid );
if( bInvalid )
break;
}
}
// <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>Ŕ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
TEST_F( skill_data_test, STATE_EFFECT_ARGUMENT_VERIFY )
{
int iNumItemCount = SKILL_T->GetItemCount();
for( int iSkill = 0; iSkill < iNumItemCount; ++iSkill )
{
int iSkillTableID = SKILL_T->GetItemID( iSkill );
// <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ǔ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>... \<EFBFBD><EFBFBD> 5<EFBFBD>
bool abUseStateEffect[ MAX_STATE_EFEFCT_COUNT ];
ZeroMemory( abUseStateEffect, sizeof(abUseStateEffect) );
for( int iStateEffect = 0; iStateEffect < MAX_STATE_EFEFCT_COUNT; ++iStateEffect )
{
char acBuf[ 64 ];
sprintf_s( acBuf, "_EffectClass%d", iStateEffect+1 );
if( SKILL_T->GetFieldFromLablePtr( iSkillTableID, acBuf )->GetInteger() != 0 )
abUseStateEffect[ iStateEffect ] = true;
}
vector<int> vlSkillLevelList;
if( SKILL_LEVEL_T->GetItemIDListFromField( "_SkillIndex", iSkillTableID, vlSkillLevelList ) == 0 )
FAIL();
int iNumSkillLevel = (int)vlSkillLevelList.size();
for( int iLevel = 0; iLevel < iNumSkillLevel; ++iLevel )
{
int iSkillLevelID = vlSkillLevelList.at(iLevel);
for( int iStateEffect = 0; iStateEffect < 5; ++iStateEffect )
{
if( abUseStateEffect[ iStateEffect ] )
{
char acBuf[ 64 ];
sprintf_s( acBuf, "_EffectClass%d", iStateEffect+1 );
int iStateEffectIndex = SKILL_T->GetFieldFromLablePtr( iSkillTableID, acBuf )->GetInteger();
sprintf_s( acBuf, "_EffectClassValue%d", iStateEffect+1 );
const char* pArgument = SKILL_LEVEL_T->GetFieldFromLablePtr( iSkillLevelID, acBuf )->GetString();
TCHAR atcBuf[ 256 ] = {0};
// 8<EFBFBD><EFBFBD><EFBFBD> \<EFBFBD>`<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD> /<EFBFBD><EFBFBD><EFBFBD> ޹<EFBFBD><EFBFBD><EFBFBD><EFBFBD> U<EFBFBD>x<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>.
switch( iStateEffectIndex )
{
// <EFBFBD><EFBFBD>Y<EFBFBD>(41) - 2<EFBFBD>
case 41:
{
_stprintf_s( atcBuf, _T("{TableName:SkillLevelTable, Index:%d, Level:%d, Note:<00><>Y<EFBFBD> <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> <78><00> <00>ǻ<EFBFBD><18><>ŵ<EFBFBD>Ȳ<EFBFBD><C8B2>. 8<><38><EFBFBD>\<EFBFBD>`<60>(;) l<><6C><EFBFBD><<3C>\<EFBFBD> (<00><>Y<EFBFBD>U<EFBFBD>`<60>(0.0~1.0);<00><>l<EFBFBD>ij<EFBFBD><C4B3><18>) <00> ޹<><DEB9><EFBFBD><EFBFBD> U<>x<EFBFBD>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>$<24>.}"), iSkillTableID, iLevel+1 );
SCOPED_TRACE( atcBuf );
ValidateSemiColonDivide( pArgument, 2 );
}
break;
// <EFBFBD><EFBFBD>x<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(60) - 3<EFBFBD>
case 60:
{
_stprintf_s( atcBuf, _T("{TableName:SkillLevelTable, Index:%d, Level:%d, Note:<00><>x<EFBFBD><78><EFBFBD><EFBFBD><EFBFBD> <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> <78><00> <00>ǻ<EFBFBD><18><>ŵ<EFBFBD>Ȳ<EFBFBD><C8B2>. 8<><38><EFBFBD>\<EFBFBD>`<60>(;) l<><6C><EFBFBD><<3C>\<EFBFBD> (<00><><04>;\<EFBFBD><00><>׸<EFBFBD>tδƸ<CEB4>;p<><70><EFBFBD><EFBFBD><EFBFBD>ȩ<>D<EFBFBD>(<28>)t<> ޹<><DEB9><EFBFBD><EFBFBD> U<>x<EFBFBD>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>$<24>.}"), iSkillTableID, iLevel+1 );
SCOPED_TRACE( atcBuf );
ValidateSemiColonDivide( pArgument, 3 );
}
break;
// <EFBFBD><EFBFBD>t<EFBFBD>1<EFBFBD> ȹ<EFBFBD><EFBFBD>(68) - 2<EFBFBD>
case 68:
{
_stprintf_s( atcBuf, _T("{TableName:SkillLevelTable, Index:%d, Level:%d, Note:<00><>t<EFBFBD>1<EFBFBD> ȹ<><C8B9> <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> <78><00> <00>ǻ<EFBFBD><18><>ŵ<EFBFBD>Ȳ<EFBFBD><C8B2>. 8<><38><EFBFBD>\<EFBFBD>`<60>(;) l<><6C><EFBFBD><<3C>\<EFBFBD> (ȩ<>U<EFBFBD>`<60>(0.0~1.0);<00><><EFBFBD><EFBFBD>MP <10><><EFBFBD>D<EFBFBD>(<28>(0.0-1.0)) <00> ޹<><DEB9><EFBFBD><EFBFBD> U<>x<EFBFBD>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>$<24>.}"), iSkillTableID, iLevel+1 );
SCOPED_TRACE( atcBuf );
ValidateSemiColonDivide( pArgument, 2 );
}
break;
// <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> t<EFBFBD><EFBFBD><EFBFBD>(77) - 2<EFBFBD>
case 77:
{
_stprintf_s( atcBuf, _T("{TableName:SkillLevelTable, Index:%d, Level:%d, Note:<00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> t<><74><EFBFBD> <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> <78><00> <00>ǻ<EFBFBD><18><>ŵ<EFBFBD>Ȳ<EFBFBD><C8B2>. 8<><38><EFBFBD>\<EFBFBD>`<60>(;) l<><6C><EFBFBD><<3C>\<EFBFBD> (t<><74><EFBFBD> <20> <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> x<>q<EFBFBD><71><EFBFBD>;t<><74><EFBFBD>U<EFBFBD>`<60>(0.0~1.0) <00> ޹<><DEB9><EFBFBD><EFBFBD> U<>x<EFBFBD>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>$<24>.)"), iSkillTableID, iLevel+1 );
SCOPED_TRACE( atcBuf );
ValidateSemiColonDivide( pArgument, 2 );
}
break;
// <EFBFBD><EFBFBD><EFBFBD>Ѽ <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD>(136) - 2<EFBFBD>
case 136:
{
_stprintf_s( atcBuf, _T("{TableName:SkillLevelTable, Index:%d, Level:%d, Note:<00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> <04><><EFBFBD>Ѽ <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> <78><00> <00>ǻ<EFBFBD><18><>ŵ<EFBFBD>Ȳ<EFBFBD><C8B2>. 8<><38><EFBFBD>\<EFBFBD>`<60>(;) l<><6C><EFBFBD><<3C>\<EFBFBD> (p<><70><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>(<28>(0.0~1.0);<04><><EFBFBD> <20> <18><><EFBFBD>)t<> ޹<><DEB9><EFBFBD><EFBFBD> U<>x<EFBFBD>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>$<24>.)"), iSkillTableID, iLevel+1 );
SCOPED_TRACE( atcBuf );
ValidateSemiColonDivide( pArgument, 2 );
}
break;
default:
{
_stprintf_s( atcBuf, _T("{TableName:SkillLevelTable, Index:%d, Level:%d, Note:<00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> <78><00> D<><44>ň<EFBFBD>L<EFBFBD>}"), iSkillTableID, iLevel+1 );
SCOPED_TRACE( atcBuf );
//EXPECT_STRNE( "0", pArgument );
EXPECT_STRNE( "", pArgument );
}
break;
}
}
}
}
}
}
void ValidateSelfApplySESignal( CEtActionBase* pActor, const vector<int>& vlSkills )
{
int iNumSkill = (int)vlSkills.size();
for( int iSkill = 0; iSkill < iNumSkill; ++iSkill )
{
int iSkillTableID = vlSkills.at(iSkill);
// <EFBFBD>¬<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>0<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ō<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD>.
deque<int> dqSelfApplyStateEffect;
// <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> p<EFBFBD>t<EFBFBD>0<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>. \<EFBFBD><EFBFBD> 5<EFBFBD>
bool abUseStateEffect[ MAX_STATE_EFEFCT_COUNT ];
ZeroMemory( abUseStateEffect, sizeof(abUseStateEffect) );
for( int iStateEffect = 0; iStateEffect < MAX_STATE_EFEFCT_COUNT; ++iStateEffect )
{
char StateEffectName[ 64 ];
char StateEffectTarget[ 64 ];
sprintf_s( StateEffectName, "_EffectClass%d", iStateEffect+1 );
sprintf_s( StateEffectTarget, "_EffectClass%dApplyType", iStateEffect+1 );
int iStateEffectIndex = SKILL_T->GetFieldFromLablePtr( iSkillTableID, StateEffectName )->GetInteger();
if( iStateEffectIndex != 0 )
{
//<EFBFBD><EFBFBD>0<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ō<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD>̹ <EFBFBD><EFBFBD>|<EFBFBD>İ (CDnSkill::StateEffectApplyType::ApplySelf or CDnSkill::StateEffectApplyType::ApplyAll)
if( SKILL_T->GetFieldFromLablePtr( iSkillTableID, StateEffectTarget )->GetInteger() == 0 ||
SKILL_T->GetFieldFromLablePtr( iSkillTableID, StateEffectTarget )->GetInteger() == 2 )
{
abUseStateEffect[ iStateEffect ] = true;
dqSelfApplyStateEffect.push_back( iStateEffectIndex );
}
}
}
int aiUseProcessorType[ 5 ];
ZeroMemory( aiUseProcessorType, sizeof(aiUseProcessorType) );
for( int iProcessor = 0; iProcessor < MAX_PROCESSOR; ++iProcessor )
{
char acBuf[ 64 ];
sprintf_s( acBuf, "_Processor%d", iProcessor+1 );
int iUseType = SKILL_T->GetFieldFromLablePtr( iSkillTableID, acBuf )->GetInteger();
aiUseProcessorType[ iProcessor ] = iUseType;
}
vector<int> vlSkillLevelList;
if( SKILL_LEVEL_T->GetItemIDListFromField( "_SkillIndex", iSkillTableID, vlSkillLevelList ) == 0 )
FAIL();
int iNumSkillLevel = (int)vlSkillLevelList.size();
if( 0 == iNumSkillLevel )
continue;
for( int iLevel = 0; iLevel < 1; ++iLevel ) // t<EFBFBD>t<EFBFBD> <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD>X<EFBFBD> 0<EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>0<EFBFBD> L<EFBFBD>8<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ļ\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
{
bool abUseStateEffectInLevel[ MAX_STATE_EFEFCT_COUNT ];
memcpy( abUseStateEffectInLevel, abUseStateEffect, sizeof(abUseStateEffect) );
int iNowProcessor = 0;
int iSkillLevelID = vlSkillLevelList.at( iLevel );
for( int iArgument = 0; iArgument < 10; )
{
if( MAX_STATE_EFEFCT_COUNT == iNowProcessor )
break;
if( 0 == aiUseProcessorType[ iNowProcessor ] )
{
++iNowProcessor;
continue;
}
int iNumArgument = 0;
switch( aiUseProcessorType[ iNowProcessor ] )
{
// playani xǐǔ<EFBFBD> 1<EFBFBD>
case 1:
{
iNumArgument += 1;
char acBuf[ 128 ];
sprintf_s( acBuf, "_ProcessParam%d", iArgument+1 );
const char* pArgument = SKILL_LEVEL_T->GetFieldFromLablePtr( iSkillLevelID, acBuf )->GetString();
CEtActionBase::ActionElementStruct* pActionElement = pActor->GetElement( pArgument );
//EXPECT_TRUE( NULL != pActionElement );
if( NULL == pActionElement )
break;
TCHAR atcBuf[ 512 ];
int iApplyStateEffectSignalCount = 0;
bool bHasApplySelfStateSignal = false;
int iNumSignal = (int)pActionElement->pVecSignalList.size();
for( int iSignal = 0; iSignal < iNumSignal; ++iSignal )
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ō<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> X՘<EFBFBD>ij <EFBFBD><EFBFBD><<EFBFBD>t<EFBFBD> <EFBFBD>‘<EFBFBD><EFBFBD>ȹ<EFBFBD><EFBFBD> ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
CEtActionSignal* pSignal = pActionElement->pVecSignalList.at( iSignal );
if( STE_ApplyStateEffect == pSignal->GetSignalIndex() )
{
++iApplyStateEffectSignalCount;
bHasApplySelfStateSignal = true;
void* pData = pSignal->GetData();
ApplyStateEffectStruct* pSESignal = static_cast<ApplyStateEffectStruct*>(pData);
{
_stprintf_s( atcBuf, _T("{TableName:SkillTable, Index:%d, SkillLevel:%d, <00><>%<25><12>:%d, Note:<00><><EFBFBD><EFBFBD><EFBFBD>Ō<EFBFBD> <00><><EFBFBD><EFBFBD><58> <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> \<EFBFBD><00> <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> x<>q<EFBFBD><71><EFBFBD> <00><><EFBFBD>Ũ<EFBFBD>.}"), iSkillTableID, iLevel+1, pSESignal->StateEffectIndex );
SCOPED_TRACE( atcBuf );
EXPECT_LT( pSESignal->StateEffectIndex, MAX_STATE_EFEFCT_COUNT );
}
{
_stprintf_s( atcBuf,_T("{TableName:SkillTable, Index:%d, SkillLevel:%d, <00><>%<25><12>:%d, Note:<00><><EFBFBD><EFBFBD><EFBFBD>Ō<EFBFBD> <00><><EFBFBD><EFBFBD><58> <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> <00><>%<25><1C> <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> /<2F><18><><EFBFBD><EFBFBD><EFBFBD> p<> x<>q<EFBFBD><71>„<EFBFBD>.}"), iSkillTableID, iLevel+1, pSESignal->StateEffectIndex );
SCOPED_TRACE( atcBuf );
EXPECT_LT( pSESignal->StateEffectIndex, (int)dqSelfApplyStateEffect.size() );
}
{
_stprintf_s( atcBuf,_T("{TableName:SkillTable, Index:%d, SkillLevel:%d, <00><>%<25><12>:%d, Note:<00><>0<EFBFBD> <00><><EFBFBD><EFBFBD><EFBFBD>Ō<EFBFBD> <00><><EFBFBD><EFBFBD><58> <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> x<>q<EFBFBD><71><EFBFBD> <00><><04> <00><><EFBFBD>Ũ<EFBFBD>.}"), iSkillTableID, iLevel+1, pSESignal->StateEffectIndex );
SCOPED_TRACE( atcBuf );
EXPECT_EQ( true, abUseStateEffectInLevel[pSESignal->StateEffectIndex] );
}
if( abUseStateEffectInLevel[ pSESignal->StateEffectIndex ] )
abUseStateEffectInLevel[ pSESignal->StateEffectIndex ] = false;
}
}
if( bHasApplySelfStateSignal )
{
_stprintf_s( atcBuf,_T("{TableName:SkillTable, Index:%d, SkillLevel:%d, Note:<00><>0<EFBFBD> <00><><EFBFBD><EFBFBD><EFBFBD>Ō<EFBFBD> <00><><EFBFBD><EFBFBD><58> <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> x<>q<EFBFBD><71><EFBFBD>|<7C> <00><>P<EFBFBD> ȩ<>X<EFBFBD><58><EFBFBD> J<>L<EFBFBD>.}"), iSkillTableID, iLevel+1 );
//_stprintf_s( atcBuf,_T("[<00><><EFBFBD><EFBFBD><EFBFBD>Ō<EFBFBD> <00><><EFBFBD><EFBFBD><58> <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> SkillID: %d, SkillLevel: %d] <00><>0<EFBFBD> <00><><EFBFBD><EFBFBD><EFBFBD>Ō<EFBFBD> <00><><EFBFBD><EFBFBD><58> <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD> x<>q<EFBFBD><71><EFBFBD>|<7C> <00><>P<EFBFBD> ȩ<>X<EFBFBD><58><EFBFBD> J<>L<EFBFBD>."), iSkillTableID, iLevel+1 );
SCOPED_TRACE( atcBuf );
EXPECT_EQ( iApplyStateEffectSignalCount, (int)dqSelfApplyStateEffect.size() );
}
}
break;
// timeplay xǐǔ<EFBFBD> 5<EFBFBD>
case 2:
iNumArgument += 5;
break;
// changeproj xǐǔ<EFBFBD> 2<EFBFBD>
case 3:
iNumArgument += 2;
break;
// divideseargbytargetnum xǐǔ<EFBFBD> 1<EFBFBD>
case 4:
iNumArgument += 1;
break;
// impactblow <EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD>
case 5:
iNumArgument += 0;
break;
// aura xǐǔ<EFBFBD> 1<EFBFBD>
case 6:
iNumArgument += 1;
break;
// change action ֬ǔ<EFBFBD> <EFBFBD> 7<EFBFBD><EFBFBD><EFBFBD>
case 7:
iNumArgument += 7;
break;
default:
break;
}
++iNowProcessor;
}
}
}
}
// <EFBFBD><EFBFBD>0<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ō<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>X<EFBFBD>4<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> K<EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD>ňǔ<EFBFBD><EFBFBD><EFBFBD>.
TEST_F( skill_data_test, SELF_STATE_EFFECT_SIGNAL_VERIFY )
{
// <EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>έ<EFBFBD>0<EFBFBD> ļ\<EFBFBD> U<EFBFBD>x<EFBFBD>.
// t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ޹<<EFBFBD>p<EFBFBD> PlayAni <EFBFBD><EFBFBD> <EFBFBD>Ѕ<EFBFBD>t<EFBFBD> <EFBFBD>ǔ<EFBFBD> <EFBFBD>¬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
// <EFBFBD>Ƭ<EFBFBD><EFBFBD>Ŕ<EFBFBD> <EFBFBD>¬<EFBFBD> D<EFBFBD>t<EFBFBD><EFBFBD> 0~
// D<EFBFBD><EFBFBD>̔<EFBFBD> 1000~
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>”<EFBFBD> 2000~
// t<EFBFBD><EFBFBD>@<EFBFBD> 3000~
vector<int> vlPlayAniSkills[ 4 ];
int iNowPlayerTypeIndex = 0;
int iNumItemCount = SKILL_T->GetItemCount();
for( int iSkill = 0; iSkill < iNumItemCount; ++iSkill )
{
int iSkillTableID = SKILL_T->GetItemID( iSkill );
iNowPlayerTypeIndex = iSkillTableID / 1000;
if( 4 <= iNowPlayerTypeIndex )
break;
// PlayAni <EFBFBD><EFBFBD> <EFBFBD>Ѕ<EFBFBD>t<EFBFBD> <EFBFBD>ǔ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
int aiUseProcessorType[ 5 ];
ZeroMemory( aiUseProcessorType, sizeof(aiUseProcessorType) );
for( int iProcessor = 0; iProcessor < MAX_PROCESSOR; ++iProcessor )
{
char acBuf[ 64 ];
sprintf_s( acBuf, "_Processor%d", iProcessor+1 );
int iUseType = SKILL_T->GetFieldFromLablePtr( iSkillTableID, acBuf )->GetInteger();
if( 1 == iUseType )
vlPlayAniSkills[iNowPlayerTypeIndex].push_back( iSkillTableID );
}
}
ValidateSelfApplySESignal( skill_data_test::s_pWarrior, vlPlayAniSkills[ 0 ] );
ValidateSelfApplySESignal( skill_data_test::s_pArcher, vlPlayAniSkills[ 1 ] );
ValidateSelfApplySESignal( skill_data_test::s_pSoceress, vlPlayAniSkills[ 2 ] );
ValidateSelfApplySESignal( skill_data_test::s_pCleric, vlPlayAniSkills[ 3 ] );
}
TEST_F( skill_data_test, SKILLBOOK_ITEM_ID_VERIFY )
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>¬<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> ̳t<EFBFBD><EFBFBD> <EFBFBD>ǻ<EFBFBD><EFBFBD> <EFBFBD>¬Ё<EFBFBD> itemid |<EFBFBD> ȴœ<EFBFBD>@<EFBFBD> <EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD>ǘ<EFBFBD> U<EFBFBD>x<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>.
// <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>¬<EFBFBD> ID <EFBFBD><EFBFBD> 4000 t<EFBFBD>X<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> 4000 L<EFBFBD><EFBFBD><EFBFBD>̹ ȳ<EFBFBD><EFBFBD>.
TCHAR atcBuf[ 512 ];
for( int i = 0; i < SKILL_T->GetItemCount(); ++i )
{
int iSkillID = SKILL_T->GetItemID( i );
if( iSkillID > 4000 )
break;
int iSkillBookItemID = SKILL_T->GetFieldFromLablePtr( iSkillID, "_UnlockSkillBookItemID" )->GetInteger();
if( 0 != iSkillBookItemID )
{
set<int>::iterator iter = skill_data_test::s_setSkillBookItemID.find( iSkillBookItemID );
if( skill_data_test::s_setSkillBookItemID.end() != iter )
skill_data_test::s_setSkillBookItemID.erase( iter );
else
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>¬<EFBFBD>D<EFBFBD> <EFBFBD> <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD>ij <EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹ ̹}<EFBFBD> D<EFBFBD>t<EFBFBD>\<EFBFBD> L<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>
// <EFBFBD>¬<EFBFBD> L<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>@<EFBFBD> <EFBFBD>¬Ё<EFBFBD> D<EFBFBD>t<EFBFBD>\<EFBFBD> <EFBFBD>Ĕ<EFBFBD> <EFBFBD>¬<EFBFBD>t<EFBFBD> P<EFBFBD> <EFBFBD> t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ň<EFBFBD><EFBFBD> t<EFBFBD>|<EFBFBD>0<EFBFBD>.
_stprintf_s( atcBuf,_T("{TableName:SkillTable, Index:%d, Note:t<><74><EFBFBD> <00>¬<EFBFBD>D<EFBFBD> <78> <00>¬Ё<C2AC>t<EFBFBD> <00>ŵ<EFBFBD>Ȳ<EFBFBD><C8B2>.}"), iSkillID );
SCOPED_TRACE( atcBuf );
EXPECT_TRUE( false );
}
}
}
for( set<int>::iterator iter = skill_data_test::s_setSkillBookItemID.begin();
iter != skill_data_test::s_setSkillBookItemID.end(); ++iter )
{
_stprintf_s( atcBuf,_T("{TableName:ItemTable, Index:%d, Note:<00><><EFBFBD><EFBFBD><18><><EFBFBD> <4A> <00>¬Ё<C2AC> D<>t<EFBFBD>\<EFBFBD> ID.}"), *iter );
SCOPED_TRACE( atcBuf );
EXPECT_TRUE( false );
}
}