Files
git 9cb257e7ae Add GameClients drops and keep current 1602 source work.
CN1602 is the local client. KR is the official tree with unpacked Data, System, and Sound. Packed .wpk files stay off git.
2026-08-30 23:24:31 +03:00

231 lines
6.3 KiB
C++

#include "StdAfx.h"
#include ".\rewardinfolist.h"
#include <SolarFileReader.h>
#include <SCItemSlot.h>
#include "ItemInfoParser.h"
#include <iostream>
//////////////////////////////////////////RewardInfo//////////////////////////////////////////////
//////////////////////////////////////////RewardInfoList//////////////////////////////////////////
RewardInfoList::RewardInfoList(void)
{
}
RewardInfoList::~RewardInfoList(void)
{
Unload();
}
void RewardInfoList::Unload()
{
RewardInfo * pInfo = NULL;
REWARD_HASH::iterator it, end(m_RewardInfoHash.end());
for( it = m_RewardInfoHash.begin(); it != end ; ++it )
{
pInfo = it->second;
SAFE_DELETE(pInfo);
}
m_RewardInfoHash.clear();
}
void RewardInfoList::Init(char * pszPackFile)
{
SetPackFileName( pszPackFile );
}
#pragma warning ( push )
#pragma warning ( disable : 4244)
#pragma warning ( disable : 4800)
BOOL RewardInfoList::_Load(BOOL reloaded)
{
__UNUSED(reloaded);
int nRowSize = GetRowSize();
TCHAR szTemp[MAX_FIELD_NAME_SIZE] = {0,};
DWORD info_index = 0;
for( int nRow = 0; nRow < nRowSize; ++nRow )
{
info_index = GetDataNumber("Index",nRow);
if ((FindRewardInfo(info_index) != NULL))
{
#ifndef _SERVER //#if'N'def
assert(!"[RewardInfoList::_Load] duplicated index");
#endif //_SERVER
SUNLOG(eCRITICAL_LOG, "[RewardInfoList::_Load] duplicated index = %d", info_index);
continue;
}
RewardInfo * pInfo = new RewardInfo;
pInfo->SetIndex(info_index);
m_RewardInfoHash[ pInfo->GetIndex() ] = pInfo;
strncpy( pInfo->m_pszDesc, GetDataString("Description",nRow), RewardInfo::MAX_DESC_LENGTH );
pInfo->SetDCode( GetDataNumber("DescriptionCode",nRow) );
pInfo->SetExp( GetDataNumber("Exp",nRow) );
pInfo->SetHime( GetDataNumber("Hime",nRow) );
#ifdef _NA_1419_20100121_ACCUMULATE_POINT
pInfo->SetCoin( GetDataNumber("Coin",nRow) );
#endif
#ifdef _NA_003027_20111013_HONOR_SYSTEM
pInfo->SetTitle( GetDataWORD("Title",nRow) );
pInfo->SetReputeCode( GetDataWORD("ReputeCode",nRow) );
pInfo->SetReputePoint( GetDataWORD("ReputePoint",nRow) );
#endif //_NA_003027_20111013_HONOR_SYSTEM
pInfo->SetChaoTime( GetDataNumber("ChaoTime",nRow) );
pInfo->SetItemCode( GetDataNumber("Fixed_IC",nRow) );
pInfo->SetItemTypeIndex( GetDataNumber("IGtype",nRow) );
if( pInfo->GetItemCode() !=0 )
{
if( !IsExistItemInScript( pInfo->GetItemCode(), pInfo->GetItemTypeIndex() ) )
{
SUNLOG( eCRITICAL_LOG, "[Index : %u]\n", pInfo->GetIndex());
pInfo->SetItemTypeIndex(1);
}
}
pInfo->SetSkillCode( GetDataNumber("Skill",nRow) );
pInfo->SetRefType( GetDataNumber("ReferenceType",nRow) );
if( 0 != pInfo->GetItemCode() && NULL == ItemInfoParser::Instance()->GetItemInfo(pInfo->GetItemCode()) )
{
SUNLOG( eCRITICAL_LOG, "[RewardInfoList] Fixed ItemCode(%u) doesn't exist\n", pInfo->GetItemCode());
}
pInfo->SetSelectNum( GetDataNumber("Select_Num",nRow) );
for(int i = 0 ; i < RewardInfo::MAX_DROP_INDEX_NUM ; ++i )
{
_snprintf( szTemp, MAX_FIELD_NAME_SIZE, "Sel_IC%d\0", i+1 );
pInfo->SetTypeCode( i, GetDataNumber(szTemp,nRow) );
_snprintf( szTemp, MAX_FIELD_NAME_SIZE, "IGtype%d\0", i+1 );
pInfo->SetTypeIndex( i, GetDataNumber(szTemp,nRow) );
#ifdef _NA_006801_20130705_RENEWAL_RANKINGSYSTEM
_snprintf( szTemp, MAX_FIELD_NAME_SIZE, "TimeLimit%d\0", i+1);
pInfo->SetTimeLimit( i, GetDataNumber(szTemp,nRow));
#endif //_NA_006801_20130705_RENEWAL_RANKINGSYSTEM
// ŸÀÔ Ã¼Å©
if( pInfo->GetRefType() == RewardInfo::REF_TYPE_SELECT &&
SCItemSlot::IsOverlap( pInfo->GetTypeCode(i) ) )
{
if( pInfo->GetTypeIndex(i) <= 0 )
{
SUNLOG( eCRITICAL_LOG, "[WARNING:ERROR:%d] invalid stack item count(%d)\n", pInfo->GetIndex(), pInfo->GetTypeCode(i) );
pInfo->SetTypeIndex(i, 1);
}
}
if( pInfo->GetRefType() == RewardInfo::REF_TYPE_SELECT ||
pInfo->GetRefType() == RewardInfo::REF_TYPE_EVENT_ITEMCODE )
{
if( 0!= pInfo->GetTypeCode(i) && NULL == ItemInfoParser::Instance()->GetItemInfo(pInfo->GetTypeCode(i)) )
SUNLOG( eCRITICAL_LOG, "[RewardInfoList] selected ItemCode(%u) does not exist\n", pInfo->GetTypeCode(i));
}
}
if( pInfo->GetItemCode() != 0 &&
SCItemSlot::IsOverlap(pInfo->GetItemCode()) )
{
if( pInfo->GetItemTypeIndex() <= 0 )
{
SUNLOG( eCRITICAL_LOG, "[WARNING:ERROR:%d] invalid stack item count(%d)\n", pInfo->GetIndex(), pInfo->GetItemTypeIndex() );
pInfo->SetItemTypeIndex(1);
}
}
//
int count = 0;
for(int i = 0 ; i < RewardInfo::MAX_DROP_INDEX_NUM ; ++i )
{
if( pInfo->GetTypeCode(i) != 0 )
{
++count;
}
}
if( pInfo->GetRefType() == RewardInfo::REF_TYPE_SELECT ||
pInfo->GetRefType() == RewardInfo::REF_TYPE_RANDOM )
{
if( count < pInfo->GetSelectNum() ||
( count == 0 && pInfo->GetSelectNum() > 0 ) ||
( pInfo->GetSelectNum() == 0 && count > 0 ) )
{
SUNLOG( eCRITICAL_LOG, "[WARNING:ERROR:%d] SelectNum(%d) invalid count\n", pInfo->GetIndex(), pInfo->GetSelectNum() );
}
}
#ifdef _NA_20100307_BETAKEY_SYSTEM
pInfo->SetBetaKey( GetDataInt("BetaKeyCode", nRow) );
#endif
}
return TRUE;
}
#pragma warning ( pop )
void RewardInfoList::Reload()
{
// Load( m_pszFileName, TRUE );
}
RewardInfo * RewardInfoList::FindRewardInfo( DWORD Index )
{
REWARD_HASH::iterator itr = m_RewardInfoHash.find( Index );
if ( itr != m_RewardInfoHash.end() )
{
return itr->second;
}
return NULL;
}
BOOL RewardInfoList::IsExistItemInScript(SLOTCODE IN ItemCode, DWORD dwItemTypeIndex)
{
if( NULL == ItemInfoParser::Instance()->GetItemInfo(ItemCode) )
{
SUNLOG( eCRITICAL_LOG, "[RewardInfoList] Item(%u) does not exist.", ItemCode);
return FALSE;
}
if( dwItemTypeIndex <= 0 )
{
SUNLOG( eCRITICAL_LOG, "[RewardInfoList] invalid item type index(%d).", dwItemTypeIndex );
return FALSE;
}
if( !SCItemSlot::IsOverlap(ItemCode) )
{
if( dwItemTypeIndex > 1 )
{
SUNLOG( eCRITICAL_LOG, "[RewardInfoList] this item cannot be stacked(%d).", ItemCode );
return FALSE;
}
}
return TRUE;
}
BOOL RewardInfoList::LoadScript( eSCRIPT_CODE ScriptCode, BOOL bReload )
{
switch( ScriptCode )
{
case SCRIPT_REWARDINFOLIST:
return _Load( bReload );
}
return FALSE;
}
VOID RewardInfoList::Release()
{
Unload();
}