263 lines
7.2 KiB
C++
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;
|
|
} |