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

158 lines
5.0 KiB
C++

#include "stdafx.h"
#include "SDecomposeDB.h"
#include "DecomposeBase.h"
#include <kfile/KFileManager.h>
#include "SLog.h"
#include "SkillBaseFile.h"
#include <kfile/KStream.h>
#include "KTypes.h"
//-----------------------------------------------------------------------------------------------------------------
// 분해 식 DB 인스턴스 얻기
//-----------------------------------------------------------------------------------------------------------------
SDecomposeDB* SDecomposeDB::m_pThis = NULL;
SDecomposeDB & GetDecomposeDB()
{
if( NULL == SDecomposeDB::m_pThis )
SDecomposeDB::m_pThis = new SDecomposeDB;
return *SDecomposeDB::m_pThis;
// static SDecomposeDB DecomposeDB;
// return DecomposeDB;
}
//-----------------------------------------------------------------------------------------------------------------
// 생성자
//-----------------------------------------------------------------------------------------------------------------
SDecomposeDB::SDecomposeDB()
{
if( false == Load() )
{
SDEBUGLOG( "[SDecomposeDB] Load Failed " );
assert( NULL );
}
}
//-----------------------------------------------------------------------------------------------------------------
// 파괴자
//-----------------------------------------------------------------------------------------------------------------
SDecomposeDB::~SDecomposeDB()
{
Destroy();
}
//-----------------------------------------------------------------------------------------------------------------
// RDB 파일 불러오기
//-----------------------------------------------------------------------------------------------------------------
bool SDecomposeDB::Load()
{
KStream* pRes( KFileManager::Instance().CreateStreamFromResource( "db_Decompose.rdb" ) );
if( NULL == pRes )
{
SDEBUGLOG( "[SDecomposeDB] Create Stream Failed - [db_Decompose.rdb]" );
assert( NULL );
return false;
}
GAME_DB db_hdr;
std::string idKey;
pRes->Read( &db_hdr, sizeof(db_hdr) );
for( int nCount = 0; nCount < db_hdr.nCount; nCount++ )
{
DecomposeBase stDecomposeBase;
size_t ReadSize( pRes->Read( &stDecomposeBase, sizeof(DecomposeBase) ) );
if( NULL == ReadSize )
{
SDEBUGLOG( "[SDecomposeDB] Read Failed" );
assert( ReadSize );
return false;
}
PDECOMPOSE_FORMULA_INFO pFormulaInfo( new DECOMPOSE_FORMULA_INFO() );
if( NULL == pFormulaInfo )
{
SDEBUGLOG( "[SDecomposeDB] Memory Alloc Failed" );
assert( pFormulaInfo );
continue;
}
pFormulaInfo->m_nNeedPrice = stDecomposeBase.nNeed_Price;
// 아 그지같다... 정녕 이렇게 밖에 넣을 수 없는가...
DECOMPOSE_IDENTITY_INFO stIdentityInfo_01;
stIdentityInfo_01.m_nType = stDecomposeBase.nMaterial_Type_01;
stIdentityInfo_01.m_nValue = stDecomposeBase.nMaterial_Value_01;
pFormulaInfo->m_vecIdentity.push_back( stIdentityInfo_01 );
DECOMPOSE_IDENTITY_INFO stIdentityInfo_02;
stIdentityInfo_02.m_nType = stDecomposeBase.nMaterial_Type_02;
stIdentityInfo_02.m_nValue = stDecomposeBase.nMaterial_Value_02;
pFormulaInfo->m_vecIdentity.push_back( stIdentityInfo_02 );
DECOMPOSE_IDENTITY_INFO stIdentityInfo_03;
stIdentityInfo_03.m_nType = stDecomposeBase.nMaterial_Type_03;
stIdentityInfo_03.m_nValue = stDecomposeBase.nMaterial_Value_03;
pFormulaInfo->m_vecIdentity.push_back( stIdentityInfo_03 );
DECOMPOSE_IDENTITY_INFO stIdentityInfo_04;
stIdentityInfo_04.m_nType = stDecomposeBase.nMaterial_Type_04;
stIdentityInfo_04.m_nValue = stDecomposeBase.nMaterial_Value_04;
pFormulaInfo->m_vecIdentity.push_back( stIdentityInfo_04 );
DECOMPOSE_IDENTITY_INFO stIdentityInfo_05;
stIdentityInfo_05.m_nType = stDecomposeBase.nMaterial_Type_05;
stIdentityInfo_05.m_nValue = stDecomposeBase.nMaterial_Value_05;
pFormulaInfo->m_vecIdentity.push_back( stIdentityInfo_05 );
if( false == m_mapDecomposeFormula.insert( pair<UINT, PDECOMPOSE_FORMULA_INFO>( stDecomposeBase.nID, pFormulaInfo ) ).second )
{
SAFE_DELETE( pFormulaInfo );
SDEBUGLOG( "[SDecomposeDB] ID 중복이거나 컨테이너 삽입에 실패하였습니다." );
assert( pFormulaInfo );
continue;
}
}
KFileManager::Instance().DeleteStream( pRes );
return true;
}
//-----------------------------------------------------------------------------------------------------------------
// 파괴
//-----------------------------------------------------------------------------------------------------------------
void SDecomposeDB::Destroy()
{
for( DECOMPOSE_FORMULA_ITER Iter = m_mapDecomposeFormula.begin(); Iter != m_mapDecomposeFormula.end(); ++Iter )
{
PDECOMPOSE_FORMULA_INFO pDecomposeFormula( Iter->second );
SAFE_DELETE( pDecomposeFormula );
}
m_mapDecomposeFormula.clear();
}
//-----------------------------------------------------------------------------------------------------------------
// 분해 식 리스트 얻기
//-----------------------------------------------------------------------------------------------------------------
map< UINT, DECOMPOSE_FORMULA_INFO* >* const SDecomposeDB::GetDecomposeFormula()
{
return &m_mapDecomposeFormula;
}