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

90 lines
1.8 KiB
C++

#include "stdafx.h"
#include "SMonsterCreatureDB.h"
#include <rdu/RDUReader.h>
#include <rdu/ColumnDataGetter.h>
SMonstarCreatureDB::SMonstarCreatureDB()
{
Init();
}
SMonstarCreatureDB::~SMonstarCreatureDB()
{
Destroy();
}
void SMonstarCreatureDB::Init()
{
Load();
}
void SMonstarCreatureDB::Destroy()
{
m_mapMonsterCreatureList.clear();
}
void SMonstarCreatureDB::Load()
{
KStream * pRes = KFileManager::Instance().CreateStreamFromResource( "db_monster_creature.rdb" );
if( !pRes ) return;
RDUReader reader;
if( reader.Open( pRes ) == false )
{
return;
}
RDURow row;
while( reader.Fetch( &row ) == true )
{
MonsterCreatureInfo mc;
::memset( &mc, 0, sizeof( mc ) );
typedef ColumnDataGetter< DECIMALToDouble< false > > ColGetter;
mc.nSid = ColGetter( row.At( "sid" ) ).ToInterger();
mc.nUseCode = ColGetter( row.At( "use_code" ) ).ToInterger();
for( int i = 0; i < _countof( mc.arSummonCode ); ++i )
{
char szColumnName[64] = "";
s_sprintf( szColumnName, _countof( szColumnName ), "summon_code_%d", i+1 );
mc.arSummonCode[i] = ColGetter( row.At( szColumnName ) ).ToInterger();
}
m_mapMonsterCreatureList.insert( std::make_pair( mc.nSid, mc ) );
}
KFileManager::Instance().DeleteStream( pRes );
}
int SMonstarCreatureDB::GetTameCode( int nSid )
{
auto pos = m_mapMonsterCreatureList.find( nSid );
if( pos != m_mapMonsterCreatureList.end() )
{
const MonsterCreatureInfo& mc = pos->second;
for( int i = 0; i < mc.nUseCode; ++i )
{
if( mc.arSummonCode[i] != 0 )
{
return mc.arSummonCode[i];
}
}
}
return 0;
}
SMonstarCreatureDB* SMonstarCreatureDB::m_pThis = NULL;
SMonstarCreatureDB & GetMonsterCreatureDB()
{
if( NULL == SMonstarCreatureDB::m_pThis )
SMonstarCreatureDB::m_pThis = new SMonstarCreatureDB;
return *SMonstarCreatureDB::m_pThis;
}