823 lines
27 KiB
C++
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;
|
|
} |