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

148 lines
2.9 KiB
C++

#include "stdafx.h"
#include "SMonsterDB.h"
#include <Windows.h>
#include <kfile/KStream.h>
#include <kfile/KFileManager.h>
#include <toolkit/XStringUtil.h>
#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;
}