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

📄 rpgdatabase.h

📁 五行MMORPG引擎系统V1.0
💻 H
字号:
//RPGDatabase.h
/*/////////////////////////////////////////////////////////////////
	数据库模拟管理
	故所有数据关系皆为关系型结构

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

#ifndef _RPG__DBACCESS_H_
#include "DBAccess.h"
#endif

#ifndef _RPG__RPGDATABASETABLES_H_
#include "RPGDatabaseTables.h"
#endif

#ifndef _RPG__GPLAYER_H_
#include "rpg/gobjects/GPlayer.h"
#endif

#ifndef _RPG__RPGERROR_H_
#include "rpg/RPGError.h"
#endif

//#ifndef _RPG__GGOODSDEFINE_H_
//#include "rpg/gobject/ggoodsDefine.h"
//#endif


namespace RPG
{
class GPlayer;
class GNpc;

/////////////////////////////////////////////////////////////////////
//DB数据操作方法
namespace DB
{
	void Initialize();
	void Destroy();

	template<class T,class F>
	T* SearchField(T arDats[],F pValue,S32 nOffset,U32 nNum)
	{
		F* pField;
		for(U32 n=0; n < nNum/*sizeof(arDats)/sizeof(T)*/; n++)
		{	
			pField = (F*)( ((U32)&arDats[n])  + nOffset);
			if(*pField == pValue)
				return &arDats[n];
		}
		return NULL;
	}


	////////////////////////////////////
	enum EDBFieldOffsets
	{
		FO_CHAR_ID		= Offset(dwID,GCHARACTER),
		FO_PLAYER_ID	= Offset(dwID,GPLAYER),
		FO_PLAYER_NAME	= Offset(dataChar.pCharName,GPLAYER),
		FO_PP_ACCOUNT	= Offset(pAccount,DB::GPASSPORT),
		FO_EQUIPS_ID	= Offset(dwID,GEQUIPMENTS),
		FO_BAGGOODS_ID	= Offset(dwID,GBAGGOODS),
		FO_GGOODS_ID	= Offset(dwID,GGOODS),
		FO_SKILLS_ID	= Offset(dwID,GSKILLS),
		FO_ACTIONS_ID	= Offset(dwID,GACTIONS),
		FO_KEYCELLS_ID	= Offset(dwID,GKEYCELLS),

		FO_SCENE_IDNAME	= Offset(data.pIDName,GSCENE),
		FO_SCENE_ID			= Offset(dwID,GSCENE),
		FO_NPC_NAME			= Offset(dataChar.pCharName,GNPC),
		FO_NPC_ID			= Offset(dwID,GNPC),
		FO_DLGANSWER_ID	= Offset(dwID,GDLGANSWER),
		FO_DLGPIECE_ID		= Offset(dwID,GDLGPIECE),
		FO_DIALOG_ID		= Offset(dwID,GDIALOG),
		FO_TASKBASE_ID		= Offset(dwID,GTASKBASE),
		FO_TASKSTATE_ID	= Offset(dwID,GTASKSTATE),
		FO_TASK_ID			= Offset(dwID,GTASK),
		FO_TASKPIECE_ID	= Offset(dwID,GTASKPIECE),
		FO_EFFICACY_ID		= Offset(dwID,GEFFICACY),
	};

};//namespace DB



///////////////////////////////////////////////////////////////////
#define DB_DECLARE_ASSOCIATE_KEY(GNAME,Table,FType)\
		RPG::G##Table* Process##Table##Key(FType fData,BOOL bCheck=TRUE)

#define DB_DECLARE_ASSOCIATE_KEY2(GNAME,Table,FType)\
		BOOL Process##Table##Key(RPG::G##Table* pG##Table,FType fData)

///////////////////////////////////////////////////////////////////
#define DB_DECLARE_INTEGRATE(T,N)\
		bool  Integrate##N	(DB::##T* pRecord, RPG::G##N* pGObject)





