DragonNest/GameCommon/DnBubbleConditionChecker.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

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;
}
//////////////////////////////////////////////////////////////////////////
}