#include "stdafx.h" #include "SMotionDB.h" #include #include #include "KTypes.h" #include #include #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; }