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

📄 gefficacy.cc

📁 五行MMORPG引擎系统V1.0
💻 CC
📖 第 1 页 / 共 2 页
字号:
//GEfficacy.h
/*/////////////////////////////////////////////////////////////////
	功效类封装
		游戏中物品、技能等通常都产生多种功效
		功效只限制于临时改变人物属性,固定属性及身外属性不作处理(如金钱、经验等)

   李亦
	liease@163.com 4040719
	2006-7-14
/*/////////////////////////////////////////////////////////////////


#include "platform/platform.h"
#include "rpg/gobjects/GEfficacy.h"
#include "rpg/gobjects/GCharacter.h"
#include "rpg/RPGDataMan.h"
#include "rpg/gobjects/GTask.h"


namespace RPG
{


/////////////////////////////////////////////////////////////////
	// class GEfficacy 构造函数 /析构函数
GEfficacy::GEfficacy()
{
	m_data.dwTypes		= GET_NULL;
	m_pGoodsEfficacy	= NULL;
}



#define GECheckType(type)				((dwResult&(type)) == (type))
#define GECheckType2(type)				(dwResult&(type))
#define GEResultType(type,mask)		dwResult = ((dwResult & ~(type))  &mask);
#define GEIsResult(mask)				(dwResult & mask)
#define GEIsOK()							(dwResult == GET_NULL)



BOOL tagGoodsRef::GetFromToNpc(U32 dwGoodsType, GNpc*& pGoodsFrom, GNpc*& pGoodsTo)const
{
	if(pTask && dwGoodsType == GGT_TASK)
	{
		if(bCreateGoods)
		{
			if(pTask->IsToNpc(pNpc))
			{
				pGoodsFrom	= pTask->GetToNpc();
				pGoodsTo		= pTask->GetFromNpc();
				return TRUE;
			}
			else if(pTask->IsOwnerNpc(pNpc) )
			{
				pGoodsTo		= pTask->GetToNpc();
				pGoodsFrom	= pTask->GetFromNpc();
				return TRUE;
			}
		}//if(bCreateGoods)
		else
		{
			if(pTask->IsToNpc(pNpc))
			{
				pGoodsTo		= pTask->GetToNpc();
				pGoodsFrom	= pTask->GetFromNpc();
				return TRUE;
			}
			else if(pTask->IsOwnerNpc(pNpc) )
			{
				pGoodsFrom	= pTask->GetToNpc();
				pGoodsTo		= pTask->GetFromNpc();
				return TRUE;
			}
		}
	}//if

laFailed:
	{
		pGoodsTo		= NULL;
		pGoodsFrom	= NULL;
	}
	return FALSE;
}


BOOL GEfficacy::CheckRequire(const GGOODSREF& ref)
{
	U32	dwResult;
	U32	dwType;
	//BOOL	bProcess;

	if(!ref.pGChar)
		return FALSE;
	if(m_data.dwTypes == GET_NULL)
		return TRUE;

	dwResult	= (m_data.dwTypes & GET_MASK_REQUIRE);

	//////////////////////////////////////////////////////////
	//人物属性检测处理

	//人物等级 dwLevel
	if(GECheckType(GRT_LEVEL) )
	{
		if(ref.pGChar->GetLevel() >= m_data.dwLevel)
			GEResultType(GRT_LEVEL, GET_MASK_REQUIRE);
	}
	//人物性别 gender
	if(GECheckType(GRT_GENDER) )		
	{
		if(ref.pGChar->GetGender() == m_data.gender)
			GEResultType(GRT_GENDER, GET_MASK_REQUIRE);
	}
	//人物职业 career
	if(GECheckType(GRT_CAREER) )		
	{
		if(ref.pGChar->GetCareer() == m_data.career)
			GEResultType(GRT_CAREER, GET_MASK_REQUIRE);
	}



	//如果结果只余下 Money,则为人物属性检测
	if(GECheckType(GET_MONEY) )		
	{
		if(ref.pGChar->GetMoney() >= m_data.nMoney)
			GEResultType(GET_MONEY, GET_MASK_REQUIRE);
	}

	//物品检测
	if(GECheckType(GET_GOODSCHECK) )
	{
		BOOL bProcess = FALSE;
		if(m_data.nGoodsCode != -1)
			bProcess = ref.pGChar->ExistGoods(m_data.nGoodsCode,
								(EGGoodsKind)m_data.nGoodsKind,
								m_data.nGoodsLevel,
								m_data.nAmount);

		if(bProcess)
			GEResultType(GET_GOODSCHECK, GET_MASK_REQUIRE);
	}//if(GECheckType(GET_GOODSCHECK) )


	//在这里需要检测人物属性结果
	return GEIsOK();
}


BOOL GEfficacy::CreateBy(const GGOODSREF& ref)
{
	U32	dwResult;
	U32	dwType;
	BOOL	bProcess;

	if(!ref.pGChar)
		return FALSE;
	if(m_data.dwTypes == GET_NULL)
		return TRUE;

	dwResult	= (m_data.dwTypes & GET_CREATE);
	/*////////////////////////
		处理优先顺序
		.人物属性
		.金钱
		.物品
		.move
		.HP/MP
		.attack/def
		.基本属性
		.能力值
	/*////////////////////////
	

	//////////////////////////////////////////////////
	//物品、金钱处理
	//物品删除
	//金钱检测
	bProcess = FALSE;
	if(GECheckType(GET_MONEYADD) )
	{
		bProcess = TRUE;
		if( ref.pGChar->AddMoney( m_data.nMoney>=0 ? m_data.nMoney : 0) )
			GEResultType(GET_MONEY, GET_CREATE);
	}//if(GECheckType(GET_MONEYADD) )
	
	if(GECheckType(GET_GOODSADD) )
	{
		//增加物品
		if(m_data.nGoodsCode != -1)
		{	
			GEfficacy* pEfficacy = g_pRPGDataMan->GetEfficacy(m_data.nGoodsEffID);

			GGOODSREF refNew(m_data, ref,pEfficacy);
			bProcess = ref.pGChar->AddGoods(refNew);//m_data,ref.pNpc,ref.pTask);
			//bProcess = ref.pGChar->AddGoods(m_data,ref.pNpc,ref.pTask);
		}
		if(bProcess)
			GEResultType(GET_GOODSADD, GET_CREATE);
	}//if(GECheckType(GET_GOODSADD) )

	return GEIsOK();
}



U32  GEfficacy::InterpretToTakeOutType(U32 dwType,U32 dwMask)
{
	U32		dwRet;
	U32		n;
	U32		dwEntry;

	static Reflect arReflect[]=
	{
		GET_GOODSADD,		GET_GOODSREDUCE,
		GET_GOODSREDUCE,	GET_GOODSADD,
		GET_GOODSCHECK,	GET_GOODSREDUCE,
		GET_MONEYADD,		GET_MONEYREDUCE,
		GET_MONEY,			GET_MONEYREDUCE,
	};

	dwType	&= dwMask;
	dwRet		= 0;

	for(n=0; n<sizeof(arReflect)/sizeof(Reflect); n++)
	{
		dwEntry = arReflect[n].a;
		if((dwType&dwEntry) != dwEntry)
			continue;
		dwRet |= arReflect[n].b;
	}//for

	return dwRet;
}


BOOL GEfficacy::CheckOut(const GGOODSREF& ref)
{
	U32	dwResult;
	U32	dwType;
	BOOL	bProcess;

	if(!ref.pGChar)
		return FALSE;
	if(m_data.dwTypes == GET_NULL)
		return TRUE;

	dwResult	= (m_data.dwTypes& GET_CREATE);
	

	//////////////////////////////////////////////////
	//物品、金钱处理
	//物品删除
	//金钱检测
	bProcess = FALSE;
	
	if(GECheckType(GET_GOODSADD) )
	{
		//增加物品
		if(m_data.nGoodsCode != -1)
		{	
			GGOODSREF refNew(m_data,ref);
			bProcess = ref.pGChar->ExistGoods(refNew);
			//bProcess = ref.pGChar->ExistGoods(m_data, ref.pNpc, ref.pTask);
		}
		if(bProcess)
			GEResultType(GET_GOODSADD, GET_CREATE);
	}//if(GECheckType(GET_GOODSADD) )

	return GEIsOK();
}


BOOL GEfficacy::TakeOut(const GGOODSREF& ref)
{
	U32	dwResult;
	U32	dwType;
	BOOL	bProcess;

	if(!ref.pGChar)
		return FALSE;
	if(m_data.dwTypes == GET_NULL)
		return TRUE;

	dwResult	= InterpretToTakeOutType(m_data.dwTypes, GET_CREATE);
	/*////////////////////////
		处理优先顺序
		.人物属性
		.金钱
		.物品
		.move
		.HP/MP
		.attack/def
		.基本属性
		.能力值
	/*////////////////////////
	

	//////////////////////////////////////////////////
	//物品、金钱处理
	//物品删除
	//金钱检测
	bProcess = FALSE;
	if(GECheckType(GET_MONEYREDUCE) )
	{
		bProcess = TRUE;
		if( ref.pGChar->AddMoney( m_data.nMoney>=0 ? -m_data.nMoney : 0) )
			GEResultType(GET_MONEY, GET_CREATE);
	}//if(GECheckType(GET_MONEYADD) )
	
	if(GECheckType(GET_GOODSREDUCE) )
	{
		//增加物品
		if(m_data.nGoodsCode != -1)
		{	
			GGOODSREF refNew(m_data,ref);
			bProcess = ref.pGChar->RemoveGoods(refNew);
			//bProcess = ref.pGChar->RemoveGoods(m_data.nGoodsCode,(EGGoodsKind)m_data.nGoodsKind,m_data.nGoodsLevel,m_data.nAmount);
			//bProcess = ref.pGChar->RemoveGoods(m_data,ref.pNpc,ref.pTask);
		}
		if(bProcess)
			GEResultType(GET_GOODSREDUCE, GET_CREATE);
	}//if(GECheckType(GET_GOODSADD) )

	return GEIsOK();
}



BOOL GEfficacy::ApplyTo(const GGOODSREF& ref)
{
	U32	dwResult;
	U32	dwType;
	BOOL	bProcess;

	if(!ref.pGChar)
		return FALSE;
	if(m_data.dwTypes == GET_NULL)
		return TRUE;

	dwResult	= m_data.dwTypes;
	/*////////////////////////
		处理优先顺序
		.人物属性
		.金钱
		.物品
		.move
		.HP/MP
		.attack/def
		.基本属性
		.能力值
	/*////////////////////////
	

	//////////////////////////////////////////////////
	//物品、金钱处理
	//物品删除
	//金钱检测
	bProcess = FALSE;
	if(GECheckType(GET_MONEYADD) )
	{
		bProcess = TRUE;
		if( ref.pGChar->AddMoney( m_data.nMoney>=0 ? m_data.nMoney : 0) )
			GEResultType(GET_MONEY, GET_MASK_GOODS);
	}//if(GECheckType(GET_MONEYADD) )
	

⌨️ 快捷键说明

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