428 lines
No EOL
10 KiB
C++
428 lines
No EOL
10 KiB
C++
#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<CDnUseSkillMessage*>( 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<CDnBlockSuccessMessage*>( pEvent )->GetSkillID() == m_iSkillID )
|
|
{
|
|
bResult = true;
|
|
}
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
// CDnBubbleCountGreater
|
|
void CDnBubbleCountGreater::Initialize( const char* pArgument )
|
|
{
|
|
if( NULL == pArgument )
|
|
return;
|
|
|
|
// 스트링을 공백단위로 분할한 후
|
|
std::vector<string> 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<CDnBubbleCountUpdatedMessage*>( 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<CDnParringSuccessMessage*>( 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<CDnCooltimeParringSuccessMessage*>( 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<string> 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<CDnUseSkillMessage*>( 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<std::string> 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<CDnOnCriticalHitMessage*>(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;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
} |