⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trigger.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:
#include "StdAfx.h"
#include "Trigger.h"
#include "TriggerCommon.h"
#include "IConditionTrigger.h"
#include "IActionTrigger.h"
#include "ConditionInfo.h"
#include "ActionInfo.h"

#include "ConditionTriggers.h"
#include "ActionTriggers.h"
#include "TriggerManager.h"


#define __TRIGGER_BEGIN_SWITCH					sSWITCH(pTrigger->TriggerType())
#define __TRIGGER_DESTROY_CASE( className )		CASE( e##className ) className::Destroy((className*)pTrigger);
#define __TRIGGER_CREATE_CASE( className )		CASE( e##className )											\
													className * pNew = className::Create();						\
													pNew->Set((className##_INFO*)pTrigger);						\
													pITrigger = pNew;
#define __TRIGGER_EXCEPT( str )					DEFAULT	ASSERT( !str );
#define __TRIGGER_END_SWITCH					eSWITCH

__IMPL_POOL(Trigger)
Trigger::Trigger(void)
{
	// 檬扁蔼 搬沥
	m_ConditionHash.Initialize( 100 );
	m_ActionHash.Initialize( 100 );
	m_SatisfiedPlayerHash.Initialize( MAX_PARTYMEMBER_NUM*3 );

	m_bActive			= FALSE;
	m_pTriggerInfo		= NULL;
	m_pMGR				= NULL;
	m_state				= INACTIVATE_STATE;
	m_dwClickedUserKey	= 0;
}

Trigger::~Trigger(void)
{
	Release();
}

VOID Trigger::Release()
{
	IConditionTrigger * pCondition = NULL;
	m_ConditionHash.SetFirst();
	while( (pCondition=m_ConditionHash.GetNext()) != NULL )
	{		
		_destroyCondition( pCondition );
	}
	m_ConditionHash.RemoveAll();

	IActionTrigger * pAction = NULL;
	m_ActionHash.SetFirst();
	while( (pAction=m_ActionHash.GetNext()) != NULL )
	{	
		_destroyAction( pAction );
	}
	m_ActionHash.RemoveAll();

	OnRelease();
}

VOID Trigger::Init( TriggerManager * pMGR, TriggerInfo * pInfo )
{
	ASSERT( m_ConditionHash.GetDataNum() == 0 );
	ASSERT( m_ActionHash.GetDataNum() == 0 );

	m_state		= INACTIVATE_STATE;
	m_pMGR		= pMGR;
	_setInfo( pInfo );

	util::SolarHashTable<ConditionInfo *> & rConditionHash = _getInfo()->m_ConditionHash;
	util::SolarHashTable<ActionInfo *> & rActionHash = _getInfo()->m_ActionHash;

	ConditionInfo * pCondition = NULL;
	rConditionHash.SetFirst();
	while( (pCondition=rConditionHash.GetNext()) != NULL )
	{
		_createCondition(pCondition);
	}

	ActionInfo * pAction = NULL;
	rActionHash.SetFirst();
	while( (pAction=rActionHash.GetNext()) != NULL )
	{
		_createAction(pAction);	
	}
}

VOID Trigger::OnInit()
{
	//ASSERT( m_ConditionPlayerHash.GetDataNum() == 0 );
	ASSERT( m_SatisfiedPlayerHash.GetDataNum() == 0 );

	//努腐茄 蜡历 函荐 檬扁拳
	m_dwClickedUserKey = 0;

	SetActive( _getInfo()->IsActive() );

	// 诀单捞飘 救窃!
	m_state = DONTUPDATE_STATE;

	IConditionTrigger * pCondition = NULL;
	m_ConditionHash.SetFirst();
	while( (pCondition=m_ConditionHash.GetNext()) != NULL )
	{	
		pCondition->Clear();	//< m_bSatistied = FALSE;
		pCondition->OnInit();
		if( pCondition->NeedUpdate() )
			m_state = UPDATE_STATE;
	}

	// 霉锅掳绰 角青 : for always condition
	Execute();
}

VOID Trigger::OnRelease()
{
//	m_ConditionPlayerHash.RemoveAll();
	m_SatisfiedPlayerHash.RemoveAll();
}

BOOL Trigger::Update()
{
	// is satisfied登搁 update甫 窍瘤 臼绰促.

	switch( m_state )
	{
	case DONTUPDATE_STATE: return TRUE;
	case UPDATE_STATE:
		{
			// 矫埃捞 瘤唱啊搁捞扼绰 鸥涝锭巩俊 UPDATE_STATE 惑怕啊 眠啊凳
			// 矫埃捞 瘤唱啊搁捞 器窃等 飘府芭绰 update啊 登扁锭巩俊 坷滚庆靛啊 奴 促弗 飘府芭客 鞍捞 荤侩窍瘤 臼绰祈捞 亮促.
			// 眠饶, 飘府芭 诀单捞飘 平阑 疵赴促!
			// 弥利拳 且 咯瘤啊 乐澜
			Execute();
		}
		break;
	case ACTIONUPDATE_STATE: 
		if( !ActionUpdate() ) 
		{
			m_state = TERMINATING_STATE; 
		} 
		else 
		{ 
			break; 
		}
	case TERMINATING_STATE: return FALSE;
	}

	return TRUE;
}

BOOL Trigger::Execute()
{
	if( _ConditionCheck() )
	{
		_Action();
		return TRUE;
	}
	else
	{
		_ConditionReset();
	}

	return FALSE;
}

BOOL Trigger::_ConditionCheck()
{
	if( m_pTriggerInfo->IsAND() )
	{
		IConditionTrigger * pCondition = NULL;
		m_ConditionHash.SetFirst();
		while( (pCondition=m_ConditionHash.GetNext()) != NULL )
		{		
			if( !pCondition->IsSatisfied() )
				return FALSE;
		}
		return TRUE;
	}
	else
	{
		IConditionTrigger * pCondition = NULL;
		m_ConditionHash.SetFirst();
		while( (pCondition=m_ConditionHash.GetNext()) != NULL )
		{		
			if( pCondition->IsSatisfied() )
				return TRUE;
		}
		return FALSE;
	}
}

VOID Trigger::_Action()
{
	MSG_CG_TRIGGER_DO_ACTION_BRD msg;
	msg.m_dwTriggerID = TriggerID();
	m_pMGR->SendToAll( &msg, sizeof(msg) );

	IActionTrigger * pAction = NULL;
	m_ActionHash.SetFirst();
	while( (pAction=m_ActionHash.GetNext()) != NULL )
	{	
		pAction->OnAction();
	}
	m_state = ACTIONUPDATE_STATE;
}
VOID Trigger::_ConditionReset()
{
	// 诀单捞飘 救窃!
	m_state = DONTUPDATE_STATE;

	// OPT //@@@@ 弥利拳 鞘夸!!!!
	IConditionTrigger * pCondition = NULL;
	m_ConditionHash.SetFirst();
	while( (pCondition=m_ConditionHash.GetNext()) != NULL )
	{		
		pCondition->OnReset();
		if( pCondition->NeedUpdate() )
			m_state = UPDATE_STATE;
	}

}

// return FALSE捞搁 飘府芭 辆丰
BOOL Trigger::ActionUpdate()
{
	BOOL bEnd = FALSE;
	IActionTrigger * pAction = NULL;
	m_ActionHash.SetFirst();
	while( (pAction=m_ActionHash.GetNext()) != NULL )
	{	
		if( pAction->OnActionUpdate() )
		{
			bEnd = TRUE;
		}
	}

	return bEnd;
}

VOID Trigger::OnMsg( TRIGGER_MSG * pMsg )
{
	// Active等 trigger父 甸绢 柯促!!!!!!

	IConditionTrigger * pCondition = NULL;
	m_ConditionHash.SetFirst();
	while( (pCondition=m_ConditionHash.GetNext()) != NULL )
	{		
		// 炼扒眉农饶 父练窍搁 傈眉 父练 咯何 眉农
		if( TRUE == pCondition->OnMsg( pMsg ) )
		{
			// 泅犁 捞亥飘 皋技瘤肺 父练登菌促.
			// 傈眉 父练 眉农
			if( Execute() ) break;
		}
	}
}
/*
DWORD Trigger::GetConditionPlayerNum( ePLAYER_TRIGGER_STATE state )
{
	DWORD totalNum = 0;
	//DWORD nMax = m_ConditionPlayerHash.GetDataNum();
	for( DWORD i = 0 ; i < nMax ; ++i )
	{	
		if( m_PlayerTriggerInfo[i].m_State & state )
			++totalNum;
	}
	return totalNum;
}
*/
#pragma warning ( push )
#pragma warning ( disable : 4311)

VOID Trigger::_createCondition( ConditionInfo * pTrigger )
{
	IConditionTrigger * pITrigger = NULL;

	__TRIGGER_BEGIN_SWITCH
	__TRIGGER_CREATE_CASE( CONDITION_ALWAYS )
	__TRIGGER_CREATE_CASE( CONDITION_COMPARE_SWITCH )
	__TRIGGER_CREATE_CASE( CONDITION_CLICK_OBJECT )
	__TRIGGER_CREATE_CASE( CONDITION_DAMAGE_OBJECT )
	__TRIGGER_CREATE_CASE( CONDITION_COUNT_NPCKILL )
	__TRIGGER_CREATE_CASE( CONDITION_PASS_TIME )
	__TRIGGER_CREATE_CASE( CONDITION_ENTER_AREA )
		m_pMGR->CreateAreaHash(pNew->Get()->GetAreaID());	//< TriggerManager狼 TriggerAreaHash积己
	__TRIGGER_CREATE_CASE( CONDITION_HAVE_ITEM )
	__TRIGGER_CREATE_CASE( CONDITION_MULTI_SWITCH )
	__TRIGGER_CREATE_CASE( CONDITION_MISSION_POINT )
		//m_pMGR->CreateAreaHash(pNew->Get()->GetAreaID());	//< TriggerManager狼 TriggerAreaHash积己
	__TRIGGER_EXCEPT( "殿废登瘤 臼篮 牧叼记 飘府芭涝聪促.1" )
	__TRIGGER_END_SWITCH

	pITrigger->Init( m_pMGR, this );
	ASSERT( NULL == m_ConditionHash.GetData((DWORD)pITrigger) );
	m_ConditionHash.Add( pITrigger, (DWORD)pITrigger );
}


VOID Trigger::_createAction( ActionInfo * pTrigger )
{
	IActionTrigger * pITrigger = NULL;

	__TRIGGER_BEGIN_SWITCH
	//__TRIGGER_CREATE_CASE( ACTION_CHANGE_SWITCH )
	__TRIGGER_CREATE_CASE( ACTION_CHANGE_OBJECTANI )
	__TRIGGER_CREATE_CASE( ACTION_CHANGE_PATHTILE )
	__TRIGGER_CREATE_CASE( ACTION_CHANGE_OBJECTSTATE )
	__TRIGGER_CREATE_CASE( ACTION_PLAY_EVENT )
	__TRIGGER_CREATE_CASE( ACTION_SET_ISATTACK )
	__TRIGGER_CREATE_CASE( ACTION_PORTAL_PLAYER )
	__TRIGGER_CREATE_CASE( ACTION_SET_OBJECTTHRUST )
	__TRIGGER_CREATE_CASE( ACTION_APPLY_DAMAGE )
	__TRIGGER_CREATE_CASE( ACTION_REFLECT_DAMAGE )
	__TRIGGER_CREATE_CASE( ACTION_CREATE_MONSTER )
	__TRIGGER_CREATE_CASE( ACTION_DISPLAY_MSGBOX )
	__TRIGGER_CREATE_CASE( ACTION_REMOVE_ITEM )
	//__TRIGGER_CREATE_CASE( ACTION_PRESERVER )
	__TRIGGER_CREATE_CASE( ACTION_REWARD_PLAYER )
	__TRIGGER_CREATE_CASE( ACTION_CLEAR_MISSION )
	__TRIGGER_CREATE_CASE( ACTION_PORTAL_RANDOM )
	__TRIGGER_CREATE_CASE( ACTION_ACTIVATE_TRIGGER )
	__TRIGGER_CREATE_CASE( ACTION_AREA_DAMAGE )
	__TRIGGER_CREATE_CASE( ACTION_OPERATE_SWITCH )
	__TRIGGER_CREATE_CASE( ACTION_ROAD_CONNECT )
	__TRIGGER_CREATE_CASE( ACTION_CREATE_DIR_MONSTER )
	__TRIGGER_CREATE_CASE( ACTION_CHANGE_LIGHT )
	__TRIGGER_CREATE_CASE( ACTION_CHANGE_OBJECT_TYPE )
	__TRIGGER_EXCEPT( "殿废登瘤 臼篮 咀记 飘府芭涝聪促.1" )
	__TRIGGER_END_SWITCH

	pITrigger->Init( m_pMGR, this );
	ASSERT( NULL == m_ActionHash.GetData((DWORD)pITrigger) );
	m_ActionHash.Add( pITrigger, (DWORD)pITrigger );
}

#pragma warning ( pop )


VOID Trigger::_destroyCondition( IConditionTrigger * pTrigger )
{
	__TRIGGER_BEGIN_SWITCH
	__TRIGGER_DESTROY_CASE( CONDITION_ALWAYS )
	__TRIGGER_DESTROY_CASE( CONDITION_COMPARE_SWITCH )
	__TRIGGER_DESTROY_CASE( CONDITION_CLICK_OBJECT )
	__TRIGGER_DESTROY_CASE( CONDITION_DAMAGE_OBJECT )
	__TRIGGER_DESTROY_CASE( CONDITION_COUNT_NPCKILL )
	__TRIGGER_DESTROY_CASE( CONDITION_PASS_TIME )
	__TRIGGER_DESTROY_CASE( CONDITION_ENTER_AREA )
	__TRIGGER_DESTROY_CASE( CONDITION_HAVE_ITEM )
	__TRIGGER_DESTROY_CASE( CONDITION_MULTI_SWITCH )
	__TRIGGER_DESTROY_CASE( CONDITION_MISSION_POINT )
	__TRIGGER_EXCEPT( "殿废登瘤 臼篮 牧叼记 飘府芭涝聪促.2" )
	__TRIGGER_END_SWITCH
}

VOID Trigger::_destroyAction( IActionTrigger * pTrigger )
{
	__TRIGGER_BEGIN_SWITCH
//	__TRIGGER_DESTROY_CASE( ACTION_CHANGE_SWITCH )
	__TRIGGER_DESTROY_CASE( ACTION_CHANGE_OBJECTANI )
	__TRIGGER_DESTROY_CASE( ACTION_CHANGE_PATHTILE )
	__TRIGGER_DESTROY_CASE( ACTION_CHANGE_OBJECTSTATE )
	__TRIGGER_DESTROY_CASE( ACTION_PLAY_EVENT )
	__TRIGGER_DESTROY_CASE( ACTION_SET_ISATTACK )
	__TRIGGER_DESTROY_CASE( ACTION_PORTAL_PLAYER )
	__TRIGGER_DESTROY_CASE( ACTION_SET_OBJECTTHRUST )
	__TRIGGER_DESTROY_CASE( ACTION_APPLY_DAMAGE )
	__TRIGGER_DESTROY_CASE( ACTION_REFLECT_DAMAGE )
	__TRIGGER_DESTROY_CASE( ACTION_CREATE_MONSTER )
	__TRIGGER_DESTROY_CASE( ACTION_DISPLAY_MSGBOX )
	__TRIGGER_DESTROY_CASE( ACTION_REMOVE_ITEM )
//	__TRIGGER_DESTROY_CASE( ACTION_PRESERVER )
	__TRIGGER_DESTROY_CASE( ACTION_REWARD_PLAYER )
	__TRIGGER_DESTROY_CASE( ACTION_CLEAR_MISSION )
	__TRIGGER_DESTROY_CASE( ACTION_PORTAL_RANDOM )
	__TRIGGER_DESTROY_CASE( ACTION_ACTIVATE_TRIGGER )
	__TRIGGER_DESTROY_CASE( ACTION_AREA_DAMAGE )
	__TRIGGER_DESTROY_CASE( ACTION_OPERATE_SWITCH )
	__TRIGGER_DESTROY_CASE( ACTION_ROAD_CONNECT )
	__TRIGGER_DESTROY_CASE( ACTION_CREATE_DIR_MONSTER )
	__TRIGGER_DESTROY_CASE( ACTION_CHANGE_LIGHT )
	__TRIGGER_DESTROY_CASE( ACTION_CHANGE_OBJECT_TYPE )
	__TRIGGER_EXCEPT( "殿废登瘤 臼篮 咀记 飘府芭涝聪促.2" )
	__TRIGGER_END_SWITCH
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -