#include "stdafx.h" #include "SMonsterDB.h" #include #include #include #include #include "KTypes.h" #include "SkillBaseFile.h" #include "SStringDB.h" #include "GameRule.h" #include "SDebug_Util.h" extern HWND g_hWnd; SMonsterDB::SMonsterDB() { Init(); } SMonsterDB::~SMonsterDB() { Destroy(); } void SMonsterDB::Init() { Load(); } void SMonsterDB::Destroy() { _MONSTER_INFO_FILE* pMob = NULL; bool res; res = m_hashMonster.get_first_value( pMob ); while ( res ) { if ( pMob != NULL ) { delete pMob; } res = m_hashMonster.get_next_value( pMob ); } m_hashMonster.clear(); } void SMonsterDB::ReLoad() { Load(); } void SMonsterDB::Load() { Destroy(); KStream * pRes = KFileManager::Instance().CreateStreamFromResource( "db_monster.rdb" ); if( !pRes ) return; GAME_DB db_hdr; int nMobCount = 0; pRes->Read( &db_hdr, sizeof(db_hdr) ); #ifdef _DEV_RDB_ // RDB 와 Header의 사이즈 비교. int fileSize = pRes->Size() - ( STR_DATE_BUFFER + sizeof( int ) ); int headerSize = sizeof(_MONSTER_INFO_FILE_PRE) * 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++ ) { _MONSTER_INFO_FILE * pMonster = new _MONSTER_INFO_FILE; memset( pMonster, 0, sizeof(_MONSTER_INFO_FILE_PRE) ); pRes->Read( pMonster, sizeof(_MONSTER_INFO_FILE_PRE) ); // _oprint( "몬스터 ID[%d] [사이즈 : %f] [스케일 : %f]\n", pMonster->uid, pMonster->size, pMonster->scale ); // { sonador 0.2.1 몬스터 DB 로컬 플레그 적용 if( !( pMonster->local_flag & GameRule::GetCurrentLocalBitSet() ) ) { pMonster->uid = pMonster->old_uid; pMonster->old_uid = XFastRandom(); _MONSTER_INFO_FILE * pFindMob = NULL; if( m_hashMonster.lookup( pMonster->uid, pFindMob ) == false ) { ++nMobCount; m_hashMonster.add( pMonster->uid, pMonster ); } else { _oprint( "!!!!Data Error Mob Code 가 중복되었습니다.!!!! %d\n", pMonster->uid ); assert(0); //기획팀에 알려 주세여. 바로 수정 해야 합니다. delete pMonster; } } else { delete pMonster; } // } } _oprint( "몬스터 갯수 : %d\n", nMobCount ); KFileManager::Instance().DeleteStream( pRes ); } SMonsterDB* SMonsterDB::m_pThis = NULL; SMonsterDB & GetMonsterDB() { if( NULL == SMonsterDB::m_pThis ) SMonsterDB::m_pThis = new SMonsterDB; return *SMonsterDB::m_pThis; // static SMonsterDB monsterdb; // return monsterdb; }