📄 gefficacy.cc
字号:
//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 + -