📄 ggoods.h
字号:
//GGoods.h
/*/////////////////////////////////////////////////////////////////
物品管理
因为不同类型物品,拥有不一样的属性;而同类物品,则拥有类似的属性,
物品基类
物品 tagGGoods
物品超类
元素 tagGGElement
材料 tagGGMaterial
收集 tagGGCollection
消耗物品 tagGGConsume
道具 tagGGProperty
任务物品 tagGGTask
装备 tagGGEquipment
技能 tagGSkill
物品层次类别
GGK_NORMAL, //普通型
GGK_GOOD, //优良
GGK_EXCELLENT, //卓越
GGK_RARITY, //珍品
GGK_NOSUCH, //极品
李亦
liease@163.com 4040719
2006-7-13
/*/////////////////////////////////////////////////////////////////
#ifndef _RPG__GGOODS_H_
#define _RPG__GGOODS_H_
#ifndef _RPG__RPGDEFINE_H_
#include "rpg/RPGDefine.h"
#endif
#ifndef _RPG__GOBJECT_H_
#include "GObject.h"
#endif
#ifndef _RPG__GGOODSDEFINE_H_
#include "GGoodsDefine.h"
#endif
#ifndef _RPGSETTING_H_
#include "rpg/RPGSetting.h"
#endif
#ifndef _RPG__GEFFICACY_H_
#include "GEfficacy.h"
#endif
namespace RPG
{
class GEfficacy;
class GCharacter;
class GNpc;
class GTaskBase;
class GGoodsArray;
/////////////////////////////////////////////////////////////////
//游戏物品实例
typedef struct tagGGoods
{
U32 dwGoodsId; //物品代号
U32 dwLevel; //级别
U32 dwKind; //层次
//U16 wGoodsType; //类型
//U16 wSubType; //子类型
S32 dwWear; //当前耐久度
//S32 wLife; //当前生命值
}GGOODS;
//////////////////////////////////////////////////////////
//属性存取定义宏
#define DELCARE_GOODS_PRY(Name,pre,type)\
inline type Get##Name()\
{\
AssertWarn(m_pGoodsDefine,"先物品定义为NULL,GoodsDefine");\
if(m_pGoodsDefine==NULL)\
return 0;\
return m_pGoodsDefine->##pre##Name;\
}
#define DELCARE_GOODS_PRY_IN(Name,pre,type)\
inline type Get##Name()\
{\
return m_dataGoods.##pre##Name;\
}
#define DELCARE_GOODS_U32(Name) DELCARE_GOODS_PRY(Name,dw,U32)
#define DELCARE_GOODS_S32(Name) DELCARE_GOODS_PRY(Name,n,S32)
#define DELCARE_GOODS_STE(Name) DELCARE_GOODS_PRY(Name,p,StringTableEntry)
#define DELCARE_GOODS_STE2(Name) DELCARE_GOODS_PRY(Name,s,StringTableEntry)
#define DELCARE_GOODS_U32_IN(Name) DELCARE_GOODS_PRY_IN(Name,dw,U32)
#define DELCARE_GOODS_S32_IN(Name) DELCARE_GOODS_PRY_IN(Name,n,S32)
#define DELCARE_GOODS_STE_IN(Name) DELCARE_GOODS_PRY_IN(Name,p,StringTableEntry)
//////////////////////////////////////////////////////////
//属性存取定义宏
#define CONSOLEMETHOD_GOODS_PRY(Name,fName,type)\
ConsoleMethod(GGoods,Get##Name,type, 2, 2, "Object."##fName##"();")\
{\
argc;argv;\
return (type)object->Get##Name();\
}
#define CONSOLEMETHOD_GOODS_U32(Name,fName) CONSOLEMETHOD_GOODS_PRY(Name,fName,S32)
#define CONSOLEMETHOD_GOODS_S32(Name,fName) CONSOLEMETHOD_GOODS_PRY(Name,fName,S32)
#define CONSOLEMETHOD_GOODS_STE(Name,fName) CONSOLEMETHOD_GOODS_PRY(Name,fName,const char*)
/////////////////////////////////////////////////////////////////
/// 物品封装
class GGoods: public GObject
{
typedef GObject Parent;
friend class RPGDatabase;
protected:
GGOODS m_dataGoods;
GGOODSDEFINE *m_pGoodsDefine;
GEfficacy* m_pGEfficacy; //物品功效
GEfficacy* m_pRequire; //物品要求
GNpc* m_pGoodsFromNpc;
GNpc* m_pGoodsToNpc;
public:
//构造/析构函数
GGoods();
~GGoods();
public:
bool AttachGoodsDefine();
bool SetGoods(U32 nGoodsCode, EGGoodsKind kind, U32 nLevel,GEfficacy* pEfficacy);
bool SetGoods(const GGOODSREF& ref);
bool IsTheSameGoods(GGoods* pGoods);
bool IsTheSameGoods(U32 nGoodsCode, EGGoodsKind kind, U32 nLevel);
bool IsTheSameGoods(const GGOODSREF& ref);//const GEFFICACY& effData,GNpc* pNpc=NULL,GTaskBase* pTask=NULL);
//bool IsTheSameGoods(const GEFFICACY& effData,GNpc* pNpc=NULL,GTaskBase* pTask=NULL);
CSTR GetFullName();
virtual bool OnGoodsApply(GGoodsArray* pContainer);
public:
GGOODSDEFINE* GetGoodsDefine();
GEfficacy* GetEfficacy();
GEfficacy* GetRequire();
CSTR GetEfficacyText(GCharacter* pChar);
CSTR GetRequireText(GCharacter* pChar);
BOOL IsGoodsType(EGGoodsTypes type);
BOOL IsSubType(U32 type);
BOOL IsType(EGGoodsTypes type,U32 sub);
//StringTableEntry GetGoodsName();
//StringTableEntry GetDesc();
//StringTableEntry GetIconLabel();
//U32 GetGoodsType();
//U32 GetSubType();
StringTableEntry GetKindName();
StringTableEntry GetInstName();
DELCARE_GOODS_STE(GoodsName);
DELCARE_GOODS_STE(Desc);
DELCARE_GOODS_STE2(Unit);
DELCARE_GOODS_STE(IconLabel);
DELCARE_GOODS_STE(FileTitle);
DELCARE_GOODS_U32(GoodsType);
DELCARE_GOODS_U32(SubType);
DELCARE_GOODS_U32_IN(Level);
DELCARE_GOODS_U32(Mass);
DELCARE_GOODS_U32(Kind);
inline GNpc* GetGoodsToNpc ( )const{return m_pGoodsToNpc;}
inline GNpc* GetGoodsFromNpc()const{return m_pGoodsFromNpc;}
inline void SetGoodsToNpc (GNpc* pNpc){m_pGoodsToNpc = pNpc;}
inline void SetGoodsFromNpc(GNpc* pNpc){m_pGoodsFromNpc = pNpc;}
inline BOOL IsGoodsTo(GNpc* pChar) const {return pChar != NULL && m_pGoodsToNpc == pChar;}
inline BOOL IsGoodsFrom(GNpc* pChar) const {return pChar != NULL && m_pGoodsFromNpc == pChar;}
public:
#ifdef TGE_RPGCLIENT
static void ToggleGoods(GGoods* pGoods,BOOL bAssignName=TRUE);
#endif
static void initPersistFields();
//static void consoleInit();
DECLARE_CONOBJECT(GGoods);
};//class GGoods
//////////////////////////////////////////////////////////////////////////////
//
extern GGoods* g_pGGoods;
//////////////////////////////////////////////////////////////////////////////
class ToggleGoodsHandle
{
public:
ToggleGoodsHandle(GGoods* pGoods,BOOL bName=FALSE){GGoods::ToggleGoods(pGoods,bName);}
~ToggleGoodsHandle(){GGoods::ToggleGoods(NULL);}
inline GGoods* operator->(){return g_pGGoods;}
};
//////////////////////////////////////////////////////////////////////////////
inline GGOODSDEFINE* GGoods::GetGoodsDefine()
{
return m_pGoodsDefine;
}
inline GEfficacy* GGoods::GetEfficacy()
{
return m_pGEfficacy;
}
inline GEfficacy* GGoods::GetRequire()
{
return m_pRequire;
}
inline CSTR GGoods::GetEfficacyText(GCharacter* pChar)
{
if(m_pGEfficacy)
return m_pGEfficacy->GetEfficacyText(pChar);
return "";
}
inline CSTR GGoods::GetRequireText(GCharacter* pChar)
{
if(m_pRequire)
return m_pRequire->GetRequireText(pChar);
return "";
}
inline BOOL GGoods::IsGoodsType(EGGoodsTypes type)
{
AssertWarn(m_pGoodsDefine,"先物品定义为NULL,GoodsDefine");
return m_pGoodsDefine->dwGoodsType == type;
}
inline BOOL GGoods::IsSubType(U32 type)
{
AssertWarn(m_pGoodsDefine,"先物品定义为NULL,GoodsDefine");
return m_pGoodsDefine->dwSubType == type;
}
inline StringTableEntry GGoods::GetKindName()
{
AssertWarn(g_pRPGSetting,"先创建RPGSetting实例");
return g_pRPGSetting->GetGoodsKindName(GetKind());
}
inline BOOL GGoods::IsType(EGGoodsTypes type,U32 sub)
{
AssertWarn(m_pGoodsDefine,"先物品定义为NULL,GoodsDefine");
if(type == GGT_EQUIP)
{
if(sub == EQUIP_LACE2)
sub = EQUIP_LACE;
else if(sub == EQUIP_RING2)
sub = EQUIP_RING;
}
return m_pGoodsDefine->dwGoodsType == type && m_pGoodsDefine->dwSubType == sub;
}
inline StringTableEntry GGoods::GetInstName()
{
AssertWarn(m_pGoodsDefine && g_pRPGSetting,"先物品定义为NULL,GoodsDefine");
StringTableEntry sSubLabel;
if(m_pGoodsDefine->dwGoodsType == GGT_EQUIP)
sSubLabel = g_pRPGSetting->GetEquipTypeLabel(m_pGoodsDefine->dwSubType);
else
sSubLabel = "";
return StringTable->insert( avar("%s_%s",sSubLabel, m_pGoodsDefine->pFileTitle) );
}
};//namespace RPG
#endif //_GGOODS_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -