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

823 lines
27 KiB
C++

#include "stdafx.h"
#include "SMotionDB.h"
#include <Windows.h>
#include <kfile/KStream.h>
#include "KTypes.h"
#include <kfile/KFileManager.h>
#include <toolkit/XStringUtil.h>
#include "SNetMessage.h"
//#include "Util.h"
#include "SLog.h"
#include "SDebug_Util.h"
extern HWND g_hWnd;
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
SMotionSetDB::SMotionSetDB()
{
Init();
}
SMotionSetDB::~SMotionSetDB()
{
Destroy();
}
void SMotionSetDB::Init()
{
Load();
}
void SMotionSetDB::Destroy()
{
_MOTION_SET* pMotionSet = NULL;
bool res;
res = m_hashMotionSet.get_first_value( pMotionSet );
while ( res )
{
if ( pMotionSet != NULL )
{
delete pMotionSet;
}
res = m_hashMotionSet.get_next_value( pMotionSet );
}
m_hashMotionSet.clear();
}
void SMotionSetDB::AddAniClass( _MOTION_SET * pMotionSet )
{
m_defAniSet.m_vANICLS_UNA.push_back( pMotionSet->szDeva_f_unarmored );//맨 손 0
m_defAniSet.m_vANICLS_SWO.push_back( pMotionSet->szDeva_f_one_hand_sword );//칼 한손 1
m_defAniSet.m_vANICLS_SWA.push_back( pMotionSet->szDeva_f_two_hand_sword );//칼 양손 2
m_defAniSet.m_vANICLS_SPA.push_back( pMotionSet->szDeva_f_two_hand_spear );//창 양손 3
m_defAniSet.m_vANICLS_BWA.push_back( pMotionSet->szDeva_f_bow );//활 양손 4
m_defAniSet.m_vANICLS_DGO.push_back( pMotionSet->szDeva_f_one_hand_dagger );//단검 한손 5
m_defAniSet.m_vANICLS_SWT.push_back( pMotionSet->szDeva_f_double_sword );//장검 이도류 6
m_defAniSet.m_vANICLS_DGT.push_back( pMotionSet->szDeva_f_double_dagger );//단검 이도류 7
m_defAniSet.m_vANICLS_SFO.push_back( pMotionSet->szDeva_f_one_hand_staff );//지팡이 한손 8
m_defAniSet.m_vANICLS_SFA.push_back( pMotionSet->szDeva_f_two_hand_staff );//지팡이 양손 9
m_defAniSet.m_vANICLS_AXO.push_back( pMotionSet->szDeva_f_one_hand_axe );//도끼 한손
m_defAniSet.m_vANICLS_AXA.push_back( pMotionSet->szDeva_f_two_hand_axe );//도끼 양손 10
m_defAniSet.m_vANICLS_AXT.push_back( pMotionSet->szDeva_f_double_axe );//도끼 이도류
m_defAniSet.m_vANICLS_MAO.push_back( pMotionSet->szDeva_f_one_hand_mace );//둔기 한손 11
m_defAniSet.m_vANICLS_MAA.push_back( pMotionSet->szDeva_f_two_hand_mace );//둔기 양손 12
m_defAniSet.m_vANICLS_CBO.push_back( pMotionSet->szDeva_f_cross_bow );//석궁 한손 13
m_demAniSet.m_vANICLS_UNA.push_back( pMotionSet->szDeva_m_unarmored );//맨 손 0
m_demAniSet.m_vANICLS_SWO.push_back( pMotionSet->szDeva_m_one_hand_sword );//칼 한손 1
m_demAniSet.m_vANICLS_SWA.push_back( pMotionSet->szDeva_m_two_hand_sword );//칼 양손 2
m_demAniSet.m_vANICLS_SPA.push_back( pMotionSet->szDeva_m_two_hand_spear );//창 양손 3
m_demAniSet.m_vANICLS_BWA.push_back( pMotionSet->szDeva_m_bow );//활 양손 4
m_demAniSet.m_vANICLS_DGO.push_back( pMotionSet->szDeva_m_one_hand_dagger );//단검 한손 5
m_demAniSet.m_vANICLS_SWT.push_back( pMotionSet->szDeva_m_double_sword );//장검 이도류 6
m_demAniSet.m_vANICLS_DGT.push_back( pMotionSet->szDeva_m_double_dagger );//단검 이도류 7
m_demAniSet.m_vANICLS_SFO.push_back( pMotionSet->szDeva_m_one_hand_staff );//지팡이 한손 8
m_demAniSet.m_vANICLS_SFA.push_back( pMotionSet->szDeva_m_two_hand_staff );//지팡이 양손 9
m_demAniSet.m_vANICLS_AXO.push_back( pMotionSet->szDeva_m_one_hand_axe );//도끼 한손
m_demAniSet.m_vANICLS_AXA.push_back( pMotionSet->szDeva_m_two_hand_axe );//도끼 양손 10
m_demAniSet.m_vANICLS_AXT.push_back( pMotionSet->szDeva_m_double_axe );//도끼 이도류
m_demAniSet.m_vANICLS_MAO.push_back( pMotionSet->szDeva_m_one_hand_mace );//둔기 한손 11
m_demAniSet.m_vANICLS_MAA.push_back( pMotionSet->szDeva_m_two_hand_mace );//둔기 양손 12
m_demAniSet.m_vANICLS_CBO.push_back( pMotionSet->szDeva_m_cross_bow );//석궁 한손 13
m_asfAniSet.m_vANICLS_UNA.push_back( pMotionSet->szAsura_f_unarmored );//맨 손 0
m_asfAniSet.m_vANICLS_SWO.push_back( pMotionSet->szAsura_f_one_hand_sword );//칼 한손 1
m_asfAniSet.m_vANICLS_SWA.push_back( pMotionSet->szAsura_f_two_hand_sword );//칼 양손 2
m_asfAniSet.m_vANICLS_SPA.push_back( pMotionSet->szAsura_f_two_hand_spear );//창 양손 3
m_asfAniSet.m_vANICLS_BWA.push_back( pMotionSet->szAsura_f_bow );//활 양손 4
m_asfAniSet.m_vANICLS_DGO.push_back( pMotionSet->szAsura_f_one_hand_dagger );//단검 한손 5
m_asfAniSet.m_vANICLS_SWT.push_back( pMotionSet->szAsura_f_double_sword );//장검 이도류 6
m_asfAniSet.m_vANICLS_DGT.push_back( pMotionSet->szAsura_f_double_dagger );//단검 이도류 7
m_asfAniSet.m_vANICLS_SFO.push_back( pMotionSet->szAsura_f_one_hand_staff );//지팡이 한손 8
m_asfAniSet.m_vANICLS_SFA.push_back( pMotionSet->szAsura_f_two_hand_staff );//지팡이 양손 9
m_asfAniSet.m_vANICLS_AXO.push_back( pMotionSet->szAsura_f_one_hand_axe );//도끼 한손
m_asfAniSet.m_vANICLS_AXA.push_back( pMotionSet->szAsura_f_two_hand_axe );//도끼 양손 10
m_asfAniSet.m_vANICLS_AXT.push_back( pMotionSet->szAsura_f_double_axe );//도끼 이도류
m_asfAniSet.m_vANICLS_MAO.push_back( pMotionSet->szAsura_f_one_hand_mace );//둔기 한손 11
m_asfAniSet.m_vANICLS_MAA.push_back( pMotionSet->szAsura_f_two_hand_mace );//둔기 양손 12
m_asfAniSet.m_vANICLS_CBO.push_back( pMotionSet->szAsura_f_cross_bow );//석궁 한손 13
m_asmAniSet.m_vANICLS_UNA.push_back( pMotionSet->szAsura_m_unarmored );//맨 손 0
m_asmAniSet.m_vANICLS_SWO.push_back( pMotionSet->szAsura_m_one_hand_sword );//칼 한손 1
m_asmAniSet.m_vANICLS_SWA.push_back( pMotionSet->szAsura_m_two_hand_sword );//칼 양손 2
m_asmAniSet.m_vANICLS_SPA.push_back( pMotionSet->szAsura_m_two_hand_spear );//창 양손 3
m_asmAniSet.m_vANICLS_BWA.push_back( pMotionSet->szAsura_m_bow );//활 양손 4
m_asmAniSet.m_vANICLS_DGO.push_back( pMotionSet->szAsura_m_one_hand_dagger );//단검 한손 5
m_asmAniSet.m_vANICLS_SWT.push_back( pMotionSet->szAsura_m_double_sword );//장검 이도류 6
m_asmAniSet.m_vANICLS_DGT.push_back( pMotionSet->szAsura_m_double_dagger );//단검 이도류 7
m_asmAniSet.m_vANICLS_SFO.push_back( pMotionSet->szAsura_m_one_hand_staff );//지팡이 한손 8
m_asmAniSet.m_vANICLS_SFA.push_back( pMotionSet->szAsura_m_two_hand_staff );//지팡이 양손 9
m_asmAniSet.m_vANICLS_AXO.push_back( pMotionSet->szAsura_m_one_hand_axe );//도끼 한손
m_asmAniSet.m_vANICLS_AXA.push_back( pMotionSet->szAsura_m_two_hand_axe );//도끼 양손 10
m_asmAniSet.m_vANICLS_AXT.push_back( pMotionSet->szAsura_m_double_axe );//도끼 이도류
m_asmAniSet.m_vANICLS_MAO.push_back( pMotionSet->szAsura_m_one_hand_mace );//둔기 한손 11
m_asmAniSet.m_vANICLS_MAA.push_back( pMotionSet->szAsura_m_two_hand_mace );//둔기 양손 12
m_asmAniSet.m_vANICLS_CBO.push_back( pMotionSet->szAsura_m_cross_bow );//석궁 한손 13
m_gafAniSet.m_vANICLS_UNA.push_back( pMotionSet->szGaia_f_unarmored );//맨 손 0
m_gafAniSet.m_vANICLS_SWO.push_back( pMotionSet->szGaia_f_one_hand_sword );//칼 한손 1
m_gafAniSet.m_vANICLS_SWA.push_back( pMotionSet->szGaia_f_two_hand_sword );//칼 양손 2
m_gafAniSet.m_vANICLS_SPA.push_back( pMotionSet->szGaia_f_two_hand_spear );//창 양손 3
m_gafAniSet.m_vANICLS_BWA.push_back( pMotionSet->szGaia_f_bow );//활 양손 4
m_gafAniSet.m_vANICLS_DGO.push_back( pMotionSet->szGaia_f_one_hand_dagger );//단검 한손 5
m_gafAniSet.m_vANICLS_SWT.push_back( pMotionSet->szGaia_f_double_sword );//장검 이도류 6
m_gafAniSet.m_vANICLS_DGT.push_back( pMotionSet->szGaia_f_double_dagger );//단검 이도류 7
m_gafAniSet.m_vANICLS_SFO.push_back( pMotionSet->szGaia_f_one_hand_staff );//지팡이 한손 8
m_gafAniSet.m_vANICLS_SFA.push_back( pMotionSet->szGaia_f_two_hand_staff );//지팡이 양손 9
m_gafAniSet.m_vANICLS_AXO.push_back( pMotionSet->szGaia_f_one_hand_axe );//도끼 한손
m_gafAniSet.m_vANICLS_AXA.push_back( pMotionSet->szGaia_f_two_hand_axe );//도끼 양손 10
m_gafAniSet.m_vANICLS_AXT.push_back( pMotionSet->szGaia_f_double_axe );//도끼 이도류
m_gafAniSet.m_vANICLS_MAO.push_back( pMotionSet->szGaia_f_one_hand_mace );//둔기 한손 11
m_gafAniSet.m_vANICLS_MAA.push_back( pMotionSet->szGaia_f_two_hand_mace );//둔기 양손 12
m_gafAniSet.m_vANICLS_CBO.push_back( pMotionSet->szGaia_f_cross_bow );//석궁 한손 13
m_gamAniSet.m_vANICLS_UNA.push_back( pMotionSet->szGaia_m_unarmored );//맨 손 0
m_gamAniSet.m_vANICLS_SWO.push_back( pMotionSet->szGaia_m_one_hand_sword );//칼 한손 1
m_gamAniSet.m_vANICLS_SWA.push_back( pMotionSet->szGaia_m_two_hand_sword );//칼 양손 2
m_gamAniSet.m_vANICLS_SPA.push_back( pMotionSet->szGaia_m_two_hand_spear );//창 양손 3
m_gamAniSet.m_vANICLS_BWA.push_back( pMotionSet->szGaia_m_bow );//활 양손 4
m_gamAniSet.m_vANICLS_DGO.push_back( pMotionSet->szGaia_m_one_hand_dagger );//단검 한손 5
m_gamAniSet.m_vANICLS_SWT.push_back( pMotionSet->szGaia_m_double_sword );//장검 이도류 6
m_gamAniSet.m_vANICLS_DGT.push_back( pMotionSet->szGaia_m_double_dagger );//단검 이도류 7
m_gamAniSet.m_vANICLS_SFO.push_back( pMotionSet->szGaia_m_one_hand_staff );//지팡이 한손 8
m_gamAniSet.m_vANICLS_SFA.push_back( pMotionSet->szGaia_m_two_hand_staff );//지팡이 양손 9
m_gamAniSet.m_vANICLS_AXO.push_back( pMotionSet->szGaia_m_one_hand_axe );//도끼 한손
m_gamAniSet.m_vANICLS_AXA.push_back( pMotionSet->szGaia_m_two_hand_axe );//도끼 양손 10
m_gamAniSet.m_vANICLS_AXT.push_back( pMotionSet->szGaia_m_double_axe );//도끼 이도류
m_gamAniSet.m_vANICLS_MAO.push_back( pMotionSet->szGaia_m_one_hand_mace );//둔기 한손 11
m_gamAniSet.m_vANICLS_MAA.push_back( pMotionSet->szGaia_m_two_hand_mace );//둔기 양손 12
m_gamAniSet.m_vANICLS_CBO.push_back( pMotionSet->szGaia_m_cross_bow );//석궁 한손 13
<<<<<<< HEAD
m_asmAniSet.m_vANICLS_CBT.push_back(pMotionSet->szAsura_m_double_crossbow); //Double Crossbow
m_asfAniSet.m_vANICLS_CBT.push_back(pMotionSet->szAsura_f_double_crossbow); //Double Crossbow
=======
m_asmAniSet.m_vANICLS_CBT.push_back(pMotionSet->szAsura_m_double_crossbow);
m_asfAniSet.m_vANICLS_CBT.push_back(pMotionSet->szAsura_f_double_crossbow);
>>>>>>> a34328224e914a577b99c79ec6e8ffbcea554a05
}
void SMotionSetDB::Load()
{
KStream * pRes = KFileManager::Instance().CreateStreamFromResource( "db_MotionSet.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(_MOTION_SET) * 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++ )
{
_MOTION_SET * pMotionSet = new _MOTION_SET;
pRes->Read( pMotionSet, sizeof(_MOTION_SET) );
if( pMotionSet->nID <= 0 ) continue;
_MOTION_SET * pFindSkill = NULL;
if( m_hashMotionSet.lookup( pMotionSet->nID, pFindSkill ) == false )
{
AddAniClass( pMotionSet );
m_hashMotionSet.add( pMotionSet->nID, pMotionSet );
}
else
{
SDEBUGLOG( "[SMotionSetDB] 모션 Set ID 중복입니다. 정보는 무시 됩니다. - [%u]", pMotionSet->nID );
SAFE_DELETE( pMotionSet );
assert( NULL );
}
}
KFileManager::Instance().DeleteStream( pRes );
}
/// 2010.11.30 - prodongi
std::vector< int > * SMotionSetDB::GetAniClass( int nClan, int nSex, int nAniClass )
{
switch( nClan )
{
case GCLAN_GAIA :
{
if( nSex == SEX_FEMALE )
return m_gafAniSet.GetAniSet( nAniClass );
else if( nSex == SEX_MALE )
return m_gamAniSet.GetAniSet( nAniClass );
}
break;
case GCLAN_DEVA :
{
if( nSex == SEX_FEMALE )
return m_defAniSet.GetAniSet( nAniClass );
else if( nSex == SEX_MALE )
return m_demAniSet.GetAniSet( nAniClass );
}
break;
case GCLAN_ASURA :
{
if( nSex == SEX_FEMALE )
return m_asfAniSet.GetAniSet( nAniClass );
else if( nSex == SEX_MALE )
return m_asmAniSet.GetAniSet( nAniClass );
}
break;
}
return NULL;
}
/// 2010.11.30 - prodongi
int SMotionSetDB::GetAniId( int nObjType, int nMotionID, int nRace, int nSex, int nAniClass )
{
if( nObjType == TS_ENTER::GAME_PLAYER )
{
_MOTION_SET* pMotionSet = GetMotionSet( nMotionID );
if( pMotionSet )
{
return pMotionSet->GetAniId( nRace, nSex, nAniClass );
}
}
else if( nObjType == TS_ENTER::GAME_SUMMON || nObjType == TS_ENTER::GAME_MOB )
{
}
else if( nObjType == TS_ENTER::GAME_NPC )
{
}
return 0;
}
const char * SMotionSetDB::GetAni( int nObjType, int nMotionID, int nRace, int nSex, int nAniClass )
{
int motionid = GetAniId(nObjType, nMotionID, nRace, nSex, nAniClass);
if (0 < motionid)
return GetCharacterMotionEventDB().getFileName(motionid);
return "NotFoundAniName";
}
_MOTION_SET* SMotionSetDB::GetMotionSet( int nMotionID )
{
_MOTION_SET * pFindSkill = NULL;
if( m_hashMotionSet.lookup( nMotionID, pFindSkill ) == false )
{
_oprint( "Design resource error: motion list %d\n", nMotionID );
return NULL;
}
return pFindSkill;
}
SMotionSetDB* SMotionSetDB::m_pThis = NULL;
SMotionSetDB & GetMotionSetDB()
{
if( NULL == SMotionSetDB::m_pThis )
SMotionSetDB::m_pThis = new SMotionSetDB;
return *SMotionSetDB::m_pThis;
}
//////////////////////////////////////////////////////////////////////////
SMonsterMotionSetDB::SMonsterMotionSetDB()
{
Init();
}
SMonsterMotionSetDB::~SMonsterMotionSetDB()
{
Destroy();
}
void SMonsterMotionSetDB::Init()
{
Load();
}
void SMonsterMotionSetDB::Destroy()
{
_MOTION_SET_MONSTER* pMotionSet = NULL;
bool res;
res = m_hashMotionSet.get_first_value( pMotionSet );
while ( res )
{
if ( pMotionSet != NULL )
{
delete pMotionSet;
}
res = m_hashMotionSet.get_next_value( pMotionSet );
}
m_hashMotionSet.clear();
}
void SMonsterMotionSetDB::Load()
{
KStream * pRes = KFileManager::Instance().CreateStreamFromResource( "db_MonsterMotionSet.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(_MOTION_SET_MONSTER) * 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++ )
{
_MOTION_SET_MONSTER * pMotionSet = new _MOTION_SET_MONSTER;
pRes->Read( pMotionSet, sizeof(_MOTION_SET_MONSTER) );
_MOTION_SET_MONSTER * pFind = NULL;
if( m_hashMotionSet.lookup( pMotionSet->character_id, pFind ) == false )
{
m_hashMotionSet.add( pMotionSet->character_id, pMotionSet );
}
else
{
SDEBUGLOG( "[SMonsterMotionSetDB] 몬스터 모션 Set ID 중복입니다. 정보는 무시 됩니다. - [%u]", pMotionSet->character_id );
SAFE_DELETE( pMotionSet );
assert( NULL );
}
}
KFileManager::Instance().DeleteStream( pRes );
}
/// 2010.11.30 - prodongi
int SMonsterMotionSetDB::GetAniId( int nMotionID, int nAniIndex )
{
_MOTION_SET_MONSTER* pMotion = GetMotionSet( nMotionID );
if( pMotion )
{
return pMotion->GetAniId( nAniIndex );
}
return 0;
}
const char * SMonsterMotionSetDB::GetAni( int nMotionID, int nAniIndex )
{
int motionid = GetAniId(nMotionID, nAniIndex);
if (0 < motionid)
return GetCharacterMotionEventDB().getFileName(motionid);
return "NotFoundAniName";
}
_MOTION_SET_MONSTER* SMonsterMotionSetDB::GetMotionSet( int nMotionID )
{
_MOTION_SET_MONSTER * pFind = NULL;
if( m_hashMotionSet.lookup( nMotionID, pFind ) == false )
{
_oprint( "기획 리소스 에러 : 모션 리스트 %d\n", nMotionID );
// assert( 0 && "모션 리스트 얻기 실패!!!" );
return NULL;
}
return pFind;
}
SMonsterMotionSetDB* SMonsterMotionSetDB::m_pThis = NULL;
SMonsterMotionSetDB & GetMonsterMotionSetDB()
{
if( NULL == SMonsterMotionSetDB::m_pThis )
SMonsterMotionSetDB::m_pThis = new SMonsterMotionSetDB;
return *SMonsterMotionSetDB::m_pThis;
// static SMonsterMotionSetDB monstermotionsetdb;
// return monstermotionsetdb;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
SCharacterMotionDB::SCharacterMotionDB()
{
Init();
}
SCharacterMotionDB::~SCharacterMotionDB()
{
Destroy();
}
void SCharacterMotionDB::Init()
{
Load();
}
void SCharacterMotionDB::Destroy()
{
SAFE_DELETE_VECTOR( m_vCharacterMototionList );
m_hashCharacterMotoiion.clear();
m_hashCharacterMotoiionEvent.clear();
}
_CHARACTER_MOTION* SCharacterMotionDB::GetAniEvent( const char * pAniName )
{
_CHARACTER_MOTION * pFindSkill = NULL;
if( m_hashCharacterMotoiionEvent.lookup( pAniName, pFindSkill ) == false )
{
//_oprint( "[_CHARACTER_MOTION* SCharacterMotionDB::GetAniEvent( const char * pAniName )]: Planning Resource Error: Failed to get motion event list %s\n", pAniName );
// assert( 0 && "모션 Event 리스트 얻기 실패!!!" ); //!!
return NULL;
}
return pFindSkill;
}
_CHARACTER_MOTION* SCharacterMotionDB::GetAniEvent( int nMotionID )
{
/// 0으로 들어가 있는 것은 정상 설정 값이다 - prodongi
if (0 == nMotionID)
return NULL;
_CHARACTER_MOTION * pFindSkill = NULL;
if( m_hashCharacterMotoiion.lookup( nMotionID, pFindSkill ) == false )
{
//_oprint( "[_CHARACTER_MOTION* SCharacterMotionDB::GetAniEvent( int nMotionID )]: Planning Resource Error: Motion Event List %d\n", nMotionID );
return NULL;
}
return pFindSkill;
}
/// 2010.11.30 - prodongi
char const* SCharacterMotionDB::getFileName(int motionid)
{
_CHARACTER_MOTION* motion = GetAniEvent(motionid);
return (motion) ? motion->szFile_Name : "NotFoundAniName";
}
void SCharacterMotionDB::Load()
{
KStream * pRes = KFileManager::Instance().CreateStreamFromResource( "db_CharacterMotion.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(_CHARACTER_MOTION) * 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++ )
{
_CHARACTER_MOTION * pCharMotion = new _CHARACTER_MOTION;
pRes->Read( pCharMotion, sizeof(_CHARACTER_MOTION) );
if( pCharMotion->nMotion_ID <= 0 )
{
delete pCharMotion;
continue;
}
bool bMotionID = false, bFileName = false;
{
_CHARACTER_MOTION * pFindSkill = NULL;
if( m_hashCharacterMotoiion.lookup( pCharMotion->nMotion_ID, pFindSkill ) == false )
{
m_hashCharacterMotoiion.add( pCharMotion->nMotion_ID, pCharMotion );
}
else
{
_oprint( "!!!!Data Error CharacterMotion Code 가 중복되었습니다.!!!! %d\n", pCharMotion->nMotion_ID );
// assert(0); //기획팀에 알려 주세여. 바로 수정 해야 합니다.
bMotionID = true;
}
}
{
_CHARACTER_MOTION * pFindSkill = NULL;
if( m_hashCharacterMotoiionEvent.lookup( pCharMotion->szFile_Name, pFindSkill ) == false )
{
m_hashCharacterMotoiionEvent.add( pCharMotion->szFile_Name, pCharMotion );
}
else
{
// 모션 코드 파일 이름은 중복되어도 상관 없는거 같은데 왜 에러 로그를 출력할까.. 일단 주석
//_oprint( "!!!!Data Error CharacterMotion Code 가 중복되었습니다.!!!! %s\n", pCharMotion->szFile_Name );
bFileName = true;
}
}
if( bMotionID )
{
SDEBUGLOG( "[SCharacterMotionDB] 모션 ID 중복입니다. 정보는 무시 됩니다. - [%u]", pCharMotion->nMotion_ID );
SAFE_DELETE( pCharMotion );
assert( NULL );
}
m_vCharacterMototionList.push_back( pCharMotion );
}
KFileManager::Instance().DeleteStream( pRes );
}
SCharacterMotionDB* SCharacterMotionDB::m_pThis = NULL;
SCharacterMotionDB & GetCharacterMotionEventDB()
{
if( NULL == SCharacterMotionDB::m_pThis )
SCharacterMotionDB::m_pThis = new SCharacterMotionDB;
return *SCharacterMotionDB::m_pThis;
// static SCharacterMotionDB CharMotionDB;
// return CharMotionDB;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
SMotionEventHanderDB::SMotionEventHanderDB()
{
Init();
}
SMotionEventHanderDB::~SMotionEventHanderDB()
{
Destroy();
}
void SMotionEventHanderDB::Init()
{
Load();
}
void SMotionEventHanderDB::Destroy()
{
_MOTION_EVENT_HANDER* pMotionEvent = NULL;
bool res;
res = m_hashMotionEventHander.get_first_value( pMotionEvent );
while ( res )
{
if ( pMotionEvent != NULL )
{
delete pMotionEvent;
}
res = m_hashMotionEventHander.get_next_value( pMotionEvent );
}
m_hashMotionEventHander.clear();
}
_MOTION_EVENT_HANDER * SMotionEventHanderDB::GetScript( int nHandleID )
{
_MOTION_EVENT_HANDER * pFindSkill = NULL;
if( m_hashMotionEventHander.lookup( nHandleID, pFindSkill ) == false )
{
_oprint( "Planning data error - Event handle missing: %d\n", nHandleID );
}
return pFindSkill;
}
void SMotionEventHanderDB::Load()
{
KStream * pRes = KFileManager::Instance().CreateStreamFromResource( "db_MotionEventHander.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(_MOTION_EVENT_HANDER) * 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++ )
{
_MOTION_EVENT_HANDER * pMotionEvent = new _MOTION_EVENT_HANDER;
pRes->Read( pMotionEvent, sizeof(_MOTION_EVENT_HANDER) );
if( _stricmp( pMotionEvent->szScript, "0" ) == 0 )
{
delete pMotionEvent;
continue;
}
if( pMotionEvent->nID == 0 )
{
delete pMotionEvent;
continue;
}
_MOTION_EVENT_HANDER * pFindSkill = NULL;
if( m_hashMotionEventHander.lookup( pMotionEvent->nID, pFindSkill ) == false )
{
m_hashMotionEventHander.add( pMotionEvent->nID, pMotionEvent );
}
else
{
_oprint( "!!!!Data Error: MotionEventHandler code is duplicated!!!! %d\n", pMotionEvent->nID );
delete pMotionEvent;
}
}
KFileManager::Instance().DeleteStream( pRes );
}
SMotionEventHanderDB* SMotionEventHanderDB::m_pThis = NULL;
SMotionEventHanderDB & GetMotionEventHanderDB()
{
if( NULL == SMotionEventHanderDB::m_pThis )
SMotionEventHanderDB::m_pThis = new SMotionEventHanderDB;
return *SMotionEventHanderDB::m_pThis;
// static SMotionEventHanderDB MotionEventHanderDB;
// return MotionEventHanderDB;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
SMotionFxSetDB::SMotionFxSetDB()
{
Init();
}
SMotionFxSetDB::~SMotionFxSetDB()
{
Destroy();
}
void SMotionFxSetDB::Init()
{
Load();
}
void SMotionFxSetDB::Destroy()
{
_MOTION_FX_SET* pMotionFxSet = NULL;
bool res;
res = m_hashMotionFxSet.get_first_value( pMotionFxSet );
while ( res )
{
if ( pMotionFxSet != NULL )
{
delete pMotionFxSet;
}
res = m_hashMotionFxSet.get_next_value( pMotionFxSet );
}
m_hashMotionFxSet.clear();
}
_MOTION_FX_SET* SMotionFxSetDB::GetFXSet( int nFX_ID )
{
_MOTION_FX_SET* pFind = NULL;
if( m_hashMotionFxSet.lookup( nFX_ID, pFind ) == false )
{
_oprint( "기획 데이타 에러 : FX_SET 없음\n", nFX_ID );
// assert( 0 && "기획 데이타 에러 : FX_SET 없음" );
}
return pFind;
}
void SMotionFxSetDB::Load()
{
KStream * pRes = KFileManager::Instance().CreateStreamFromResource( "db_MotionFxSet.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(_MOTION_FX_SET) * 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++ )
{
_MOTION_FX_SET * pMotionFxSet = new _MOTION_FX_SET;
pRes->Read( pMotionFxSet, sizeof(_MOTION_FX_SET) );
_MOTION_FX_SET * pFindSkill = NULL;
if( m_hashMotionFxSet.lookup( pMotionFxSet->nID, pFindSkill ) == false )
{
pMotionFxSet->SetInfo();
m_hashMotionFxSet.add( pMotionFxSet->nID, pMotionFxSet );
}
else
{
_oprint( "!!!!Data Error MotionFxSet Code 가 중복되었습니다.!!!! %d\n", pMotionFxSet->nID );
SAFE_DELETE( pMotionFxSet );
assert(0); //기획팀에 알려 주세여. 바로 수정 해야 합니다.
}
}
KFileManager::Instance().DeleteStream( pRes );
}
SMotionFxSetDB* SMotionFxSetDB::m_pThis = NULL;
SMotionFxSetDB & GetMotionFxSetDB()
{
if( NULL == SMotionFxSetDB::m_pThis )
SMotionFxSetDB::m_pThis = new SMotionFxSetDB;
return *SMotionFxSetDB::m_pThis;
// static SMotionFxSetDB MotionFxSetDB;
// return MotionFxSetDB;
}