/////////////////////////////////////////////////////////////////
/// RPG数据库模拟
class RPGDatabase: public DBAccess
{
	typedef  DBAccess Parent;
	enum IntegratePlayerOprs
	{
		IPO_PCLIST	=1,
		IPO_OTHER	=2,
		IPO_ALL		= IPO_PCLIST|IPO_OTHER
	};
	Vector<U32>		m_stateStack;
	GNpc*				m_pCurNpc;
	GTask*			m_pCurTask;
public:
	//构造/析构函数
	RPGDatabase(DBProxy* pProxy=NULL);
	~RPGDatabase();

protected:
	///@name 数据表整合操作
	///@{
	//bool  IntegratePlayer	(DB::GPLAYER*		pRecord,	GPlayer*				pGPlayer, IntegratePlayerOprs opr=IPO_ALL);
	//bool  IntegrateNpc		(DB::GNPC*			pRecord,	GNpc*					pGObject);

	DB_DECLARE_INTEGRATE(GPLAYER,		Player);
	DB_DECLARE_INTEGRATE(GNPC,			Npc );
	DB_DECLARE_INTEGRATE(GDIALOG,		Dialog );
	DB_DECLARE_INTEGRATE(GDLGPIECE,	DlgPiece );
	DB_DECLARE_INTEGRATE(GDLGANSWER,	DlgAnswer );
	DB_DECLARE_INTEGRATE(GGOODS,		Goods);
	DB_DECLARE_INTEGRATE(GEFFICACY,	Efficacy);
	DB_DECLARE_INTEGRATE(GTASKBASE,	TaskBase);
	DB_DECLARE_INTEGRATE(GTASKSTATE,	TaskState);
	DB_DECLARE_INTEGRATE(GTASK,		Task);
	DB_DECLARE_INTEGRATE(GTASKPIECE,	TaskPiece);

	DB_DECLARE_ASSOCIATE_KEY(GPLAYER,		Player,		STE);
	DB_DECLARE_ASSOCIATE_KEY(GNPC,			Npc,			STE );
	DB_DECLARE_ASSOCIATE_KEY(GDIALOG,		Dialog,		U32 );
	DB_DECLARE_ASSOCIATE_KEY(GDLGPIECE,		DlgPiece,	U32 );
	DB_DECLARE_ASSOCIATE_KEY(GDLGANSWER,	DlgAnswer,	U32 );
	DB_DECLARE_ASSOCIATE_KEY(GGOODS,			Goods,		U32);
	DB_DECLARE_ASSOCIATE_KEY(GEFFICACY,		Efficacy,	U32);
	DB_DECLARE_ASSOCIATE_KEY2(GTASKBASE,	TaskBase,	U32);
	DB_DECLARE_ASSOCIATE_KEY(GTASKSTATE,	TaskState,	U32);
	DB_DECLARE_ASSOCIATE_KEY(GTASK,			Task,			U32);
	DB_DECLARE_ASSOCIATE_KEY(GTASKPIECE,	TaskPiece,	U32);


	bool IntegrateNpcDat(GNpc* pNpc);
	void	IntegrateGoodsList	(U32 arIDs[],		RPG::GGoods**			parUnits,	U32 nNum);
	///@}


	S32 ProcessLogin	(StringTableEntry pAccount,StringTableEntry pPassword);
	S32 ProcessPCList	(StringTableEntry pAccount);
	S32 ProcessPlayer	(StringTableEntry pName);
	//S32 ProcessNPC		(StringTableEntry pName);
	S32 ProcessScene	(StringTableEntry pName);

	//S32 ProcessNPCDialog (StringTableEntry pName);

public:
	S32 OnSendingTask(GCMDTASK* pTask);
	//void OnTaskFinished(GCMDTASK* pTask,TaskStates state);
	S32 OnRespondeTask(GCMDTASK* pTask){return TRUE;}


#ifdef RPGCMD_USE_THREAD
	void run(S32 arg = 0);
#else
	void Process();
#endif

public:
	static void initPersistFields();
	static void Init();

	//static void consoleInit();

	DECLARE_CONOBJECT(RPGDatabase);
};//class RPGDatabase





