#include "stdafx.h" #include "ObjectManager.h" // #include #include ////////////////////////////////////////////////////////////////////////// // ObjectManager* ObjectManager::m_pInstance = NULL; struct sOBJTYPE_PAIR { GAME_OBJECT::TYPE eTYPE; eWISE_OBJECT_INDEX eOBJTYPE; }; const sOBJTYPE_PAIR OBJPAIR_TABLE[GAME_OBJECT::GOBJ_MAX] = { { GAME_OBJECT::GOBJ_USER, OBJTYPE_USER }, { GAME_OBJECT::GOBJ_PLAYER, OBJTYPE_PLAYER }, { GAME_OBJECT::GOBJ_MONSTER, OBJTYPE_MONSTER }, }; static const DWORD OBJPAIR_UPPERBOUND = sizeof(OBJPAIR_TABLE)/sizeof(sOBJTYPE_PAIR); inline static GAME_OBJECT::TYPE OBJTYPE_2_GAME_OBJTYPE(eWISE_OBJECT_INDEX eTYPE) { sOBJTYPE_PAIR* pOFFSET = (sOBJTYPE_PAIR*)OBJPAIR_TABLE; for(DWORD dwIdx=0 ; dwIdxeOBJTYPE == eTYPE) return pOFFSET->eTYPE; } return GAME_OBJECT::GOBJ_MAX; } inline static eWISE_OBJECT_INDEX GAME_OBJTYPE_2_OBJTYPE(GAME_OBJECT::TYPE eTYPE) { sOBJTYPE_PAIR* pOFFSET = (sOBJTYPE_PAIR*)OBJPAIR_TABLE; for(DWORD dwIdx=0 ; dwIdxeTYPE == eTYPE) return pOFFSET->eOBJTYPE; } return OBJTYPE_MAX; } ////////////////////////////////////////////////////////////////////////// // ObjectManager::ObjectManager() { } ObjectManager::~ObjectManager() { } void ObjectManager::CreateInstance() { m_pInstance = new ObjectManager(); sSIG_OBJCTRL sSIG; sSIG.SUBTYPE() = sSIG_OBJCTRL::ST_ENTER; sSIG.OBJTYPE() = OBJTYPE_USER; sSIG.OBJECT_KEY() = 10; m_pInstance->OnMsg(&sSIG); } void ObjectManager::DestroyInstance() { SAFE_DELETE(m_pInstance); } ////////////////////////////////////////////////////////////////////////// // BOOL ObjectManager::ObjectManagerUpdater::DoInit() { return TRUE; } BOOL ObjectManager::ObjectManagerUpdater::DoProcess() { return TRUE; } BOOL ObjectManager::ObjectManagerUpdater::IsComplete() { return FALSE; } BOOL ObjectManager::ObjectManagerUpdater::DoRelease() { return TRUE; } void ObjectManager::ObjectManagerUpdater::OnMsg(sSIG_MSG* pSIG_MSG) { sSIG_OBJCTRL& rMSG = *(sSIG_OBJCTRL*)pSIG_MSG; if(rMSG.SIGTYPE() != eSIG_WISEMSG::GAMEOBJ_CONTROL) return; ObjectManager& rMANAGER = *m_pInstance; RenderObject* pOBJECT = rMANAGER.FindObject(rMSG.OBJECT_KEY()); eWISE_OBJECT_INDEX eOBJTYPE = rMSG.OBJTYPE(); BYTE streamOBJ[20]; OBJ_OP_BASE* pHANDLER = NULL; switch(eOBJTYPE) { case OBJTYPE_USER: pHANDLER = new (streamOBJ) OBJ_OP_USER(pOBJECT); break; case OBJTYPE_PLAYER: pHANDLER = new (streamOBJ) OBJ_OP_PLAYER(pOBJECT); break; case OBJTYPE_MONSTER: pHANDLER = new (streamOBJ) OBJ_OP_MONSTER(pOBJECT); break; default: pHANDLER = new (streamOBJ) OBJ_OP_BASE(pOBJECT); break; } eWISESUBTYPE eSUBTYPE = rMSG.SUBTYPE(); switch(eSUBTYPE) { case sSIG_OBJCTRL::ST_RENDERINFO: pHANDLER->OnRenderInfo(rMANAGER, rMSG); break; case sSIG_OBJCTRL::ST_ENTER: pHANDLER->OnEnter(rMANAGER, rMSG); break; case sSIG_OBJCTRL::ST_LEAVE: pHANDLER->OnLeave(rMANAGER, rMSG); break; case sSIG_OBJCTRL::ST_ATTACK: pHANDLER->OnAttack(rMANAGER, rMSG); break; case sSIG_OBJCTRL::ST_MOVE: pHANDLER->OnMove(rMANAGER, rMSG); break; case sSIG_OBJCTRL::ST_STATUS: pHANDLER->OnStatus(rMANAGER, rMSG); break; default: DEBUG_INTERRUPT(); return; } } ////////////////////////////////////////////////////////////////////////// // RenderObject* ObjectManager::FindObject(DWORD dwObjectKey) { ObjectManager& rMANAGER = *m_pInstance; GAME_OBJECT_MAP& rMAP = rMANAGER.m_OBJMAP; GAME_OBJECT_MAP_IT itFIND = rMAP.find(dwObjectKey); if(itFIND != rMAP.end()) { RenderObject* pOBJECT = itFIND->second; return pOBJECT; } return NULL; } BOOL ObjectManager::RegisterObject(RenderObject* pOBJECT) { ObjectManager& rMANAGER = *m_pInstance; GAME_OBJECT_MAP& rMAP = rMANAGER.m_OBJMAP; DWORD dwObjectKey = pOBJECT->GetObjectKey(); if(!dwObjectKey) return FALSE; rMAP.insert(make_pair(dwObjectKey, pOBJECT)); return TRUE; } BOOL ObjectManager::UnRegisterObject(RenderObject* pOBJECT) { ObjectManager& rMANAGER = *m_pInstance; GAME_OBJECT_MAP& rMAP = rMANAGER.m_OBJMAP; DWORD dwObjectKey = pOBJECT->GetObjectKey(); BOOL bRET = rMAP.erase(dwObjectKey) ? TRUE : FALSE; return bRET; } RenderObject* ObjectManager::AllocObject(GAME_OBJECT::TYPE eOBJTYPE) { ObjectPoolRouter* pROUTER = ObjectPoolRouter::Instance(); eWISE_OBJECT_INDEX eIDX = GAME_OBJECT::GOBJ_USER == eOBJTYPE ? OBJTYPE_USER : GAME_OBJECT::GOBJ_PLAYER == eOBJTYPE ? OBJTYPE_PLAYER : GAME_OBJECT::GOBJ_MONSTER == eOBJTYPE ? OBJTYPE_MONSTER : OBJTYPE_MAX ; RenderObject* pOBJECT = (RenderObject*)pROUTER->Alloc(eIDX); return pOBJECT; } BOOL ObjectManager::FreeObject(RenderObject* pOBJECT) { ObjectPoolRouter* pROUTER = ObjectPoolRouter::Instance(); GAME_OBJECT::TYPE eOBJTYPE = pOBJECT->GetObjectType(); eWISE_OBJECT_INDEX eIDX = GAME_OBJECT::GOBJ_USER == eOBJTYPE ? OBJTYPE_USER : GAME_OBJECT::GOBJ_PLAYER == eOBJTYPE ? OBJTYPE_PLAYER : GAME_OBJECT::GOBJ_MONSTER == eOBJTYPE ? OBJTYPE_MONSTER : OBJTYPE_MAX ; return pROUTER->Free(eIDX, pOBJECT); } //void ObjectManager::OnEnter(sSIG_OBJCTRL* pSIG_MSG) //{ //} // //void ObjectManager::OnLeave(sSIG_OBJCTRL* pSIG_MSG) //{ //} // //void ObjectManager::OnAttack(sSIG_OBJCTRL* pSIG_MSG) //{ //} // //void ObjectManager::OnMove(sSIG_OBJCTRL* pSIG_MSG) //{ //} // //void ObjectManager::OnStatus(sSIG_OBJCTRL* pSIG_MSG) //{ //} //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦´ // // Object* °¡ NULLÀÎ °æ¿ì, ½Å±Ô·Î ¼³Á¤ÇØ ÁØ´Ù. OBJCTRL_HANDLER_IMPL(OBJ_OP_BASE, RenderInfo) { if(m_pOBJECT) return; m_pOBJECT = ObjectManager::FindObject(rSIG_MSG.OBJECT_KEY()); if(m_pOBJECT) return; GAME_OBJECT::TYPE eTYPE = OBJTYPE_2_GAME_OBJTYPE(rSIG_MSG.OBJTYPE()); m_pOBJECT = rMANAGER.AllocObject(eTYPE); m_pOBJECT->Init(); } OBJCTRL_HANDLER_IMPL(OBJ_OP_BASE, Enter) { } OBJCTRL_HANDLER_IMPL(OBJ_OP_BASE, Leave) { if(m_pOBJECT) { GAME_OBJECT::TYPE eTYPE = OBJTYPE_2_GAME_OBJTYPE(rSIG_MSG.OBJTYPE()); rMANAGER.UnRegisterObject(m_pOBJECT); m_pOBJECT->Release(); rMANAGER.FreeObject(m_pOBJECT); m_pOBJECT = NULL; } } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦´ // // OBJCTRL_HANDLER_IMPL(OBJ_OP_USER, RenderInfo) { OBJ_OP_BASE::OnRenderInfo(rMANAGER, rSIG_MSG); // OBJECT KEY rMANAGER.RegisterObject(m_pOBJECT); } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦´ // // OBJCTRL_HANDLER_IMPL(OBJ_OP_PLAYER, RenderInfo) { OBJ_OP_BASE::OnRenderInfo(rMANAGER, rSIG_MSG); // OBJECT KEY rMANAGER.RegisterObject(m_pOBJECT); } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦´ // // OBJCTRL_HANDLER_IMPL(OBJ_OP_MONSTER, RenderInfo) { const WORD PROTOCOL_MSG_CG_SYNC_MONSTER_ENTER_BRD = MAKEWORD(CG_SYNC, CG_SYNC_MONSTER_ENTER_BRD); const WORD PROTOCOL_MSG_CG_SYNC_MONSTER_DIR_ENTER_BRD = MAKEWORD(CG_SYNC, CG_SYNC_MONSTER_DIR_ENTER_BRD); const WORD PROTOCOL_MSG_CG_SYNC_ALLMONSTERS_CMD = MAKEWORD(CG_SYNC, CG_SYNC_ALLMONSTERS_CMD); const WORD PROTOCOL_MSG_CG_SYNC_MAPNPC_ENTER_BRD = MAKEWORD(CG_SYNC, CG_SYNC_MAPNPC_ENTER_BRD); const WORD PROTOCOL_MSG_CG_SYNC_SUMMONED_ENTER_BRD = MAKEWORD(CG_SYNC, CG_SYNC_SUMMONED_ENTER_BRD); const WORD PROTOCOL_MSG_CG_SYNC_TOTEMNPC_ENTER_BRD = MAKEWORD(CG_SYNC, CG_SYNC_TOTEMNPC_ENTER_BRD); const WORD PROTOCOL_MSG_CG_SYNC_BOSS_MONSTER_ENTER_BRD = MAKEWORD(CG_SYNC, CG_SYNC_BOSS_MONSTER_ENTER_BRD); MSG_BASE* pMSGBASE = (MSG_BASE*)rSIG_MSG.MSG_HDR(); WORD wPROTOCOL = MAKEWORD(pMSGBASE->m_byCategory, pMSGBASE->m_byProtocol); BYTE* pMSGDATA = (BYTE*)(pMSGBASE+1); WORD wMSGDATA_LEN = (WORD)(rSIG_MSG.MSG_LEN()-sizeof(MSG_BASE)); switch(wPROTOCOL) { // ¹Ù·Î MONSTER_RENDER_INFO »ç¿ëÇÏ´Â °Íµé ´ÜÀÏ case PROTOCOL_MSG_CG_SYNC_MONSTER_ENTER_BRD: { OBJ_OP_BASE::OnRenderInfo(rMANAGER, rSIG_MSG); MONSTER_RENDER_INFO* pINFO = (MONSTER_RENDER_INFO*)pMSGDATA; MONSTER_RENDER_INFO& rINFO = ObjectManager::ALIGN_RENDER_INFO(m_pOBJECT, pINFO); m_pOBJECT->SetObjectKey(rINFO.m_dwObjectKey); } break; case PROTOCOL_MSG_CG_SYNC_MONSTER_DIR_ENTER_BRD: case PROTOCOL_MSG_CG_SYNC_MAPNPC_ENTER_BRD: case PROTOCOL_MSG_CG_SYNC_ALLMONSTERS_CMD: case PROTOCOL_MSG_CG_SYNC_SUMMONED_ENTER_BRD: case PROTOCOL_MSG_CG_SYNC_TOTEMNPC_ENTER_BRD: case PROTOCOL_MSG_CG_SYNC_BOSS_MONSTER_ENTER_BRD: return; } // OBJECT KEY °¡ ¼³Á¤µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. rMANAGER.RegisterObject(m_pOBJECT); } OBJCTRL_HANDLER_IMPL(OBJ_OP_MONSTER, Enter) { DEBUGGING_CODE_L3(""); OnRenderInfo(rMANAGER, rSIG_MSG); } OBJCTRL_HANDLER_IMPL(OBJ_OP_MONSTER, Leave) { DEBUGGING_CODE_L3(""); }