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

📄 gefficacy.h

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

   李亦
	liease@163.com 4040719
	2006-7-14
/*/////////////////////////////////////////////////////////////////
#ifndef _RPG__GEFFICACY_H_
#define _RPG__GEFFICACY_H_

#ifndef _TVECTOR_H_
#include "core/tVector.h"
#endif

#ifndef _RPG__RPGDEFINE_H_
#include "rpg/RPGDefine.h"
#endif

#ifndef _RPG__GGOODSDEFINE_H_
#include "GGoodsDefine.h"
#endif


#ifndef _RPG__GIDOBJECT_H_
#include "GIDObject.h"
#endif


namespace RPG
{
class GCharacter;
class GTaskBase;
class GNpc;
class GEfficacy;
class GPlayer;

enum EGEfficacyKinds
{
	GEK_NULL,
	GEK_PRY			= BIT(0),
	GEK_REQ			= BIT(1),
	GEK_GOODS		= BIT(2),
	GEK_TASK			= BIT(3)
};

/////////////////////////////////////////////////
//功效类型
enum EGEfficacyTypes
{


	GET_NULL				= 0,		//空值

	GET_HP				= BIT(0),		//生命
	GET_MP				= BIT(1),		//魔法
	GET_HPMAX			= BIT(2),		//生命最大值
	GET_MPMAX			= BIT(3),		//魔法最大值
	GET_CP				= BIT(4),		//CP值
	GET_BASE				= GET_HP|GET_MP|GET_HPMAX|GET_MPMAX|GET_CP,

	GET_ATTACK			= BIT(5),		//攻击
	GET_ATTACKRATE		= BIT(6),		//攻击百分比
	GET_DEFENCE			= BIT(7),		//防御
	GET_DEFENCERATE	= BIT(8),		//防御百分比
	GET_ATTACKDEF		= GET_ATTACK|GET_ATTACKRATE|GET_DEFENCE|GET_DEFENCERATE,

	GET_MOVESPEED		= BIT(9),		//移动速度
	GET_MOVERATE		= BIT(10),		//移动速度百分比
	GET_MOVE				= GET_MOVESPEED|GET_MOVERATE,

	GET_GOODSADD		= BIT(11),		//物品增加
	GET_GOODSREDUCE	= BIT(12),		//物品删除
	GET_GOODSCHECK		= BIT(13),		//物品检测
	GET_GOODSAPPLY		= BIT(14),		//使用物品,适用于技能、人物动作、物品、装备等使用
	GET_MONEY			= BIT(15),		//金钱检测 unAbility2.amount
	GET_MONEYADD		= GET_MONEY|GET_GOODSADD,		//增加金钱 unAbility2.amount
	GET_MONEYREDUCE	= GET_MONEY|GET_GOODSREDUCE,	//扣除金钱 unAbility2.amount
	GET_MASK_GOODS		= GET_MONEY|GET_GOODSADD|GET_GOODSREDUCE|GET_GOODSAPPLY,	//物品操作,同时操作金钱、物品


	GRT_CAREER			= BIT(16),		//人物职业 career
	GRT_LEVEL			= BIT(17),		//人物等级 dwLevel
	GRT_GENDER			= BIT(18),		//人物性别 gender
	GET_MASK_REQUIRE		= GET_MONEY|GRT_LEVEL|GRT_GENDER|GRT_CAREER|GET_GOODSCHECK,	//检测操作,不可发生增加、删除

	GET_GOALOBJECT		= BIT(19),		//目标物件
	GET_GOALRESULT		= BIT(20),		//目标结果
	GET_TASKGOAL		= BIT(21),		//任务目标
	GET_TASKPREMIUM	= BIT(22),		//任务奖励


	//暂时考虑改变基本能力值,故放在最后,在不需要时,方便撤消
	GET_STR				= BIT(22),		//力量
	GET_INT				= BIT(23),		//智力
	GET_CON				= BIT(24),		//体力
	GET_DEX				= BIT(25),		//敏捷
	GET_WIT				= BIT(26),		//智慧
	GET_ABILITY			= GET_STR|GET_INT|GET_CON|GET_DEX|GET_WIT,
	GET_STR2				= BIT(27),		//力量
	GET_INT2				= BIT(28),		//智力
	GET_CON2				= BIT(29),		//体力
	GET_DEX2				= BIT(30),		//敏捷
	GET_WIT2				= BIT(31),		//智慧
	GET_ABILITY2		= GET_STR2|GET_INT2|GET_CON2|GET_DEX2|GET_WIT,

	GET_MASK_PRY		= GET_BASE|GET_ATTACKDEF|GET_MOVE|GET_ABILITY|GET_ABILITY2,
	GET_CREATE			= GET_GOODSADD|GET_MONEYADD|GET_GOODSCHECK,
};



/////////////////////////////////////////////////////////////////
//功效封装
typedef struct tagGEfficacy
{
	U32	dwTypes;	//类型组合
	U32	dwKind;  //类别

	union
	{
		int	nCP;		//生命
		int	nHP;		//生命
		int	nMP;		//魔法
		int	nHPMax;	//生命最大值
		int	nMPMax;	//魔法最大值
		int	nGoodsCode;		//物品代码,适用物品操作
		U32	dwLevel;	//人物等级	
	}/*unBase*/;

	union
	{
		int	nAttack;			//攻击
		int	nAttackRate;	//攻击百分比
		int	nDefence;		//防御
		int	nDefendRate;	//防御百分比
		int	nGoodsKind;		//物品类别,适用物品操作
		EGGender		gender;	//性别限制
	}/*unAttackDefence*/;

	union
	{
		int	fMoveSpeed;			//移动速度
		int	fMoveRate;			//移动速度百分比
		int	nGoodsLevel;		//物品级别,适用物品操作
		EGCareer		career;		//职业限制
	}/*unDisplace*/;


	union /*Ability*/
	{
		int	aSTR;	//力量STRength
		int	aINT;	//智力INTelligence
		int	aCON;	//体力CONstitution
		int	aDEX;	//敏捷DEXterity
		int	aWIT;	//智慧WIT
		int	nAmount;	//数量级,适用物品操作
	};

	union /*Ability*/
	{
		int	aSTR2;	//力量STRength
		int	aINT2;	//智力INTelligence
		int	aCON2;	//体力CONstitution
		int	aDEX2;	//敏捷DEXterity
		int	aWIT2;	//智慧WIT
		int	nAmount2;	//数量级,适用物品操作
		int	nMoney;	//数量级,适用Money数量
		int	nGoodsEffID;	//物品功效,适用 GoodsAdd
	};

	//Ability	unAbility,	//适用物品	//如果为Money型,增加物品没功效;如果只为物品型,ability2为功效
	//			unAbility2;	//适用金钱	物品功效

}GEFFICACY;



