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

169 lines
No EOL
5.6 KiB
C++

#include "StdAfx.h"
#include "gachapon_test.h"
#include "DnCommonDef.h"
DNTableFileFormat* gachapon_test::s_pItemTable = NULL;
DNTableFileFormat* gachapon_test::s_pGachaTable = NULL;
DNTableFileFormat* gachapon_test::s_pItemDropTable = NULL;
DNTableFileFormat* gachapon_test::s_pPartsTable = NULL;
#define ITEM_T gachapon_test::s_pItemTable
#define GACHA_T gachapon_test::s_pGachaTable
#define ITEMDROP_T gachapon_test::s_pItemDropTable
#define PARTS_T gachapon_test::s_pPartsTable
// 현재 가차폰 테이블에 정의되어있는 파츠 갯수
const int NUM_GACHA_PARTS = 6;
gachapon_test::gachapon_test(void)
{
}
gachapon_test::~gachapon_test(void)
{
}
void gachapon_test::SetUpTestCase( void )
{
// 지정된 국가 우선으로 검색하고 없으면 기본 리소스 폴더에서 찾는다.
// ItemTable_Quest, ItemTable_Event, ItemTable_Equipment, ItemTable_Cash 시리즈별로 모두 모아서 로드 됨.
s_pItemTable = LoadExtFile( "ItemTable.dnt" );
s_pGachaTable = LoadExtFile( "GachaJP.dnt", "_GachaNum" );
s_pItemDropTable = LoadExtFile( "ItemDropTable.dnt" );
// PartsTable_Event, PartsTable_Equipment, PartsTable_Cash 시리즈 전부 모아서 로드 됨.
s_pPartsTable = LoadExtFile( "PartsTable.dnt" );
}
void gachapon_test::TearDownTestCase( void )
{
SAFE_DELETE( s_pItemTable );
SAFE_DELETE( s_pGachaTable );
SAFE_DELETE( s_pItemDropTable );
SAFE_DELETE( s_pPartsTable );
}
void gachapon_test::SetUp( void )
{
}
void gachapon_test::TearDown( void )
{
}
TEST_F( gachapon_test, GACHAPON_RESULT_ITEM_MATCH_JOB )
{
// 일본과 대만인 경우에만 수행.
if( false == ( g_strNation == _T("JPN") || g_strNation == _T("TWN") ) )
return;
char acBuffer[ 256 ] = { 0 };
// 가챠폰 테이블을 뒤져서 존재하는 샵 아이디를 다 받아온다.
vector<int> vlShopIDs;
set<int> setShopIDs;
for( int i = 0; i < GACHA_T->GetItemCount(); ++i )
{
int iItemID = GACHA_T->GetItemID( i );
vlShopIDs.push_back( GACHA_T->GetFieldFromLablePtr( iItemID, "_GachaNum" )->GetInteger() );
setShopIDs.insert( vlShopIDs.back() );
}
TCHAR atcBuf[ 256 ] = { 0 };
{
_stprintf_s( atcBuf, _T("{GachaShopID:%d, Note:가챠폰 샵 아이디는 직업별로 4개가 되어야 합니다.}"), vlShopIDs.front() );
SCOPED_TRACE( atcBuf );
EXPECT_TRUE( (vlShopIDs.size() % 4) == 0 );
}
set<int>::iterator iter = setShopIDs.begin();
for( iter; iter != setShopIDs.end(); ++iter )
{
int iShopID = *iter;
// 드랍 그룹 테이블을 디벼서 나올 수 있는 모든 아이템들을 모아둔다.
vector<int> vlGachaTableIDs;
GACHA_T->GetItemIDListFromField( "_GachaNum", iShopID, vlGachaTableIDs );
// 같은 가챠폰 번호 안에서는 반드시 위에서 아래로 직업 클래스 아이디 순으로 데이터가 입력되어야 합니다!!
int iNumTableIDs = (int)vlGachaTableIDs.size();
for( int iTableID = 0; iTableID < iNumTableIDs; ++iTableID )
{
int iGachaTableID = vlGachaTableIDs.at( iTableID );
int iNeedJobClassID = iTableID+1;
for( int iPart = 0; iPart < NUM_GACHA_PARTS; ++iPart )
{
sprintf_s( acBuffer, "_LinkedDrop%d", iPart+1 );
int iLinkedDropTableID = GACHA_T->GetFieldFromLablePtr( iGachaTableID, acBuffer )->GetInteger();
if( 0 == iLinkedDropTableID || 1 == iLinkedDropTableID ) // 없는 테이블 레이블로 찾으면 1이 나옴...(??)
continue;
// TODO: 드랍 테이블 재귀값은 8단계 까지임.. 추후에 필요하면 처리해야 엄청난 루프에 빠지지 않음.
vector<int> vlToCalcDropTableIDs;
vlToCalcDropTableIDs.push_back( iLinkedDropTableID );
for( int i = 0; i < (int)vlToCalcDropTableIDs.size(); ++i )
{
int iDropTableID = vlToCalcDropTableIDs.at( i );
// 드랍테이블은 항목이 20개
for( int iLabel = 0; iLabel <= 20; ++iLabel )
{
sprintf_s( acBuffer, "_IsGroup%d", iLabel );
int iIsGroup = ITEMDROP_T->GetFieldFromLablePtr( iDropTableID, acBuffer )->GetInteger();
if( iIsGroup == 1 )
{
sprintf_s( acBuffer, "_Item%dIndex", iLabel );
int iReferenceDropTableID = ITEMDROP_T->GetFieldFromLablePtr( iDropTableID, acBuffer )->GetInteger();
if( 0 == iReferenceDropTableID )
continue;
vlToCalcDropTableIDs.push_back( iReferenceDropTableID );
}
else
{
sprintf_s( acBuffer, "_Item%dIndex", iLabel );
int iItemTableID = ITEMDROP_T->GetFieldFromLablePtr( iDropTableID, acBuffer )->GetInteger();
if( 0 == iItemTableID )
continue;
// 실제 필요직업이 뭔지 아이템 테이블에서 갖고 온다.
// 0인 경우는 모두 사용 가능한 것이기에 패스하고 현재 셋팅되고 있는 직업과 실제 아이템의 직업이 맞는가 확인한다.
int iItemNeedJobClassID = 0;
string strNeedJobClassID = ITEM_T->GetFieldFromLablePtr( iItemTableID, "_NeedJobClass" )->GetString();
{
SecureZeroMemory( atcBuf, sizeof(atcBuf) );
_stprintf_s( atcBuf, _T("{ItemTableID:%d, Note:가챠폰 아이템은 직업코드가 하나만 있어야 합니다.}"), iItemTableID );
SCOPED_TRACE( atcBuf );
EXPECT_TRUE( string::npos == strNeedJobClassID.find_first_of( ';' ) || strNeedJobClassID == "0" );
}
iItemNeedJobClassID = atoi( strNeedJobClassID.c_str() );
if( 0 != iItemNeedJobClassID )
{
SecureZeroMemory( atcBuf, sizeof(atcBuf) );
_stprintf_s( atcBuf, _T("{GachaTableID:%d, GachaTableJobID:%d, ItemTableID:%d, ItemTableJobID:%d, Note:가챠폰 테이블의 직업 위치와 실제 아이템의 직업 번호가 맞지 않습니다.}"),
iGachaTableID, iNeedJobClassID, iItemTableID, iItemNeedJobClassID );
SCOPED_TRACE( atcBuf );
EXPECT_TRUE( iNeedJobClassID == iItemNeedJobClassID );
}
// 어떤 파츠인지 타입을 얻어옴. 현재 루프도는 파츠 타입과 맞아야 함.
int iPartIndexInTable = PARTS_T->GetFieldFromLablePtr( iItemTableID, "_Parts" )->GetInteger();
EXPECT_TRUE( iPartIndexInTable == iPart );
}
}
}
}
}
}
}