//////////////////////////////////////////////////////////////////
//关联表处理
// ATable	被关联表
//	Table		关联表
//	Name		关联G名称
//	TType		关联表类型
//	Type		关联G实例类型
//	NAME		关联G名称大写
//	FIELD		关联G成员
//pRecordATable	被关联表数据源
//pGATable			被关联G实例
#define PROCESS_ASSOCIATE_TABLESELF_EX(Table,AField,Field,KeyDat,pGTable)\
		for(U32 n##Table=0; n##Table<DB_RECORDNUM(Table##Self); n##Table++)\
			{\
				if(DB_RECORD(Table##Self,n##Table).##AField == KeyDat)\
				{\
					RPG::G##Table* pGObj##Table = Process##Table##Key( DB_RECORD(Table##Self,n##Table).##Field );\
					if(pGObj##Table != pGTable)\
						pGTable->Add##Table(pGObj##Table);\
				}\
			}

#define PROCESS_ASSOCIATE_TABLE_EX(ATable,Table,AField,Field,KeyDat,pGATable)\
			for(U32 n##Atable##Table=0; n##Atable##Table<DB_RECORDNUM(ATable##Table); n##Atable##Table++)\
			{\
				if(DB_RECORD(ATable##Table,n##Atable##Table).##AField == KeyDat)\
				{\
					RPG::G##Table* pG##Table = Process##Table##Key( DB_RECORD(ATable##Table,n##Atable##Table).##Field );\
					if(pG##Table)\
						pGATable->Add##Table(pG##Table);\
				}\
			}


//SceneIDName到STE关联
#define 	PROCESS_ASSOCIATE_TABLE_SCENE(Table)\
			PROCESS_ASSOCIATE_TABLE_EX(Scene,Table, sSceneIDName, s##Table##Name,pRecordScene->data.pIDName, pGScene)

//NpcName到ID关联
#define PROCESS_ASSOCIATE_TABLE_NPC(Table)\
		PROCESS_ASSOCIATE_TABLE_EX(Npc,Table, sNpcName,dw##Table##ID, pNpc->GetIDName(),pNpc)

//ID-ID关联
#define PROCESS_ASSOCIATE_TABLE_ID(ATable,Table,Key,pGObject)\
		PROCESS_ASSOCIATE_TABLE_EX(ATable,Table, dw##ATable##ID,dw##Table##ID, Key,pGObject)

//STE-ID关联
#define PROCESS_ASSOCIATE_TABLE_STE_ID(ATable,Table,Key,pGObject)\
		PROCESS_ASSOCIATE_TABLE_EX(ATable,Table, s##ATable##Name, dw##Table##ID, Key,pGObject)

//Table自关联 ID-ID
#define PROCESS_ASSOCIATE_TABLESELF_ID(Table,Key,pGObject)\
		PROCESS_ASSOCIATE_TABLESELF_EX(Table, dwSelfID, dw##Table##ID, Key,pGObject)



////////////////////////////////////////////////////////////////////////
//关联ID组
//CLASS	相关类名
//NAME	名称
//UNIT	单元名称
//OFF		字段偏移量
//CLS		Reset类型
//NUM		记录数量
#define  INTEGER_TABLEARRAY_SLOTS(CLASS,NAME,UNIT,OFF,CLS,NUM)\
	pGObject->ClearData(CLASS##::##CLS);\
	if(pRecord->dw##NAME##ID != DBNUL)\
		{\
			UNIT* pRecord##NAME		= DB::SearchField(DB::Tables::ms_ar##NAME##s,\
						pRecord->dw##NAME##ID, OFF, DB_RECORDNUM(NAME));\
			if(pRecord##NAME)\
			IntegrateGoodsList(pRecord##NAME->arUnits, pGObject->m_ar##NAME.address(), NUM);\
		}

#define  INTEGER_PLAYER_SLOTS(NAME,UNIT,OFF,CLS,NUM)		INTEGER_TABLEARRAY_SLOTS(GPlayer, NAME,UNIT,OFF,CLS,NUM)
#define  INTEGER_NPC_SLOTS(NAME,UNIT,OFF,CLS,NUM)			INTEGER_TABLEARRAY_SLOTS(GNpc,	 NAME,UNIT,OFF,CLS,NUM)


};//namespace RPG
#endif //_RPG__RPGDATABASE_H_

⌨️ 快捷键说明

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