#include "stdafx.h" #include "SJobDB.h" #include #include #include "KTypes.h" #include #include #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; }