typedef struct tagGoodsRef
{
	const GEFFICACY*	pData;
	GNpc*			pNpc;
	GTaskBase*	pTask;
	BOOL			bCreateGoods;
	GEfficacy*	pEfficacy;
	BOOL			bGoodsDeal;

	union{
	GCharacter* pGChar;
	GPlayer*		pGPlayer;
	};

	tagGoodsRef(GCharacter* pChar0=NULL,GNpc* pNpc0=NULL,GTaskBase* pTask0=NULL,BOOL bCreateGoods0=TRUE)
	{
		pData				= NULL;
		pEfficacy		= NULL;
		pGChar			= pChar0;
		pNpc				= pNpc0;
		pTask				= pTask0;
		bCreateGoods	= bCreateGoods0;
		bGoodsDeal		= true;
	}
	tagGoodsRef(const tagGoodsRef& src)
	{
		*this			= src;
	}
	tagGoodsRef(const GEFFICACY& dat,const tagGoodsRef& src,GEfficacy* pGoodsEffect=NULL)
	{
		*this			= src;
		pEfficacy	= pGoodsEffect;
		pData			= &dat;
	}
	BOOL GetFromToNpc(U32 dwGoodsType,GNpc*& pGoodsFrom,GNpc*& pGoodsTo)const;
}GGOODSREF;



//////////////////////////////////////////////////////
#define DECLARE_EFFICACY_MEMBER(Name)\
protected:\
	Vector<G##Name*>		m_ar##Name##s;\
