#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 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 ); // ½ºÅ³ºÏ ŸÀÔÀº 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 ); // ÇÁ·Î±×·¥ Á¾·áµÉ ¶§ ActionCoreMng ¿¡¼­ »¸³× ¤Ð¤Ð // ÀÏ´Ü delete ÇÏÁö ¾Ê°í ³¡³¿.. //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(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 ]; // 1ÀÌ ÆÐ½Ãºê ½ºÅ³ÀÓ 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 ¹øÀÌ PlayAni ZeroMemory( atcBuf, sizeof(atcBuf) ); _stprintf_s( atcBuf, _T("{TableName:SkillTable, Index:%d, Note:ÆÐ½Ãºê ½ºÅ³Àº ¾×¼ÇÅø¿¡¼­ Á÷Á¢ InputHasPassiveSkill ·Î 󸮵˴ϴÙ...}"), 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 ¹ßÇö ŸÀÔ¿¡ ÀÎÀÚ°¡ Á¦´ë·Î ¾ø´Â °æ¿ì 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 ¹ßÇö ŸÀÔÀÌ ÀÖ´Â °æ¿ì. 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 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; // ¾×¼Ç ¹®ÀÚ¿­ º¯°æ ¹ßÇöŸÀÔÀº °¡º¯ÀÎÀڱ⠶§¹®¿¡ °¹¼ö ÃßÃøÀÌ ¾ÈµÊ. int iNowProcessor = 0; int iSkillLevelID = vlSkillLevelList.at( iLevel ); for( int iArgument = 0; iArgument < 10; ) { // ¹ßÇöŸÀÔ ¼³Á¤ ÃÖ´ë °¹¼ö´Â 5°³ÀÓ. if( MAX_PROCESSOR == iNowProcessor ) break; // NONE À¸·Î ¼ÂÆÃµÇ¾î ÀÖÀ¸¸é ´ÙÀ½ À妽º·Î ÆÐ½º if( 0 == aiUseProcessorType[ iNowProcessor ] ) { ++iNowProcessor; continue; } TCHAR atcTraceBuf[ 1024 ]; if( bChangeActionStr ) { _stprintf_s( atcTraceBuf, _T("{TableName:SkillTable, Index:%d, Level:%d, Note:ChangeActionStr ¹ßÇö ŸÀÔ ´ÙÀ½¿¡ ´Ù¸¥ ¹ßÇöŸÀÔÀÌ ¿À¸é ¾ÈµË´Ï´Ù.}"), iSkillTableID, iLevel+1 ); EXPECT_TRUE( bChangeActionStr ); } ZeroMemory( atcTraceBuf, sizeof(atcTraceBuf) ); const char* pNowProcessorTypeName = NULL; int iNumArgument = 0; switch( aiUseProcessorType[ iNowProcessor ] ) { // playani ÀÎÀÚ´Â 1°³ case 1: iNumArgument = 1; pNowProcessorTypeName = apProcessTypeName[ 0 ]; break; // timeplay ÀÎÀÚ´Â 5°³ case 2: iNumArgument = 5; pNowProcessorTypeName = apProcessTypeName[ 1 ]; break; // changeproj ÀÎÀÚ´Â 2°³ case 3: iNumArgument = 2; pNowProcessorTypeName = apProcessTypeName[ 2 ]; break; // divideseargbytargetnum ÀÎÀÚ´Â 1°³ case 4: iNumArgument = 1; pNowProcessorTypeName = apProcessTypeName[ 3 ]; break; // impactblow ÀÎÀÚ ¾øÀ½ case 5: iNumArgument = 0; pNowProcessorTypeName = apProcessTypeName[ 4 ]; break; // aura ÀÎÀÚ´Â 1°³ case 6: iNumArgument = 1; pNowProcessorTypeName = apProcessTypeName[ 5 ]; break; // change action ÀÎÀÚ´Â Á¤ÇØÁ® ÀÖÁö ¾ÊÀ½. // ÀÎÀÚ°¡ °¡º¯À̱⠶§¹®¿¡ ÇöÀç ±¸Á¶»ó µÚ¿¡ ´Ù¸¥ ¹ßÇö ŸÀÔÀÌ ÀÖÀ¸¸é ¾ÈµÈ´Ù. case 7: bChangeActionStr = true; //iNumArgument = 7; //pNowProcessorTypeName = apProcessTypeName[ 6 ]; break; // RangeStateEffect ÀÎÀÚ´Â 4°³ 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:¹ßÇöŸÀÔ(%s) ÀÎÀÚÀ妽º(%d) ÀÎÀÚ°ªÀÌ ¾ø½À´Ï´Ù.}"), 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 ); // Áß°£ À妽º¿¡¼± ¼¼¹ÌÄÝ·Ð À妽º°¡ À¯È¿ÇؾßÇϰí, else bInvalid = (strArgument.at( strArgument.length()-1 ) == ';'); // ¸¶Áö¸· À妽º¿¡¼± ¸Ç ³¡ÀÌ ; ·Î ³²¾ÆÀÖÀ¸¸é ¾ÈµÈ´Ù. EXPECT_FALSE( bInvalid ); if( bInvalid ) break; } } // »óÅÂÈ¿°úÀÇ ÀÎÀÚ°¡ ¾ø´Â °æ¿ì.. 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 ); // »óÅÂÈ¿°ú°¡ ÀÖ´Â °æ¿ì... ÃÖ´ë 5°³ 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 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}; // ¼¼¹Ì ÄÝ·Ð µé¾î°£ »óÅÂÈ¿°ú´Â Á¦´ë·Î ÀÎÀÚ °¹¼ö°¡ ¸Â´ÂÁö È®ÀÎÇÑ´Ù. switch( iStateEffectIndex ) { // °áºù(41) - 2°³ case 41: { _stprintf_s( atcBuf, _T("{TableName:SkillLevelTable, Index:%d, Level:%d, Note:°áºù »óÅÂÈ¿°ú ÀÎÀÚ°¡ À߸øµÇ¾ú½À´Ï´Ù. ¼¼¹ÌÄÝ·Ð(;) ±¸ºÐÀ¸·Î (°áºùÈ®·ü(0.0~1.0);³»±¸µµÈ½¼ö) °¡ ¸Â´ÂÁö È®ÀÎÇØÁֽʽÿÀ.}"), iSkillTableID, iLevel+1 ); SCOPED_TRACE( atcBuf ); ValidateSemiColonDivide( pArgument, 2 ); } break; // üÀΰø°Ý(60) - 3°³ case 60: { _stprintf_s( atcBuf, _T("{TableName:SkillLevelTable, Index:%d, Level:%d, Note:üÀΰø°Ý »óÅÂÈ¿°ú ÀÎÀÚ°¡ À߸øµÇ¾ú½À´Ï´Ù. ¼¼¹ÌÄÝ·Ð(;) ±¸ºÐÀ¸·Î (¹üÀ§;ÃÖ´ëÈ÷Ʈī¿îÆ®;µ¥¹ÌÁöÀû¿ëºñÀ²)ÀÌ ¸Â´ÂÁö È®ÀÎÇØÁֽʽÿÀ.}"), iSkillTableID, iLevel+1 ); SCOPED_TRACE( atcBuf ); ValidateSemiColonDivide( pArgument, 3 ); } break; // ÆäÀÌ¹é ¸¶³ª(68) - 2°³ case 68: { _stprintf_s( atcBuf, _T("{TableName:SkillLevelTable, Index:%d, Level:%d, Note:ÆäÀÌ¹é ¸¶³ª »óÅÂÈ¿°ú ÀÎÀÚ°¡ À߸øµÇ¾ú½À´Ï´Ù. ¼¼¹ÌÄÝ·Ð(;) ±¸ºÐÀ¸·Î (Àû¿ëÈ®·ü(0.0~1.0);¼Ò¸ðMP °¨¼ÒºñÀ²(0.0-1.0)) °¡ ¸Â´ÂÁö È®ÀÎÇØÁֽʽÿÀ.}"), iSkillTableID, iLevel+1 ); SCOPED_TRACE( atcBuf ); ValidateSemiColonDivide( pArgument, 2 ); } break; // »óÅÂÈ¿°ú ¸é¿ª(77) - 2°³ case 77: { _stprintf_s( atcBuf, _T("{TableName:SkillLevelTable, Index:%d, Level:%d, Note:»óÅÂÈ¿°ú ¸é¿ª »óÅÂÈ¿°ú ÀÎÀÚ°¡ À߸øµÇ¾ú½À´Ï´Ù. ¼¼¹ÌÄÝ·Ð(;) ±¸ºÐÀ¸·Î (¸é¿ªµÉ »óÅÂÈ¿°ú À妽º;¸é¿ªÈ®·ü(0.0~1.0) °¡ ¸Â´ÂÁö È®ÀÎÇØÁֽʽÿÀ.)"), iSkillTableID, iLevel+1 ); SCOPED_TRACE( atcBuf ); ValidateSemiColonDivide( pArgument, 2 ); } break; // Àü¿°º´ »óÅÂÈ¿°ú(136) - 2°³ case 136: { _stprintf_s( atcBuf, _T("{TableName:SkillLevelTable, Index:%d, Level:%d, Note:»óÅÂÈ¿°ú Àü¿°º´ »óÅÂÈ¿°ú ÀÎÀÚ°¡ À߸øµÇ¾ú½À´Ï´Ù. ¼¼¹ÌÄÝ·Ð(;) ±¸ºÐÀ¸·Î (µ¥¹ÌÁöºñÀ²(0.0~1.0);Àü¿°µÉ ¹Ý°æ)ÀÌ ¸Â´ÂÁö È®ÀÎÇØÁֽʽÿÀ.)"), iSkillTableID, iLevel+1 ); SCOPED_TRACE( atcBuf ); ValidateSemiColonDivide( pArgument, 2 ); } break; default: { _stprintf_s( atcBuf, _T("{TableName:SkillLevelTable, Index:%d, Level:%d, Note:»óÅÂÈ¿°ú ÀÎÀÚ°¡ ºñ¾îÀÖÀ½}"), iSkillTableID, iLevel+1 ); SCOPED_TRACE( atcBuf ); //EXPECT_STRNE( "0", pArgument ); EXPECT_STRNE( "", pArgument ); } break; } } } } } } void ValidateSelfApplySESignal( CEtActionBase* pActor, const vector& vlSkills ) { int iNumSkill = (int)vlSkills.size(); for( int iSkill = 0; iSkill < iNumSkill; ++iSkill ) { int iSkillTableID = vlSkills.at(iSkill); // ½ºÅ³¿¡¼­ »ç¿ëÇÏ´Â ÀÚ±â Àڽſ¡°Ô »ç¿ëÇÏ´Â »óÅÂÈ¿°ú. deque dqSelfApplyStateEffect; // »óÅÂÈ¿°ú µ¥ÀÌÅÍ ±Ü¾î¿È. ÃÖ´ë 5°³ 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 ) { //ÀÚ±â Àڽſ¡°Ô »ç¿ëÇÏ´Â »óÅÂÈ¿°ú¸¸ °ñ¶ó³¿ (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 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 ) // ÀÌ°Ç ½ºÅ³ Á¾·ù ±âÁØÀ¸·Î °ËÁõÇϱ⠶§¹®¿¡ ·¹º§º°·Î °ËÁõÇÒ ÇÊ¿ä ¾ø´Ù. { 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 ÀÎÀÚ´Â 1°³ 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 ) { // Àڽſ¡°Ô »ç¿ëÇÏ´Â »óÅÂÈ¿°ú ŸÀÌ¹Ö ½Ã±×³ÎÀÌ Çϳªµµ ¾øÀ¸¸é ½ÃÀÛÇÏÀÚ¸¶ÀÚ Àû¿ëµÇ´Â °ÍÀ̹ǷΠÅë°ú. CEtActionSignal* pSignal = pActionElement->pVecSignalList.at( iSignal ); if( STE_ApplyStateEffect == pSignal->GetSignalIndex() ) { ++iApplyStateEffectSignalCount; bHasApplySelfStateSignal = true; void* pData = pSignal->GetData(); ApplyStateEffectStruct* pSESignal = static_cast(pData); { _stprintf_s( atcBuf, _T("{TableName:SkillTable, Index:%d, SkillLevel:%d, ÀԷ°ª:%d, Note:Àڽſ¡°Ô »ç¿ëÇÏ´Â »óÅÂÈ¿°ú ÃÖ´ë »óÅÂÈ¿°ú À妽º ¹þ¾î³².}"), 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, ÀԷ°ª:%d, Note:Àڽſ¡°Ô »ç¿ëÇÏ´Â »óÅÂÈ¿°ú ÀÔ·ÂµÈ »óÅÂÈ¿°ú °¹¼öº¸´Ù Å« À妽ºÀÓ.}"), 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, ÀԷ°ª:%d, Note:ÀÚ±â Àڽſ¡°Ô »ç¿ëÇÏ´Â »óÅÂÈ¿°ú À妽º ¹üÀ§ ¹þ¾î³².}"), 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:ÀÚ±â Àڽſ¡°Ô »ç¿ëÇÏ´Â »óÅÂÈ¿°ú À妽º¸¦ ¸ðµÎ Àû¿ëÇÏÁö ¾ÊÀ½.}"), iSkillTableID, iLevel+1 ); //_stprintf_s( atcBuf,_T("[Àڽſ¡°Ô »ç¿ëÇÏ´Â »óÅÂÈ¿°ú SkillID: %d, SkillLevel: %d] ÀÚ±â Àڽſ¡°Ô »ç¿ëÇÏ´Â »óÅÂÈ¿°ú À妽º¸¦ ¸ðµÎ Àû¿ëÇÏÁö ¾ÊÀ½."), iSkillTableID, iLevel+1 ); SCOPED_TRACE( atcBuf ); EXPECT_EQ( iApplyStateEffectSignalCount, (int)dqSelfApplyStateEffect.size() ); } } break; // timeplay ÀÎÀÚ´Â 5°³ case 2: iNumArgument += 5; break; // changeproj ÀÎÀÚ´Â 2°³ case 3: iNumArgument += 2; break; // divideseargbytargetnum ÀÎÀÚ´Â 1°³ case 4: iNumArgument += 1; break; // impactblow ÀÎÀÚ ¾øÀ½ case 5: iNumArgument += 0; break; // aura ÀÎÀÚ´Â 1°³ case 6: iNumArgument += 1; break; // change action ÇöÀç´Â ÀÎÀÚ 7°³ÀÓ case 7: iNumArgument += 7; break; default: break; } ++iNowProcessor; } } } } // ÀÚ±â Àڽſ¡°Ô »ç¿ëÇÏ´Â »óÅÂÈ¿°ú°¡ ¾×¼ÇÅø¿¡ Àß ¼ÂÆÃÀÌ µÇ¾îÀÖ´ÂÁö. TEST_F( skill_data_test, SELF_STATE_EFFECT_SIGNAL_VERIFY ) { // °¢ Ç÷¹À̾î ij¸¯ÅÍ º°·Î È®ÀÎ. // ÇØ´ç Á÷¾÷¿¡ ¸ÂÀ¸¸ç PlayAni ¹ßÇö ŸÀÔÀÌ ÀÖ´Â ½ºÅ³µéÁß¿¡, // ¿ö¸®¾î´Â ½ºÅ³ ¾ÆÀ̵ð 0~ // ¾ÆÃÄ´Â 1000~ // ¼Ò¼­¸®½º´Â 2000~ // Ŭ·¯¸¯Àº 3000~ vector 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 ¹ßÇö ŸÀÔÀÌ ÀÖ´Â °æ¿ì. 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 ) { // ¸ðµç Ç÷¹ÀÌ¾î ½ºÅ³µéÀÇ ·çÇÁ¸¦ µ¹¸é¼­ À߸øµÈ ½ºÅ³ºÏ itemid ¸¦ Àû¾î³õÀº °ÍÀÌ ÀÖ³ª È®ÀÎÇÑ´Ù. // Ç÷¹ÀÌ¾î ½ºÅ³ ID ´Â 4000 ÀÌÇÏÀ̹ǷΠ4000 ±îÁö¸¸ µ·´Ù. 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::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 { // ÁøÂ¥·Î ÇØ´ç ½ºÅ³À» Ǫ´Â ½ºÅ³ ºÏÀÌ ¾øÀ» ¼öµµ ÀÖÁö¸¸ ¸¸¾à ¾ÆÀÌÅÛ Å×ÀÌºí¿¡ ÀÖ´Ù¸é // ½ºÅ³ Å×ÀÌºí¿¡¼­ °°Àº ½ºÅ³ºÏ ¾ÆÀÌÅÛ ¾²´Â ½ºÅ³ÀÌ µÎ °³ ÀÌ»ó Áߺ¹µÇ¾îÀÖ´Ù´Â À̾߱â. _stprintf_s( atcBuf,_T("{TableName:SkillTable, Index:%d, Note:ÇØ´ç ½ºÅ³À» Ǫ´Â ½ºÅ³ºÏÀÌ ¾ø½À´Ï´Ù.}"), iSkillID ); SCOPED_TRACE( atcBuf ); EXPECT_TRUE( false ); } } } for( set::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:»ç¿ëµÇÁö ¾Ê´Â ½ºÅ³ºÏ ¾ÆÀÌÅÛ ID.}"), *iter ); SCOPED_TRACE( atcBuf ); EXPECT_TRUE( false ); } }