#include "stdafx.h" #include "Logic.Active.h" ////////////////////////////////////////////////////////////////////////// // //struct LF_INFO //{ // DWORD CODE; // LF_EXECUTE_POLICY POLICY; // ConditionLogicHandler CONDITION; // ActiveLogicHandler ACTIVE_HANDLER; // ActiveLogicHandler ACTIVE_HANDLER_REDIRECT; // PassiveLogicHandler PASSIVE_HANDLER; // PassiveLogicHandler PASSIVE_HANDLER_REDIRECT; // TCHAR NAME[64]; //}; static LF_INFO s_LF_INFO[S_999999_LF_EOL_MARK_LF+1] = { # undef LF_DEFINE_T # define LF_DEFINE_T(name) { name, LFEXE_BASE, NULL, ACTIVE_HANDLER_##name, NULL, NULL, NULL, #name }, # include # undef LF_DEFINE_T }; static LF_MAP* s_pLF_TABLE = NULL; #define LF_MAP_INTERFACE (*s_pLF_TABLE) void LogicFlowController::CreateTable() { s_pLF_TABLE = new LF_MAP; LF_INFO* pOffset = s_LF_INFO; //printf("S_999999_LF_EOL_MARK_LF %u\n", S_999999_LF_EOL_MARK_LF); for(DWORD dwIdx=S_000000_START_MARK_LF ; dwIdx<(S_999999_LF_EOL_MARK_LF+1) ; ++dwIdx, ++pOffset) { DWORD dwCode = pOffset->CODE; //printf("%u\t%s\n", dwCode, pOffset->NAME); LF_MAP_INTERFACE.insert(LF_MAP_INTERFACE.end(), make_pair(dwCode, pOffset)); } } void LogicFlowController::ReleaseTable() { LF_MAP_INTERFACE.clear(); SAFE_DELETE(s_pLF_TABLE); } BOOL LogicFlowController::DoProcess() { // DEBUGGING_CODE_L3(""); //printf("STAT %u %u\n", m_eSTEP, m_eCONTROL); BOOL bPass = (BOOL)(S_000099_CLOSURE_MARK_LF == m_eSTEP); if(bPass) return TRUE; bPass = (BOOL)(LFRET_PENDING_UNTIL_PASSIVE == m_eCONTROL); if(bPass) return TRUE; LF_MAP_IT itFIND = LF_MAP_INTERFACE.find(m_eSTEP); if(itFIND == LF_MAP_INTERFACE.end()) { DEBUGGING_CODE_L1("FAIL1"); return FALSE; } LF_INFO* pINFO = itFIND->second; LF_RESULT eRET = LFRET_FAIL; LF_EXECUTE_POLICY ePOLICY = pINFO->POLICY; // (WARNING) ¾Æ·¡ ·çƾ ¼öÁ¤ÇØ¾ß ÇÑ´Ù... LogicFlowDelegator rLF((LogicFlowBase*)this); switch(ePOLICY) { case LFEXE_BASE: // ±âº» Çڵ鷯¸¸ ½ÇÇàÇÑ´Ù. { ActiveLogicHandler& rHANDLER = pINFO->ACTIVE_HANDLER; if(rHANDLER) eRET = (rHANDLER)(&rLF, NULL); else eRET = LFRET_FAIL; } break; case LFEXE_REDIRECT: // Àç¼³Á¤ÇÑ Çڵ鷯¸¸ ½ÇÇàÇÑ´Ù. { ActiveLogicHandler& rHANDLER = pINFO->ACTIVE_HANDLER_REDIRECT; if(rHANDLER) eRET = (rHANDLER)(&rLF, NULL); else eRET = LFRET_FAIL; } break; case LFEXE_BASE_N_REDIRECT: // ±âº» Çڵ鷯 ½ÇÇà ÈÄ Àç¼³Á¤ÇÑ Çڵ鷯¸¦ ½ÇÇà½ÃŲ´Ù. { if(pINFO->ACTIVE_HANDLER) eRET = (pINFO->ACTIVE_HANDLER)(&rLF, NULL); else eRET = LFRET_FAIL; if(LFRET_FAIL != eRET) { if(pINFO->ACTIVE_HANDLER_REDIRECT) eRET = (pINFO->ACTIVE_HANDLER_REDIRECT)(&rLF, NULL); else eRET = LFRET_FAIL; } } break; case LFEXE_REDIRECT_N_BASE: // Àç¼³Á¤ÇÑ Çڵ鷯¸¦ ½ÇÇà ÈÄ ±âº» Çڵ鷯¸¦ ½ÇÇà½ÃŲ´Ù. { if(pINFO->ACTIVE_HANDLER_REDIRECT) eRET = (pINFO->ACTIVE_HANDLER_REDIRECT)(&rLF, NULL); else eRET = LFRET_FAIL; if(LFRET_FAIL != eRET) { if(pINFO->ACTIVE_HANDLER) eRET = (pINFO->ACTIVE_HANDLER)(&rLF, NULL); else eRET = LFRET_FAIL; } } break; case LFEXE_NO_ACTION: // Çڵ鷯 Á¤ÀǵÇÁö ¾Ê¾Ò´Ù. ¹®Á¦ ¹ß»ýÇѵð¾ß~ { } break; default: DEBUGGING_CODE_L1("FAIL-POLICY"); break; } //if(pINFO->HANDLER_REDIRECT) //{ // LogicFlowDelegator rDelegator = LogicFlowDelegator(this); // eRET = pINFO->HANDLER_REDIRECT(&rDelegator, NULL); //} //else // eRET = (this->*pINFO->HANDLER)(NULL); switch(eRET) { case LFRET_FAIL: DEBUGGING_CODE_L1("FAIL-RET"); return FALSE; case LFRET_SUCCESS_DEFAULT: ChangeNextStep(); break; case LFRET_SUCCESS_LOOP: break; case LFRET_SUCCESS_JUMP: // °¢°¢ÀÇ Çڵ鷯¿¡¼­ ÇØ´ç°ªÀ» ÀÔ·ÂÇßÀ» °ÍÀÌ´Ù. break; case LFRET_PENDING_UNTIL_PASSIVE: m_eCONTROL = LFRET_PENDING_UNTIL_PASSIVE; break; } return TRUE; } ////////////////////////////////////////////////////////////////////////// // LogicFlowBase::LogicFlowBase(LogicFlowController& rLFC) : m_rLFC(rLFC) { } LogicFlowBase::~LogicFlowBase() { } BOOL LogicFlowBase::DoProcess() { BOOL bPass = (BOOL)(ENDofSTEP() == m_eSTEP); if(bPass) return TRUE; bPass = (BOOL)(LFRET_PENDING_UNTIL_PASSIVE == m_eCONTROL); if(bPass) return TRUE; LF_MAP_IT itFIND = LF_MAP_INTERFACE.find(m_eSTEP); if(itFIND == LF_MAP_INTERFACE.end()) { DEBUGGING_CODE_L1("FAIL1"); return FALSE; } LF_INFO* pINFO = itFIND->second; LF_RESULT eRET = LFRET_FAIL; LF_EXECUTE_POLICY ePOLICY = pINFO->POLICY; LogicFlowDelegator rLF(this); switch(ePOLICY) { case LFEXE_BASE: // ±âº» Çڵ鷯¸¸ ½ÇÇàÇÑ´Ù. { ActiveLogicHandler& rHANDLER = pINFO->ACTIVE_HANDLER; if(rHANDLER) eRET = (rHANDLER)(&rLF, NULL); else eRET = LFRET_FAIL; } break; case LFEXE_REDIRECT: // Àç¼³Á¤ÇÑ Çڵ鷯¸¸ ½ÇÇàÇÑ´Ù. { ActiveLogicHandler& rHANDLER = pINFO->ACTIVE_HANDLER_REDIRECT; if(rHANDLER) eRET = (rHANDLER)(&rLF, NULL); else eRET = LFRET_FAIL; } break; case LFEXE_BASE_N_REDIRECT: // ±âº» Çڵ鷯 ½ÇÇà ÈÄ Àç¼³Á¤ÇÑ Çڵ鷯¸¦ ½ÇÇà½ÃŲ´Ù. { if(pINFO->ACTIVE_HANDLER) eRET = (pINFO->ACTIVE_HANDLER)(&rLF, NULL); else eRET = LFRET_FAIL; if(LFRET_FAIL != eRET) { if(pINFO->ACTIVE_HANDLER_REDIRECT) eRET = (pINFO->ACTIVE_HANDLER_REDIRECT)(&rLF, NULL); else eRET = LFRET_FAIL; } } break; case LFEXE_REDIRECT_N_BASE: // Àç¼³Á¤ÇÑ Çڵ鷯¸¦ ½ÇÇà ÈÄ ±âº» Çڵ鷯¸¦ ½ÇÇà½ÃŲ´Ù. { if(pINFO->ACTIVE_HANDLER_REDIRECT) eRET = (pINFO->ACTIVE_HANDLER_REDIRECT)(&rLF, NULL); else eRET = LFRET_FAIL; if(LFRET_FAIL != eRET) { if(pINFO->ACTIVE_HANDLER) eRET = (pINFO->ACTIVE_HANDLER)(&rLF, NULL); else eRET = LFRET_FAIL; } } break; case LFEXE_NO_ACTION: // Çڵ鷯 Á¤ÀǵÇÁö ¾Ê¾Ò´Ù. ¹®Á¦ ¹ß»ýÇѵð¾ß~ { } break; default: DEBUGGING_CODE_L1("FAIL-POLICY"); break; } //if(pINFO->HANDLER_REDIRECT) //{ // LogicFlowDelegator rDelegator = LogicFlowDelegator(this); // eRET = pINFO->HANDLER_REDIRECT(&rDelegator, NULL); //} //else // eRET = (this->*pINFO->HANDLER)(NULL); switch(eRET) { case LFRET_FAIL: DEBUGGING_CODE_L1("FAIL-RET"); return FALSE; case LFRET_SUCCESS_DEFAULT: ChangeNextStep(); break; case LFRET_SUCCESS_LOOP: break; case LFRET_SUCCESS_JUMP: // °¢°¢ÀÇ Çڵ鷯¿¡¼­ ÇØ´ç°ªÀ» ÀÔ·ÂÇßÀ» °ÍÀÌ´Ù. break; case LFRET_PENDING_UNTIL_PASSIVE: m_eCONTROL = LFRET_PENDING_UNTIL_PASSIVE; break; } return TRUE; } BOOL LogicFlowBase::IsComplete() { return (BOOL)(/*!LF_CONTROLLER().GetWiseUser() ||*/ (ENDofSTEP() == STEP())); } void LogicFlowBase::OnMsg(sSIG_MSG* pSIG_MSG) { //DEBUGGING_CODE_L3(""); sSIG_WISEBASE& rSIG_BASE = *(sSIG_WISEBASE*)pSIG_MSG; if(eSIG_WISEMSG::LF_MAIN_CMD != rSIG_BASE.SIGTYPE()) { return; } // ´ÙÀ½ ·ÎÁ÷Àº eSIG_WISEMSG::LF_MAIN_CMD ¸¸ Àü´ãÇÑ´Ù. sSIG_LF_MAIN& rSIG_PLOGIC = *(sSIG_LF_MAIN*)pSIG_MSG; eWISESUBTYPE& rSUBTYPE = rSIG_PLOGIC.SUBTYPE(); sSIG_STEP_ARG& rARG = rSIG_PLOGIC.TypeOf(); if(GetGroupOfLF() != rARG.GROUP) return; switch(rSUBTYPE) { case sSIG_LF_MAIN::NO_TYPE: break; case sSIG_LF_MAIN::ACTIVATE_JUMP_STEP: { GotoStep(rARG.STEP, NULL); } break; case sSIG_LF_MAIN::ACTIVATE_NEXT_STEP: ChangeNextStep(); break; //case sSIG_LF_MAIN::CLOSURE_STEP: // { // GotoStep(ENDofSTEP(), NULL); // } // break; default: DEBUGGING_CODE_L1("NO-ACTION by OnMSG"); return; } } void LogicFlowBase::ChangeNextStep() { if(ENDofSTEP() != m_eSTEP) { m_eSTEP = (LF_DEFINE)(((DWORD)m_eSTEP)+1); m_eCONTROL = LFRET_SUCCESS_DEFAULT; } } BOOL LogicFlowBase::GotoStep(LF_DEFINE step, PASSING_ARG IN arguments) { // »óÇѼ±, ÇÏÇѼ± ¸ðµÎ¸¦ °í·ÁÇØ¾ß ÇÏÁö¸¸... ÀÏ´Ü ´ÙÀ½ ±âȸ¸¦ ³ë¸®ÀÚ. if((DWORD)step > (DWORD)ENDofSTEP()) return FALSE; m_eSTEP = step; m_eCONTROL = LFRET_SUCCESS_JUMP; //arguments return TRUE; } ////////////////////////////////////////////////////////////////////////// // LogicFlowConnection::LogicFlowConnection(LogicFlowController& rLFC) : LogicFlowBase(rLFC) { GROUPofLF() = LFG_CONNECTION; STEP() = S_000100_START_MARK_LF; ENDofSTEP() = S_000999_CLOSURE_MARK_LF; CONTROL() = LFRET_SUCCESS_DEFAULT; }; LogicFlowConnection::~LogicFlowConnection() { } BOOL LogicFlowConnection::DoInit() { GROUPofLF() = LFG_CONNECTION; STEP() = S_000100_START_MARK_LF; CONTROL() = LFRET_SUCCESS_DEFAULT; return TRUE; } BOOL LogicFlowConnection::DoProcess() { //DEBUGGING_CODE_L3(""); BOOL bRET = LogicFlowBase::DoProcess(); return bRET; } BOOL LogicFlowConnection::IsComplete() { return LogicFlowBase::IsComplete(); } BOOL LogicFlowConnection::DoRelease() { WiseUser* pUser = LF_CONTROLLER().GetWiseUser(); if(pUser) pUser->GetLogicFlow() = LogicFlowDelegator(NULL); //// NULL... //if(AGENT_SESSION == idxSession) //{ // // ÇØ´ç ¼¼¼ÇÀ» Á¾·á½ÃÄÑ¾ß ÇÑ´Ù. // GetWiseUser()->Release(); // ObjectPoolRouter::Instance()->Free(OBJTYPE_USER, GetWiseUser()); // return; //} //LF_CONTROLLER().GetWiseUser()-> return TRUE; } void LogicFlowConnection::OnMsg(sSIG_MSG* pSIG_MSG) { LogicFlowBase::OnMsg(pSIG_MSG); return ; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // LogicFlowZone::LogicFlowZone(LogicFlowController& rLFC) : LogicFlowBase(rLFC) { GROUPofLF() = LFG_ZONE; STEP() = S_001000_START_MARK_LF; ENDofSTEP() = S_002999_CLOSURE_MARK_LF; CONTROL() = LFRET_SUCCESS_DEFAULT; }; LogicFlowZone::~LogicFlowZone() { } BOOL LogicFlowZone::DoInit() { GROUPofLF() = LFG_ZONE; STEP() = S_001000_START_MARK_LF; CONTROL() = LFRET_SUCCESS_DEFAULT; return TRUE; } BOOL LogicFlowZone::DoProcess() { //DEBUGGING_CODE_L3(""); BOOL bRET = LogicFlowBase::DoProcess(); return bRET; } BOOL LogicFlowZone::IsComplete() { return LogicFlowBase::IsComplete(); } BOOL LogicFlowZone::DoRelease() { return TRUE; } void LogicFlowZone::OnMsg(sSIG_MSG* pSIG_MSG) { LogicFlowBase::OnMsg(pSIG_MSG); return ; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // LogicFlowMove::LogicFlowMove(LogicFlowController& rLFC) : LogicFlowBase(rLFC) { GROUPofLF() = LFG_MOVE; STEP() = S_003000_START_MARK_LF; ENDofSTEP() = S_003999_CLOSURE_MARK_LF; CONTROL() = LFRET_SUCCESS_DEFAULT; }; LogicFlowMove::~LogicFlowMove() { } BOOL LogicFlowMove::DoInit() { GROUPofLF() = LFG_MOVE; STEP() = S_003000_START_MARK_LF; CONTROL() = LFRET_SUCCESS_DEFAULT; return TRUE; } BOOL LogicFlowMove::DoProcess() { //DEBUGGING_CODE_L3(""); BOOL bRET = LogicFlowBase::DoProcess(); return bRET; } BOOL LogicFlowMove::IsComplete() { return LogicFlowBase::IsComplete(); } BOOL LogicFlowMove::DoRelease() { return TRUE; } void LogicFlowMove::OnMsg(sSIG_MSG* pSIG_MSG) { LogicFlowBase::OnMsg(pSIG_MSG); return ; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// LF_ACTIVE_HANDLER_IMPL_NULL(S_000100_START_MARK_LF); //LF_ACTIVE_HANDLER_IMPL_NULL(S_000200_WISEUSER_CREATE_LF); //LF_ACTIVE_HANDLER_IMPL_NULL(S_000300_CREATE_LOGIN_FRONT_SESSION_LF); //LF_ACTIVE_HANDLER_IMPL_NULL(S_000310_CONNECT_TO_LOGIN_FRONT_LF); //LF_ACTIVE_HANDLER_IMPL_NULL(S_000320_WAIT_CONNECT_TO_LOGIN_FRONT_LF); //LF_ACTIVE_HANDLER_IMPL_NULL(S_000330_WAIT_MSG_S2C_READY_LF); //LF_ACTIVE_HANDLER_IMPL_NULL(S_000340_SEND_FC_AUTH_VERIFY_LF); //LF_ACTIVE_HANDLER_IMPL_NULL(S_000920_CLOSURE_EXCEPTION_LF); LF_ACTIVE_HANDLER_IMPL_NULL(S_990100_PLAYER_RELEASE_LF); LF_ACTIVE_HANDLER_IMPL_NULL(S_990105_USER_RELEASE_LF); LF_ACTIVE_HANDLER_IMPL_NULL(S_999999_LF_EOL_MARK_LF); LF_ACTIVE_HANDLER_IMPL_NULL(S_000999_CLOSURE_MARK_LF); LF_ACTIVE_HANDLER_IMPL_NULL(S_001000_START_MARK_LF);