📄 gefficacy.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 + -