Files
2022-10-26 12:25:11 +08:00

150 lines
3.7 KiB
C++

#include "StdAfx.h"
#include "MissionRewardParser.h"
#include <Struct.h>
#include "ItemInfoParser.h"
static VOID CheckValidItemCode( SLOTCODE code )
{
if( 0 == code ) return;
BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( code );
FASSERT( pInfo && "보상아이템이 존재하지 않는 코드입니다." );
}
MissionRewardParser::MissionRewardParser(): m_pDataTable ( NULL )
{
}
MissionRewardParser::~MissionRewardParser()
{
FASSERT( m_pDataTable == NULL);
}
VOID MissionRewardParser::Release()
{
Unload();
delete m_pDataTable;
m_pDataTable = NULL;
}
VOID MissionRewardParser::Init(DWORD dwPoolSize)
{
FASSERT( m_pDataTable == NULL );
m_pDataTable = new util::SolarHashTable<MissionRewardInfo*>;
m_pDataTable->Initialize( dwPoolSize );
}
VOID MissionRewardParser::Init( DWORD dwPoolSize, char * pszPackFileName )
{
Init( dwPoolSize );
SetPackFileName( pszPackFileName );
}
VOID MissionRewardParser::Unload()
{
MissionRewardInfo * pInfo = NULL;
if( m_pDataTable == NULL )
{
return;
}
m_pDataTable->SetFirst();
while( pInfo = m_pDataTable->GetNext() )
{
delete pInfo;
}
m_pDataTable->RemoveAll();
}
VOID MissionRewardParser::Reload()
{
Load( m_pszFileName, TRUE );
}
MissionRewardInfo* MissionRewardParser::GetMissionReward( BYTE byMissionNo )
{
return m_pDataTable->GetData( byMissionNo );
}
#pragma warning ( push )
#pragma warning ( disable : 4244)
BOOL MissionRewardParser::Load( char * pszFileName, BOOL bReload )
{
if( !bReload ) strncpy( m_pszFileName, pszFileName, MAX_PATH );
FASSERT( m_pDataTable != NULL );
// 서버에서는 리로드 기능이 있으므로 절대 Load()에서 Unload를 호출하지 말 것!!
// => Unload()호출은 Release()시 해주고 있음
// Unload();
util::SolarFileReader sr;
if ( !OpenFile( sr, pszFileName, SEPERATOR_WHITESPACE ) )
{
FASSERT(0);
return (FALSE);
}
CHAR pszDesc[REWARD_DESC_LENGTH];
while( TRUE )
{
eTOKEN_TYPE ettType = sr.GetNextTokenType();
if ( TOKEN_END == ettType )
{
break;
}
DWORD dwMissionNo = sr.GetTokenNumber();
FASSERT( SAFE_NUMERIC_TYPECAST(DWORD,dwMissionNo,BYTE) );
BYTE byMissionNo = (BYTE)dwMissionNo;
sr.GetNextTokenType(TOKEN_STRING); strncpy( pszDesc, sr.GetTokenString(), REWARD_DESC_LENGTH );
MissionRewardInfo* pMRI = m_pDataTable->GetData( byMissionNo );
if (!pMRI)
{
pMRI = new MissionRewardInfo;
ZeroMemory(pMRI, sizeof(MissionRewardInfo));
pMRI->m_byMissionNo = byMissionNo;
m_pDataTable->Add( pMRI, byMissionNo );
}
DWORD dwClassCode = 0;
sr.GetNextTokenType(TOKEN_NUMBER); dwClassCode = sr.GetTokenNumber();
FASSERT( (MissionRewardInfo::CLASS_CODE_LOWER < dwClassCode) && (MissionRewardInfo::CLASS_CODE_UPPER > dwClassCode) );
MissionRewardInfo::sCLASS* pCLASS = &(pMRI->CLASSs[dwClassCode]);
pCLASS->m_bClassCode = (BYTE)dwClassCode;
MissionRewardInfo::sCLASS::sREWARD* pReward = pCLASS->REWARDs;
MissionRewardInfo::sCLASS::sREWARD* pPreReward = NULL;
for( DWORD i=0 ; i< MissionRewardInfo::MISSION_REWARD_MAX_SIZE ; ++i, ++pReward )
{
sr.GetNextTokenType(TOKEN_NUMBER); pReward->m_bMissionNum = sr.GetTokenNumber();
sr.GetNextTokenType(TOKEN_NUMBER); pReward->m_wRewardCode = sr.GetTokenNumber();
if( 0 != pReward->m_bMissionNum && 0 == pReward->m_wRewardCode ||
0 == pReward->m_bMissionNum && 0 != pReward->m_wRewardCode )
{
DISPMSG( "[미션보상스크립트오류:%u,%u]\n", byMissionNo, dwClassCode );
}
if( (pPreReward && pPreReward->m_bMissionNum >= pReward->m_bMissionNum) ||
(pPreReward && pPreReward->m_bMissionNum == 0) ||
(NULL == pPreReward && pReward->m_bMissionNum == 0) )
{
DISPMSG( "[미션보상스크립트오류:%u,%u]보상의값이이상하다\n", byMissionNo, dwClassCode );
}
pPreReward = pReward;
}
}
sr.CloseFile();
return TRUE;
}
#pragma warning ( pop )