public:\
	inline Vector<G##Name*>& Get##Name##s() {return m_ar##Name##s;}\
	inline U32  Get##Name##Size() {return m_ar##Name##s.size();}\
	inline G##Name*  Get##Name(U32 nIndex)const\
		{\
			if(nIndex >= m_ar##Name##s.size()) return NULL;\
			return m_ar##Name##s[nIndex];\
		}\
	inline U32 Add##Name	(G##Name* pGObject)\
		{ return m_ar##Name##s.addExist(pGObject);}


//////////////////////////////////////////////////////
//功效类型封装
class GEfficacy : public GIDObject
{
	typedef GIDObject Parent;
	friend class RPGDatabase;
	struct Reflect
	{
		U32	a;
		U32	b;
	};
protected:
	GEFFICACY	m_data;
	GEfficacy*	m_pGoodsEfficacy;	//物品功效,适用 Goods操作有效

	DECLARE_EFFICACY_MEMBER(Efficacy);		//功效列表
public:
	GEfficacy();

	U32  InterpretToTakeOutType(U32 dwType,U32 dwMask);

	BOOL CheckRequire(const GGOODSREF& ref);
	BOOL CreateBy(const GGOODSREF& ref);
	BOOL CheckOut(const GGOODSREF& ref);
	BOOL TakeOut(const GGOODSREF& ref);
	BOOL ApplyTo(const GGOODSREF& ref);

#ifdef TGE_RPGCLIENT
	CSTR GetRequireText(const GGOODSREF& ref);
	CSTR GetEfficacyText(const GGOODSREF& ref);
	void GetGoodsModName(const GGOODSREF& ref,GGOODSDEFINE* pDefine,char*& pBuffer,U32& dwLeft);
#endif

//	BOOL CheckRequire(GCharacter* pGChar,GNpc* pNpc=NULL,GTaskBase* pTask=NULL);
//	BOOL CreateBy(GCharacter* pGChar,GEfficacy* pEfficacy=NULL,GNpc* pNpc=NULL,GTaskBase* pTask=NULL);
//	BOOL CheckOut(GCharacter* pGChar,GNpc* pNpc=NULL,GTaskBase* pTask=NULL);
//	BOOL TakeOut(GCharacter* pGChar,GNpc* pNpc=NULL,GTaskBase* pTask=NULL);
//	BOOL ApplyTo(GCharacter* pGChar,GNpc* pNpc=NULL,GTaskBase* pTask=NULL);
//
//#ifdef TGE_RPGCLIENT
//	CSTR GetRequireText(GCharacter* pGChar,GNpc* pNpc=NULL,GTaskBase* pTask=NULL);
//	CSTR GetEfficacyText(GCharacter* pGChar,GNpc* pNpc=NULL,GTaskBase* pTask=NULL);
//	void GetGoodsModName(GCharacter* pGChar,GNpc* pNpc,GTaskBase* pTask,GGOODSDEFINE* pDefine,char*& pBuffer,U32& dwLeft);
//#endif

public:
	///@name 依据类型获取属性值
	///@{
	F32 GetMoveRate();
	F32 GetMoveSpeed();
	BOOL IsGoodsType();
	///@}
};//GEfficacy


//////////////////////////////////////////////////////
//功效类型

#define GETIsMask(mask)		(m_data.dwTypes & (mask))
#define GETIsType(type)		((m_data.dwTypes & (type)) == (type))

inline F32 GEfficacy::GetMoveRate()
{
	if(GETIsMask(GET_MASK_REQUIRE) || GETIsMask(GET_MASK_GOODS) )
		return 0.f;
	if(GETIsType(GET_MOVERATE))
		return m_data./*unDisplace.*/fMoveRate*0.01f;
	return 0.f;
}

inline F32 GEfficacy::GetMoveSpeed()
{
	if(GETIsMask(GET_MASK_REQUIRE) || GETIsMask(GET_MASK_GOODS) )
		return 0.f;
	if(GETIsType(GET_MOVESPEED))
		return m_data./*unDisplace.*/fMoveSpeed*0.01f;
	return 0.f;
}

inline BOOL GEfficacy::IsGoodsType()
{
	return !GETIsMask(GET_MASK_REQUIRE) && GETIsMask(GET_MASK_GOODS);
}



};//namespace RPG
#endif //_GEFFICACY_H_

⌨️ 快捷键说明

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