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

128 lines
2.8 KiB
C++

#include "stdafx.h"
#include "BattleArenaBase.h"
#include "SBattleArenaDB.h"
#include <kfile/KFileManager.h>
#include "SkillBaseFile.h"
#include <toolkit/XStringUtil.h>
#include <kfile/KStream.h>
#include "KTypes.h"
SBattleArenaDB & GetBattleArenaDB()
{
static SBattleArenaDB BattleArenaDB;
return BattleArenaDB;
}
SBattleArenaDB::SBattleArenaDB()
{
Init();
}
SBattleArenaDB::~SBattleArenaDB()
{
Destroy();
}
void SBattleArenaDB::Init()
{
Load();
}
void SBattleArenaDB::Destroy()
{
BattleArenaBase* battleArena = NULL;
bool res;
res = m_hashBattleArena.get_first_value( battleArena );
while ( res )
{
if ( battleArena != NULL )
{
delete battleArena;
}
res = m_hashBattleArena.get_next_value( battleArena );
}
m_hashBattleArena.clear();
m_hashBattleArenaId.clear();
}
void SBattleArenaDB::Load()
{
KStream * pRes = KFileManager::Instance().CreateStreamFromResource( "db_BattleArena.rdb" );
if( !pRes ) return;
GAME_DB db_hdr;
std::string idKey;
pRes->Read( &db_hdr, sizeof(db_hdr) );
for( int i(0); db_hdr.nCount>i; i++ )
{
BattleArenaBase * battleArena = new BattleArenaBase;
memset( battleArena, 0, sizeof(BattleArenaBase) );
pRes->Read( battleArena, sizeof(BattleArenaBase) );
BattleArenaBase* pFind = NULL;
if( m_hashBattleArena.lookup( battleArena->nID, pFind ) == false )
{
m_hashBattleArena.add( battleArena->nID, battleArena );
/// add m_hashBattleArenaId
createIdKey(battleArena->eType, battleArena->nMaxMember, idKey);
m_hashBattleArenaId.add(idKey.c_str(), battleArena->nID);
}
else
{
_oprint( "!!!!Data Error BattleArena ID가 중복되었습니다.!!!! %d\n", battleArena->nID);
assert(0); //기획팀에 알려 주세여. 바로 수정 해야 합니다.
delete battleArena;
}
}
KFileManager::Instance().DeleteStream( pRes );
}
int SBattleArenaDB::findID(int arenaType, int maxMember)
{
int id;
std::string idKey;
createIdKey(arenaType, maxMember, idKey);
if (m_hashBattleArenaId.lookup(idKey.c_str(), id))
return id;
return -1;
}
BattleArenaBase* SBattleArenaDB::getData(int arenaId)
{
BattleArenaBase* base = NULL;
if (m_hashBattleArena.lookup(arenaId, base))
return base;
return NULL;
}
bool SBattleArenaDB::isInArena(unsigned int warpx, unsigned int warpy)
{
BattleArenaBase* battleArena = NULL;
bool res;
res = m_hashBattleArena.get_first_value( battleArena );
while ( res )
{
if ( battleArena != NULL )
{
if (battleArena->nArenaRegionLeft <= warpx && battleArena->nArenaRegionRight >= warpx &&
battleArena->nArenaRegionBottom <= warpy && battleArena->nArenaRegionTop >= warpy)
{
return true;
}
}
res = m_hashBattleArena.get_next_value( battleArena );
}
return false;
}
void SBattleArenaDB::createIdKey(int arenaType, int maxMember, std::string& key)
{
XStringUtil::Format(key, "%d_%d", arenaType, maxMember);
}