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

263 lines
7.2 KiB
C++

#include "stdafx.h"
#include "SJobDB.h"
#include <Windows.h>
#include <kfile/KStream.h>
#include "KTypes.h"
#include <kfile/KFileManager.h>
#include <toolkit/XStringUtil.h>
#include "SkillBaseFile.h"
#include "SStringDB.h"
#include "SDebug_Util.h"
#include "SLog.h"
extern HWND g_hWnd;
//-----------------------------------------------------------------------------------------------------------------
// 생성자
//-----------------------------------------------------------------------------------------------------------------
SJobDB::SJobDB()
{
Init();
}
//-----------------------------------------------------------------------------------------------------------------
// 파괴자
//-----------------------------------------------------------------------------------------------------------------
SJobDB::~SJobDB()
{
Destroy();
}
//-----------------------------------------------------------------------------------------------------------------
// 초기화
//-----------------------------------------------------------------------------------------------------------------
void SJobDB::Init()
{
Load();
}
//-----------------------------------------------------------------------------------------------------------------
// 파괴
//-----------------------------------------------------------------------------------------------------------------
void SJobDB::Destroy()
{
SAFE_DELETE_VECTOR( m_vJobList );
}
//-----------------------------------------------------------------------------------------------------------------
// 직업 정보 얻기
//-----------------------------------------------------------------------------------------------------------------
JobInfoEx * SJobDB::GetJobData( int nJobID )
{
if( m_vJobList.empty() ) return NULL;
for( unsigned int i(0); m_vJobList.size()>i; i++ )
{
if( m_vJobList[i]->id == nJobID )
return m_vJobList[i];
}
return NULL;
}
//-----------------------------------------------------------------------------------------------------------------
// 직업 이름 얻기
//-----------------------------------------------------------------------------------------------------------------
const char* SJobDB::GetJobName( int nJobID )
{
if( m_vJobList.empty() ) return "";
JobInfoEx* pJob = GetJobData(nJobID);
if( pJob == NULL ) return "";
return GetStringDB().GetString( pJob->text_id );
}
//-----------------------------------------------------------------------------------------------------------------
// 직업 아이콘 얻기
//-----------------------------------------------------------------------------------------------------------------
const int SJobDB::GetJonIcon( int nJobID )
{
if( m_vJobList.empty() ) return -1;
JobInfoEx* pJob = GetJobData(nJobID);
if( pJob == NULL ) return NULL;
return pJob->job_icon;
}
//-----------------------------------------------------------------------------------------------------------------
// 직업 아이콘 이름 얻기
//-----------------------------------------------------------------------------------------------------------------
const char* SJobDB::GetJobIconName( int nJobID )
{
if( m_vJobList.empty() ) return "static_job_unknownicon";
JobInfoEx* pJob = GetJobData(nJobID);
if( pJob == NULL ) return "static_job_unknownicon";
return pJob->icon_file_name;
}
//-----------------------------------------------------------------------------------------------------------------
// 불러오기
//-----------------------------------------------------------------------------------------------------------------
void SJobDB::Load()
{
KStream * pRes = KFileManager::Instance().CreateStreamFromResource( "db_job.rdb" );
if( !pRes ) return;
GAME_DB db_hdr;
pRes->Read( &db_hdr, sizeof(db_hdr) );
#ifdef _DEV_RDB_
// RDB 와 Header의 사이즈 비교.
int fileSize = pRes->Size() - ( STR_DATE_BUFFER + sizeof( int ) );
int headerSize = sizeof(JobInfoEx) * db_hdr.nCount;
if( fileSize != headerSize )
{
char str[512] = { NULL, };
sprintf( str, "*** RDB Error !!! ***\n\n생성날짜%s\n파일:%s\n파일사이즈:%d\n헤더사이즈:%d\n ",
db_hdr.szDate,
__FILE__,
fileSize,
headerSize
);
::MessageBox( g_hWnd, str, "Error", MB_OK );
if( ::MessageBox( g_hWnd, "RDB와 클라이언트가 맞지않습니다. 강제종료하시겠습니까?", "Error", MB_YESNO ) == IDYES )
{
exit( 1 );
}
}
#endif
for( int i(0); db_hdr.nCount>i; i++ )
{
JobInfoEx * pJob = new JobInfoEx;
memset( pJob, 0, sizeof(JobInfoEx) );
pRes->Read( pJob, sizeof(JobInfoEx) );
m_vJobList.push_back( pJob );
}
KFileManager::Instance().DeleteStream( pRes );
}
//-----------------------------------------------------------------------------------------------------------------
// 직업 Class 얻기
//-----------------------------------------------------------------------------------------------------------------
const char SJobDB::GetJobClass( const int nJobID )
{
if( m_vJobList.empty() )
{
SDEBUGLOG( "[Job DB] 직업 리스트가 비어 있습니다." );
assert( NULL );
return 0;
}
JobInfoEx* pJob( GetJobData( nJobID ) );
if( pJob == NULL )
{
SDEBUGLOG( "[Job DB] 직업 정보를 찾을 수 없습니다 - 직업 ID : [%u]", nJobID );
assert( NULL );
return 0;
}
return pJob->job_class;
}
const std::vector< struct JobInfoEx* >& SJobDB::GetJobAllData()
{
return m_vJobList;
}
bool SJobDB::IsHunter( int nJobID, int nRace )
{
if( !nJobID )
{
switch( nRace )
{
case JobInfo::GAIA : nJobID = JobInfo::GAIA_BASIC_JOB; break;
case JobInfo::DEVA : nJobID = JobInfo::DEVA_BASIC_JOB; break;
case JobInfo::ASURA : nJobID = JobInfo::ASURA_BASIC_JOB; break;
default: break;
}
}
return (GetJobDB().GetJobClass( nJobID ) == JobInfo::HUNTER);
}
bool SJobDB::IsFighter( int nJobID, int nRace )
{
if( !nJobID )
{
switch( nRace )
{
case JobInfo::GAIA : nJobID = JobInfo::GAIA_BASIC_JOB; break;
case JobInfo::DEVA : nJobID = JobInfo::DEVA_BASIC_JOB; break;
case JobInfo::ASURA : nJobID = JobInfo::ASURA_BASIC_JOB; break;
default: break;
}
}
return (GetJobDB().GetJobClass( nJobID ) == JobInfo::FIGHTER);
}
bool SJobDB::IsMagician( int nJobID, int nRace )
{
if( !nJobID )
{
switch( nRace )
{
case JobInfo::GAIA : nJobID = JobInfo::GAIA_BASIC_JOB; break;
case JobInfo::DEVA : nJobID = JobInfo::DEVA_BASIC_JOB; break;
case JobInfo::ASURA : nJobID = JobInfo::ASURA_BASIC_JOB; break;
default: break;
}
}
return (GetJobDB().GetJobClass( nJobID ) == JobInfo::MAGICIAN);
}
bool SJobDB::IsSummoner( int nJobID, int nRace )
{
if( !nJobID )
{
switch( nRace )
{
case JobInfo::GAIA : nJobID = JobInfo::GAIA_BASIC_JOB; break;
case JobInfo::DEVA : nJobID = JobInfo::DEVA_BASIC_JOB; break;
case JobInfo::ASURA : nJobID = JobInfo::ASURA_BASIC_JOB; break;
default: break;
}
}
return (GetJobDB().GetJobClass( nJobID ) == JobInfo::SUMMONER);
}
//-----------------------------------------------------------------------------------------------------------------
// 인스턴스 얻기
//-----------------------------------------------------------------------------------------------------------------
SJobDB* SJobDB::m_pThis = NULL;
SJobDB & GetJobDB()
{
if( NULL == SJobDB::m_pThis )
SJobDB::m_pThis = new SJobDB;
return *SJobDB::m_pThis;
// static SJobDB jobdb;
// return jobdb;
}