Files
Leviathan/Client/Game/game/DB/SCombineDB.cpp
T
2026-06-01 12:46:52 +02:00

334 lines
8.4 KiB
C++

#include "stdafx.h"
#include "SCombineDB.h"
#include <Windows.h>
#include <kfile/KStream.h>
#include "KTypes.h"
#include <kfile/KFileManager.h>
#include <toolkit/XStringUtil.h>
#include "CombineBase.h"
#include "SkillBaseFile.h"
#include "SDebug_Util.h"
SCombineDB* SCombineDB::m_pThis = NULL;
SCombineDB & GetCombineDB()
{
if( NULL == SCombineDB::m_pThis )
SCombineDB::m_pThis = new SCombineDB;
return *SCombineDB::m_pThis;
// static SCombineDB CombineDB;
// return CombineDB;
}
SCombineDB::SCombineDB()
{
Init();
}
SCombineDB::~SCombineDB()
{
Destroy();
}
void SCombineDB::Init()
{
Load();
}
void SCombineDB::Destroy()
{
CombineBase* pCombine = NULL;
bool res;
res = m_hashCombine.get_first_value( pCombine );
while ( res )
{
if ( pCombine != NULL )
{
delete pCombine;
}
res = m_hashCombine.get_next_value( pCombine );
}
m_hashCombine.clear();
}
void SCombineDB::Load()
{
KStream * pRes = KFileManager::Instance().CreateStreamFromResource( "db_CombineRes.rdb" );
if( !pRes ) return;
GAME_DB db_hdr;
pRes->Read( &db_hdr, sizeof(db_hdr) );
for( int i(0); db_hdr.nCount>i; i++ )
{
CombineBase * pItem = new CombineBase;
memset( pItem, 0, sizeof(CombineBase) );
pRes->Read( pItem, sizeof(CombineBase) );
CombineBase* pFindItem = NULL;
if( m_hashCombine.lookup( pItem->id, pFindItem ) == false )
{
m_hashCombine.add( pItem->id, pItem );
}
else
{
_oprint( "!!!!Data Error Combine Code 가 중복되었습니다.!!!! %d\n", pItem->id );
assert(0); //기획팀에 알려 주세여. 바로 수정 해야 합니다.
delete pItem;
}
}
KFileManager::Instance().DeleteStream( pRes );
}
bool SCombineDB::LookUp( int nID, CombineBase * pItem )
{
return m_hashCombine.lookup(nID, pItem);
}
int SCombineDB::GetMainType( int nID )
{
CombineBase * pItem(NULL);
if( m_hashCombine.lookup(nID, pItem) )
{
return pItem->main_type_01;
}
return -1;
}
int SCombineDB::GetMainTypeValue( int nID )
{
CombineBase * pItem(NULL);
if( m_hashCombine.lookup(nID, pItem) )
{
return pItem->main_value_01;
}
return -1;
}
bool SCombineDB::CheckValue( int nType, int nTypeValue, int nBigGroup, int nGroup, int nID, int nRank, int nLv, const XFlag<int> xFlag, int nEnhance, int nItemCount )
{
if( nType == 1 && nTypeValue != nBigGroup ) //1 : 아이템 대분류
return false;
if( nType == 2 && nTypeValue != nGroup ) //2 : 아이템 중분류
return false;
if( nType == 3 && nTypeValue != nID ) //3 : 아이템 ID
return false;
if( nType == 4 && nTypeValue != nRank ) //4 : 아이템 랭크
return false;
if( nType == 5 && nTypeValue != nLv ) //5 : 아이템 레벨
return false;
if( nType == 6 && !xFlag.IsOn( nTypeValue ) ) //6 : 플래그 설정됨 (on)
return false;
if( nType == 7 && xFlag.IsOn( nTypeValue ) ) //7 : 플래그 설정되지 않음 (off)
return false;
if( nType == 8 && nEnhance != nTypeValue ) //강화 수치
return false;
if( nType == 9 && nEnhance == nTypeValue )
return false;
if( nType == 10 && nItemCount != nTypeValue )
return false;
return true;
}
bool SCombineDB::IsMain( int nBigGroup, int nGroup, int nID, int nRank, int nLv, const XFlag<int> xFlag, int nEnhance, int nItemCount )
{
// sonador 7.0.15 7.0.12 Rollback & 빗자루 : 2000178 와 가면: 2000182 예외처리
if( nID == 2000178 || nID == 2000182 )
return false;
bool bResult;
KHash< CombineBase*, hashPr_mod_int >::node* _node = NULL;
bResult = m_hashCombine.get_first_node( _node );
while( bResult )
{
CombineBase* pCombine = _node->value;
while( true )
{
if( !pCombine->main_type_01 &&
!pCombine->main_type_02 &&
!pCombine->main_type_03 &&
!pCombine->main_type_04 &&
!pCombine->main_type_05 )
break;
if( pCombine->main_type_01 )
{
if( !CheckValue( pCombine->main_type_01, pCombine->main_value_01, nBigGroup, nGroup, nID, nRank, nLv, xFlag, nEnhance, nItemCount) )
break;
}
if( pCombine->main_type_02 )
{
if( !CheckValue( pCombine->main_type_02, pCombine->main_value_02, nBigGroup, nGroup, nID, nRank, nLv, xFlag, nEnhance, nItemCount) )
break;
}
if( pCombine->main_type_03 )
{
if( !CheckValue( pCombine->main_type_03, pCombine->main_value_03, nBigGroup, nGroup, nID, nRank, nLv, xFlag, nEnhance, nItemCount) )
break;
}
if( pCombine->main_type_04 )
{
if( !CheckValue( pCombine->main_type_04, pCombine->main_value_04, nBigGroup, nGroup, nID, nRank, nLv, xFlag, nEnhance, nItemCount) )
break;
}
if( pCombine->main_type_05 )
{
if( !CheckValue( pCombine->main_type_05, pCombine->main_value_05, nBigGroup, nGroup, nID, nRank, nLv, xFlag, nEnhance, nItemCount) )
break;
}
return true;
}
bResult = m_hashCombine.get_next_node( _node );
}
return false;
}
bool SCombineDB::IsSub( int nBigGroup, int nGroup, int nID, int nRank, int nLv, const XFlag<int> xFlag, int nEnhance, int nItemCount )
{
bool bResult;
KHash< CombineBase*, hashPr_mod_int >::node* _node = NULL;
bResult = m_hashCombine.get_first_node( _node );
while( bResult )
{
CombineBase* pCombine = _node->value;
for( int subcnt = 0; subcnt < MAX_SUB; ++subcnt )
{
if( pCombine->sub[subcnt].sub_type[0] )
{
if( CheckValue( pCombine->sub[subcnt].sub_type[0], pCombine->sub[subcnt].sub_value[0], nBigGroup, nGroup, nID, nRank, nLv, xFlag, nEnhance, nItemCount) )
return true;
}
}
bResult = m_hashCombine.get_next_node( _node );
}
return false;
}
int SCombineDB::GetSubType( int nID, int nIndex )
{
CombineBase * pItem(NULL);
if( m_hashCombine.lookup(nID, pItem) )
{
if( nIndex < MAX_SUB )
return pItem->sub[nIndex].sub_type[0];
}
return -1;
}
int SCombineDB::GetSubTypeValue( int nID, int nIndex )
{
CombineBase * pItem(NULL);
if( m_hashCombine.lookup(nID, pItem) )
{
if( nIndex < MAX_SUB )
pItem->sub[nIndex].sub_value[0];
}
return -1;
}
int SCombineDB::getMixType(int id)
{
CombineBase * combine = NULL;
if( m_hashCombine.lookup(id, combine))
{
return combine->mix_type;
}
return 0;
}
void SCombineDB::getMainMixList(int nBigGroup, int nGroup, int nID, int nRank, int nLv, const XFlag<int> xFlag, int nEnhance, int nItemCount, std::vector<int>& mainMixList)
{
// sonador 7.0.15 7.0.12 Rollback & 빗자루 : 2000178 와 가면: 2000182 예외처리
if( nID == 2000178 || nID == 2000182 )
return ;
bool bResult;
KHash< CombineBase*, hashPr_mod_int >::node* _node = NULL;
bResult = m_hashCombine.get_first_node( _node );
while( bResult )
{
CombineBase* pCombine = _node->value;
while( true )
{
if( !pCombine->main_type_01 &&
!pCombine->main_type_02 &&
!pCombine->main_type_03 &&
!pCombine->main_type_04 &&
!pCombine->main_type_05 )
break;
if( pCombine->main_type_01 )
{
if( !CheckValue( pCombine->main_type_01, pCombine->main_value_01, nBigGroup, nGroup, nID, nRank, nLv, xFlag, nEnhance, nItemCount) )
break;
}
if( pCombine->main_type_02 )
{
if( !CheckValue( pCombine->main_type_02, pCombine->main_value_02, nBigGroup, nGroup, nID, nRank, nLv, xFlag, nEnhance, nItemCount) )
break;
}
if( pCombine->main_type_03 )
{
if( !CheckValue( pCombine->main_type_03, pCombine->main_value_03, nBigGroup, nGroup, nID, nRank, nLv, xFlag, nEnhance, nItemCount) )
break;
}
if( pCombine->main_type_04 )
{
if( !CheckValue( pCombine->main_type_04, pCombine->main_value_04, nBigGroup, nGroup, nID, nRank, nLv, xFlag, nEnhance, nItemCount) )
break;
}
if( pCombine->main_type_05 )
{
if( !CheckValue( pCombine->main_type_05, pCombine->main_value_05, nBigGroup, nGroup, nID, nRank, nLv, xFlag, nEnhance, nItemCount) )
break;
}
mainMixList.push_back(pCombine->id);
break;
}
bResult = m_hashCombine.get_next_node( _node );
}
}
void SCombineDB::getSubMixList(int nBigGroup, int nGroup, int nID, int nRank, int nLv, const XFlag<int> xFlag, int nEnhance, int nItemCount,
const std::vector<int>& mainMixList, std::vector<int>& subMixList)
{
CombineBase* combine;
std::vector<int>::const_iterator it_main = mainMixList.begin();
for (; it_main != mainMixList.end(); ++it_main)
{
if( m_hashCombine.lookup(*it_main, combine) )
{
for( int subcnt = 0; subcnt < MAX_SUB; ++subcnt )
{
if( combine->sub[subcnt].sub_type[0] )
{
if( CheckValue( combine->sub[subcnt].sub_type[0], combine->sub[subcnt].sub_value[0], nBigGroup, nGroup, nID, nRank, nLv, xFlag, nEnhance, nItemCount) )
{
subMixList.push_back(combine->id);
break;
}
}
}
}
}
}