#include "StdAfx.h" #include "DnBubbleConditionChecker.h" #include "DnObserverEventMessage.h" #include "DnObservable.h" #include "DnBubbleSystem.h" #include "DNGameRoom.h" #include "DnActor.h" namespace BubbleSystem { // °¢ Á¶°Ç üũ ŸÀÔº°·Î °´Ã¼ »ý¼º. IDnConditionChecker* IDnConditionChecker::Create( int iConditionCheckerType, const char* pArgument ) { IDnConditionChecker* pConditionChecker = NULL; switch( iConditionCheckerType ) { case BUBBLE_CONDITION::ON_USE_SKILL: pConditionChecker = new CDnUseSkill; break; case BUBBLE_CONDITION::BLOCK_SUCCESS: pConditionChecker = new CDnBlockSuccess; break; case BUBBLE_CONDITION::BUBBLE_COUNT_GREATER: pConditionChecker = new CDnBubbleCountGreater; break; case BUBBLE_CONDITION::BUBBLE_COUNT_UPDATED: pConditionChecker = new CDnBubbleCountUpdated; break; case BUBBLE_CONDITION::OWN_THIS_SKILL: pConditionChecker = new CDnOwnThisSkill; break; case BUBBLE_CONDITION::PARRING_SUCCESS: pConditionChecker = new CDnParringSuccess; break; case BUBBLE_CONDITION::COOLTIME_PARRING_SUCCESS: pConditionChecker = new CDnCooltimeParringSuccess; break; case BUBBLE_CONDITION::DO_NORMAL_ATTACK: pConditionChecker = new CDnDoNormalAttack; break; case BUBBLE_CONDITION::PLAYER_KILL_TARGET_ON_GHOUL_MODE: pConditionChecker = new CDnPlayerKillTargetOnGhoulMode; break; case BUBBLE_CONDITION::ON_USE_SKILL_WITH_SPECIFIC_SKILLLEVEL: pConditionChecker = new CDnUseSkillWithSpecificSkillLevel; break; case BUBBLE_CONDITION::PROBABILITY: pConditionChecker = new CDnProbability; break; //Master Dark Avenger incrase bubble on critical damage ! case BUBBLE_CONDITION::ONCRITICALHIT: pConditionChecker = new CDnOnCriticalHit; break; default: return NULL; } pConditionChecker->Initialize( pArgument ); return pConditionChecker; } // CDnUseSkill void CDnUseSkill::Initialize( const char* pArgument ) { if( NULL == pArgument ) return; m_iSkillID = atoi( pArgument ); } bool CDnUseSkill::IsSatisfy( CDnBubbleSystem* /*pBubbleSystem*/, ::IDnObserverNotifyEvent* pEvent ) { bool bResult = false; if( EVENT_BUBBLE_ON_USE_SKILL == pEvent->GetEventType() ) { // ÀÌ Á¶°Ç üũ °´Ã¼¿¡¼­ ¿ä±¸ÇÏ´Â ½ºÅ³ ID ¿Í ÀÏÄ¡ÇÔ. if( static_cast( pEvent )->GetSkillID() == m_iSkillID ) { bResult = true; } } return bResult; } ////////////////////////////////////////////////////////////////////////// // CDnBlockSuccess void CDnBlockSuccess::Initialize( const char* pArgument ) { if( NULL == pArgument ) return; m_iSkillID = atoi( pArgument ); } bool CDnBlockSuccess::IsSatisfy( CDnBubbleSystem* /*pBubbleSystem*/, ::IDnObserverNotifyEvent* pEvent ) { bool bResult = false; // ºí·Ï ¼º°ø ¸Þ½ÃÁöÀ̰í, if( EVENT_BUBBLE_BLOCK_SUCCESS == pEvent->GetEventType() ) { // ÀÌ Á¶°Ç üũ °´Ã¼¿¡¼­ ¿ä±¸ÇÏ´Â ½ºÅ³ ID ¿Í ÀÏÄ¡ÇÔ. if( static_cast( pEvent )->GetSkillID() == m_iSkillID ) { bResult = true; } } return bResult; } ////////////////////////////////////////////////////////////////////////// // CDnBubbleCountGreater void CDnBubbleCountGreater::Initialize( const char* pArgument ) { if( NULL == pArgument ) return; // ½ºÆ®¸µÀ» °ø¹é´ÜÀ§·Î ºÐÇÒÇÑ ÈÄ std::vector vlTokens; string strArgument( pArgument ); TokenizeA( strArgument, vlTokens, ";" ); _ASSERT( 2 == (int)vlTokens.size() ); m_iBubbleTypeID = atoi( vlTokens.at(0).c_str() ); m_iBasisCount = atoi( vlTokens.at(1).c_str() ); } bool CDnBubbleCountGreater::IsSatisfy( CDnBubbleSystem* pBubbleSystem, ::IDnObserverNotifyEvent* /*pEvent*/ ) { bool bResult = false; // ƯÁ¤ ¹öºíÀÇ °¹¼ö°¡ ÀÌ °¹¼ö ÀÌ»óÀÏ ¶§. if( m_iBasisCount <= pBubbleSystem->GetBubbleCountByTypeID( m_iBubbleTypeID ) ) { bResult = true; } return bResult; } ////////////////////////////////////////////////////////////////////////// // CDnBubbleCountUpdated void CDnBubbleCountUpdated::Initialize( const char* pArgument ) { if( NULL == pArgument ) return; m_iBubbleTypeID = atoi( pArgument ); } bool CDnBubbleCountUpdated::IsSatisfy( CDnBubbleSystem* /*pBubbleSystem*/, ::IDnObserverNotifyEvent* pEvent ) { bool bResult = false; if( EVENT_BUBBLE_COUNT_UPDATED == pEvent->GetEventType() ) { // ÀÌ Á¶°Ç üũ °´Ã¼¿¡¼­ ¿ä±¸ÇÏ´Â ½ºÅ³ ID ¿Í ÀÏÄ¡ÇÔ. if( static_cast( pEvent )->GetBubbleTypeID() == m_iBubbleTypeID ) { bResult = true; } } return bResult; } ////////////////////////////////////////////////////////////////////////// // CDnOwnThisSkill void CDnOwnThisSkill::Initialize( const char* pArgument ) { if( NULL == pArgument ) return; m_iSkillID = atoi( pArgument ); } bool CDnOwnThisSkill::IsSatisfy( CDnBubbleSystem* pBubbleSystem, ::IDnObserverNotifyEvent* pEvent ) { bool bResult = false; // ÀÌ Á¶°Ç üũ °´Ã¼¿¡¼­ ¿ä±¸ÇÏ´Â ½ºÅ³ ID ¿Í ÀÏÄ¡ÇÔ. DnActorHandle hActor = pBubbleSystem->GetHasActor(); if( hActor && hActor->FindSkill( m_iSkillID ) ) { bResult = true; } return bResult; } ////////////////////////////////////////////////////////////////////////// // CDnParringSuccess void CDnParringSuccess::Initialize( const char* pArgument ) { if( NULL == pArgument ) return; m_iSkillID = atoi( pArgument ); } bool CDnParringSuccess::IsSatisfy( CDnBubbleSystem* /*pBubbleSystem*/, ::IDnObserverNotifyEvent* pEvent ) { bool bResult = false; // ºí·Ï ¼º°ø ¸Þ½ÃÁöÀ̰í, if( EVENT_BUBBLE_PARRING_SUCCESS == pEvent->GetEventType() ) { // ÀÌ Á¶°Ç üũ °´Ã¼¿¡¼­ ¿ä±¸ÇÏ´Â ½ºÅ³ ID ¿Í ÀÏÄ¡ÇÔ. if( static_cast( pEvent )->GetSkillID() == m_iSkillID ) { bResult = true; } } return bResult; } ////////////////////////////////////////////////////////////////////////// // CDnCooltimeParringSuccess void CDnCooltimeParringSuccess::Initialize( const char* pArgument ) { if( NULL == pArgument ) return; m_iSkillID = atoi( pArgument ); } bool CDnCooltimeParringSuccess::IsSatisfy( CDnBubbleSystem* /*pBubbleSystem*/, ::IDnObserverNotifyEvent* pEvent ) { bool bResult = false; // ºí·Ï ¼º°ø ¸Þ½ÃÁöÀ̰í, if( EVENT_BUBBLE_COOLTIME_PARRING_SUCCESS == pEvent->GetEventType() ) { // ÀÌ Á¶°Ç üũ °´Ã¼¿¡¼­ ¿ä±¸ÇÏ´Â ½ºÅ³ ID ¿Í ÀÏÄ¡ÇÔ. if( static_cast( pEvent )->GetSkillID() == m_iSkillID ) { bResult = true; } } return bResult; } ////////////////////////////////////////////////////////////////////////// // CDnCooltimeParringSuccess void CDnDoNormalAttack::Initialize( const char* pArgument ) { // ÀÎÀÚ ¹Þ´Â °Í ¾øÀ½. if( NULL == pArgument ) return; } bool CDnDoNormalAttack::IsSatisfy( CDnBubbleSystem* pBubbleSystem, ::IDnObserverNotifyEvent* pEvent ) { bool bResult = false; DnActorHandle hActor = pBubbleSystem->GetHasActor(); if( EVENT_ONCHANGEACTION == pEvent->GetEventType() ) { // TODO: ÆòŸ ±¸ºÐÇÏ´Â Äڵ尡 ¿©±â ¸»°í µÎ ±ºµ¥ Á¤µµ ´õ Àִµ¥ ÇÔ¼ö·Î »©ÀÚ. if( false == hActor->IsProcessSkill() && false == hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_121) && false == hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_129) ) { bResult = true; } } return bResult; } ////////////////////////////////////////////////////////////////////////// // CDnCooltimeParringSuccess void CDnPlayerKillTargetOnGhoulMode::Initialize( const char* pArgument ) { // ÀÎÀÚ ¹Þ´Â °Í ¾øÀ½. if( NULL == pArgument ) return; } bool CDnPlayerKillTargetOnGhoulMode::IsSatisfy( CDnBubbleSystem* pBubbleSystem, ::IDnObserverNotifyEvent* pEvent ) { bool bResult = false; DnActorHandle hActor = pBubbleSystem->GetHasActor(); if( EVENT_PLAYER_KILL_TARGET == pEvent->GetEventType() ) { // ±¸¿ï ¸ðµå¸é true. if(hActor && hActor->GetGameRoom()->bIsZombieMode()) bResult = true; } return bResult; } ///////////////////////////////////////////////////////////////////////// // CDnUseSkillWithSpecificSkillLevel void CDnUseSkillWithSpecificSkillLevel::Initialize( const char* pArgument ) { if( NULL == pArgument ) return; vector vlArgs; TokenizeA( pArgument, vlArgs, ";" ); if( 2 == (int)vlArgs.size() ) { m_iSkillID = atoi( vlArgs.at( 0 ).c_str() ); m_iSkillLevel = atoi( vlArgs.at( 1 ).c_str() ); } } bool CDnUseSkillWithSpecificSkillLevel::IsSatisfy( CDnBubbleSystem* /*pBubbleSystem*/, ::IDnObserverNotifyEvent* pEvent ) { bool bResult = false; if( EVENT_BUBBLE_ON_USE_SKILL == pEvent->GetEventType() ) { // ÀÌ Á¶°Ç üũ °´Ã¼¿¡¼­ ¿ä±¸ÇÏ´Â ½ºÅ³ ID ¿Í ÀÏÄ¡ÇÔ. CDnUseSkillMessage* pMsg = static_cast( pEvent ); if( pMsg->GetSkillID() == m_iSkillID && pMsg->GetSkillLevel() == m_iSkillLevel ) { bResult = true; } } return bResult; } ////////////////////////////////////////////////////////////////////////// // CDnProbability void CDnProbability::Initialize( const char* pArgument ) { if( NULL == pArgument ) return; // 0.0 ~ 1.0 ¹üÀ§ m_fProbability = (float)atof( pArgument ); m_fProbability *= 10000.0f; } bool CDnProbability::IsSatisfy( CDnBubbleSystem* pBubbleSystem, ::IDnObserverNotifyEvent* /*pEvent*/ ) { bool bResult = false; float fRandomResult = float(_rand(pBubbleSystem->GetHasActor()->GetRoom()) % 10000); bResult = fRandomResult <= m_fProbability; return bResult; } ////////////////////////////////////////////////////////////////////////// // CDnProbability void CDnOnCriticalHit::Initialize(const char* pArgument) { if (NULL == pArgument) return; m_vecCheckSkills.clear(); std::vector tempVecSkillList; TokenizeA(pArgument, tempVecSkillList, ";"); if (tempVecSkillList.size() == 0) return; for (DWORD i = 0; i < tempVecSkillList.size(); i++) m_vecCheckSkills.push_back(atoi(tempVecSkillList[i].c_str())); } bool CDnOnCriticalHit::IsSatisfy(CDnBubbleSystem* pBubbleSystem, ::IDnObserverNotifyEvent* pEvent) { bool bResult = false; if (EVENT_ONCRITICALHIT == pEvent->GetEventType()) { CDnOnCriticalHitMessage* pMsg = static_cast(pEvent); if (!pMsg) return false; int nSkillID = pMsg->GetSkillID(); printf("%s - Before PMSG UsageSkill: %d \n", __FUNCTION__, nSkillID); if(nSkillID > 0) { if (std::find(m_vecCheckSkills.begin(), m_vecCheckSkills.end(), nSkillID) != m_vecCheckSkills.end()) { printf("%s - OK ADD BUBBLES skill = %d \n",__FUNCTION__, nSkillID); bResult = true; } } } return bResult; } ////////////////////////////////////////////////////////////////////////// }