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

📄 rpgdatabasetableprocess.cc

📁 五行MMORPG引擎系统V1.0
💻 CC
📖 第 1 页 / 共 2 页
字号:
//RPGDatabaseTableProcess.cc
/*/////////////////////////////////////////////////////////////////
	数据库模拟管理
	故所有数据关系皆为关系型结构

   李亦
	liease@163.com 4040719
	2006-7-20
/*/////////////////////////////////////////////////////////////////
#include "rpg/cmd/RPGDatabase.h"
//#include "rpg/cmd/RPGDatabaseDefine.h"
#include "rpg/RPGDataMan.h"
#include "rpg/cmd/DBProxy.h"
#include "rpg/ui/gameIconDefine.h"
#include "rpg/RPGDialog.h"


namespace RPG
{


////////////////////////////////////////////////////////////////////////////////
#define DB_IMPLEMENT_ASSOCIATE_KEY(GNAME,Table,FType,DATNULL,FOffset)\
	RPG::G##Table* RPGDatabase::Process##Table##Key(FType fData,BOOL bCheck)\
			{\
				RPG::G##Table* pG##Table;\
				DB::##GNAME*	pRecord##Table;\
				pG##Table = NULL;\
				if(fData != DATNULL)\
				{\
					if(bCheck)\
						pG##Table = g_pRPGDataMan->Get##Table(fData);\
					if(bCheck && !pG##Table || !bCheck)\
					{	\
						pRecord##Table = DB::SearchField(DB_TABLE(Table),\
												fData,\
												FOffset,\
												DB_RECORDNUM(Table));\
						if(pRecord##Table)\
						{\
							pG##Table = g_pRPGDataMan->Reg##Table(fData);\
							if(pG##Table)\
								Integrate##Table(pRecord##Table, pG##Table);\
						}\
					}\
				}\
				return pG##Table;\
			}

//////////////////////////////////////////
#define DB_IMPLEMENT_ASSOCIATE_KEY2(GNAME,Table,FType,DATNULL,FOffset)\
	BOOL RPGDatabase::Process##Table##Key(RPG::G##Table* pG##Table,FType fData)\
			{\
				DB::##GNAME*	pRecord##Table;\
				if(fData != DATNULL)\
				{\
					{	\
						pRecord##Table = DB::SearchField(DB_TABLE(Table),\
												fData,\
												FOffset,\
												DB_RECORDNUM(Table));\
						if(pRecord##Table)\
						{\
							Integrate##Table(pRecord##Table, pG##Table);\
						return TRUE;\
						}\
					}\
				}\
				return FALSE;\
			}


//////////////////////////////////////////


DB_IMPLEMENT_ASSOCIATE_KEY(GPLAYER,		Player,		STE, NULL,	DB::FO_PLAYER_NAME);
DB_IMPLEMENT_ASSOCIATE_KEY(GNPC,			Npc,			STE, NULL,	DB::FO_NPC_NAME );
DB_IMPLEMENT_ASSOCIATE_KEY(GDIALOG,		Dialog,		U32, DBNUL, DB::FO_DIALOG_ID );
DB_IMPLEMENT_ASSOCIATE_KEY(GDLGPIECE,	DlgPiece,	U32, DBNUL, DB::FO_DLGPIECE_ID );
DB_IMPLEMENT_ASSOCIATE_KEY(GDLGANSWER,	DlgAnswer,	U32, DBNUL, DB::FO_DLGANSWER_ID );
DB_IMPLEMENT_ASSOCIATE_KEY(GGOODS,		Goods,		U32, DBNUL, DB::FO_GGOODS_ID);
DB_IMPLEMENT_ASSOCIATE_KEY(GEFFICACY,	Efficacy,	U32, DBNUL, DB::FO_EFFICACY_ID);
DB_IMPLEMENT_ASSOCIATE_KEY2(GTASKBASE,	TaskBase,	U32, DBNUL, DB::FO_TASKBASE_ID);
DB_IMPLEMENT_ASSOCIATE_KEY(GTASKSTATE,	TaskState,	U32, DBNUL, DB::FO_TASKSTATE_ID);
DB_IMPLEMENT_ASSOCIATE_KEY(GTASK,		Task,			U32, DBNUL, DB::FO_TASK_ID);
DB_IMPLEMENT_ASSOCIATE_KEY(GTASKPIECE,	TaskPiece,	U32, DBNUL, DB::FO_TASKPIECE_ID);




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

 





////////////////////////////////////////////////////////////////////////////////
namespace DB
{

static S32 QSORT_CALLBACK TaskTaskPieceOrderCmp(const void* a,const void* b)
{

	const GTASKTASKPIECE* p0 = (const GTASKTASKPIECE*)a;
	const GTASKTASKPIECE* p1 = (const GTASKTASKPIECE*)b;
	return p0->nOrder -  p1->nOrder;
}



////////////////////////////////////////////////////////////////
void Initialize()
{

	AssertWarn(g_pDlgTxtTable,"请先创建Dialog Text Table");
	U32 n;


	//Tables  tables;
	///////////////////////////////////////////
	//数据排序
	//任务片段先后排序
   dQsort(DB_TABLE(TaskTaskPiece), DB_RECORDNUM(TaskTaskPiece), sizeof(GTASKTASKPIECE),
			TaskTaskPieceOrderCmp);



	///////////////////////////////////////////
	//任务数据初始化
 	for(n=0; n < DB_RECORDNUM(TaskBase);n++)
	{	
		DB_RECDAT(TaskBase,n).sName		= StringTable->insert(DB_RECDAT(TaskBase,n).sName);
		DB_RECDAT(TaskBase,n).sDesc		= StringTable->insert(DB_RECDAT(TaskBase,n).sDesc);
		if(DB_RECORD(TaskBase,n).sToNpcName)
			DB_RECORD(TaskBase,n).sToNpcName	= StringTable->insert(DB_RECORD(TaskBase,n).sToNpcName);
		if(DB_RECORD(TaskBase,n).sFromNpcName)
			DB_RECORD(TaskBase,n).sFromNpcName	= StringTable->insert(DB_RECORD(TaskBase,n).sFromNpcName);
	}

 //	for(n=0; n < DB_RECORDNUM(TaskPiece);n++)
	//{	
	//	DB_RECDAT(TaskPiece,n).sName	= StringTable->insert(DB_RECDAT(TaskPiece,n).sName);
	//	DB_RECDAT(TaskPiece,n).sDesc	= StringTable->insert(DB_RECDAT(TaskPiece,n).sDesc);
	//	if(DB_RECORD(TaskPiece,n).sToNpcName)
	//		DB_RECORD(TaskPiece,n).sToNpcName	= StringTable->insert(DB_RECORD(TaskPiece,n).sToNpcName);
	//}


	///////////////////////////////////////////
	//Dialog对话数据初始化,使用g_pDlgTxtTable 文本管理
 	for(n=0; n < DB_RECORDNUM(Dialog);n++)
	{	
		DB_RECDAT(Dialog,n).sName	= g_pDlgTxtTable->insert(DB_RECDAT(Dialog,n).sName);
		DB_RECDAT(Dialog,n).sDesc	= g_pDlgTxtTable->insert(DB_RECDAT(Dialog,n).sDesc);
	}

 	for(n=0; n < DB_RECORDNUM(DlgPiece);n++)
	{	
		DB_RECDAT(DlgPiece,n).sContent	= g_pDlgTxtTable->insert(DB_RECDAT(DlgPiece,n).sContent);
	}
 	for(n=0; n < DB_RECORDNUM(DlgAnswer);n++)
	{	
		DB_RECDAT(DlgAnswer,n).sContent	= g_pDlgTxtTable->insert(DB_RECDAT(DlgAnswer,n).sContent);
	}


	///////////////////////////////////////////////////
	//Scene场景数据初始化
 	for(n=0; n < DB_RECORDNUM(Scene);n++)
	{	
		DB_RECDAT(Scene,n).pIDName	= StringTable->insert(DB_RECDAT(Scene,n).pIDName);
		DB_RECDAT(Scene,n).pName	= StringTable->insert(DB_RECDAT(Scene,n).pName);
		DB_RECDAT(Scene,n).pDesc	= StringTable->insert(DB_RECDAT(Scene,n).pDesc);
	}
	////////////////////////////////
	//Scene关系表
 	for(n=0; n < DB_RECORDNUM(SceneNpc);n++)
	{	
		DB_RECORD(SceneNpc,n).sNpcName		= StringTable->insert(DB_RECORD(SceneNpc,n).sNpcName);
		DB_RECORD(SceneNpc,n).sSceneIDName	= StringTable->insert(DB_RECORD(SceneNpc,n).sSceneIDName);
	}
 	for(n=0; n < DB_RECORDNUM(ScenePlayer);n++)
	{	
		DB_RECORD(ScenePlayer,n).sPlayerName	= StringTable->insert(DB_RECORD(ScenePlayer,n).sPlayerName);
		DB_RECORD(ScenePlayer,n).sSceneIDName	= StringTable->insert(DB_RECORD(ScenePlayer,n).sSceneIDName);
	}



	//////////////////////////////////////////////////
	//Npc数据
 	for(n=0; n < DB_RECORDNUM(Npc);n++)
	{	
		DB_RECCHAR(Npc,n).pCharName	= StringTable->insert(DB_RECCHAR(Npc,n).pCharName);
	}
	////////////////////////////////
	//Npc关系表
 	for(n=0; n < DB_RECORDNUM(NpcDialog);n++)
	{	
		DB_RECORD(NpcDialog,n).sNpcName		= StringTable->insert(DB_RECORD(NpcDialog,n).sNpcName);
	}
 	for(n=0; n < DB_RECORDNUM(NpcTask);n++)
	{	
		DB_RECORD(NpcTask,n).sNpcName		= StringTable->insert(DB_RECORD(NpcTask,n).sNpcName);
	}



	//////////////////////////////////////////////////
	//Player数据
 	for(n=0; n < DB_RECORDNUM(Player);n++)
	{	
		DB_RECDAT(Player,n).pMapIDName	= StringTable->insert(DB_RECDAT(Player,n).pMapIDName);
		DB_RECCHAR(Player,n).pCharName	= StringTable->insert(DB_RECCHAR(Player,n).pCharName);
	}

 	for(n=0; n < DB_RECORDNUM(PlayerTaskState);n++)
	{	
		DB_RECORD(PlayerTaskState,n).sPlayerName	= StringTable->insert(DB_RECORD(PlayerTaskState,n).sPlayerName);
	}
 	for(n=0; n < DB_RECORDNUM(TaskState);n++)
	{	
		DB_RECORD(TaskState,n).sNpcName	= StringTable->insert(DB_RECORD(TaskState,n).sNpcName);
	}


	///////////////////////////////////
	//Goodsdefine
	for(n=0; n < DB_RECORDNUM(GoodsDefine);n++)
	{	
		DB_RECDAT(GoodsDefine,n).pGoodsName = StringTable->insert(DB_RECDAT(GoodsDefine,n).pGoodsName);
		DB_RECDAT(GoodsDefine,n).sUnit		= StringTable->insert(DB_RECDAT(GoodsDefine,n).sUnit);
		DB_RECDAT(GoodsDefine,n).pFileTitle = StringTable->insert(DB_RECDAT(GoodsDefine,n).pFileTitle);
		DB_RECDAT(GoodsDefine,n).pIconLabel	= StringTable->insert(DB_RECDAT(GoodsDefine,n).pIconLabel);

		if(DB_RECDAT(GoodsDefine,n).pDesc[0])
			DB_RECDAT(GoodsDefine,n).pDesc = StringTable->insert(DB_RECDAT(GoodsDefine,n).pDesc);
		else
			DB_RECDAT(GoodsDefine,n).pDesc = DB_RECDAT(GoodsDefine,n).pGoodsName;
	}

	for(n=0; n < DB_RECORDNUM(Goods);n++)
	{	
		if(DB_RECORD(Goods,n).sToNpc)
			DB_RECORD(Goods,n).sToNpc		= StringTable->insert(DB_RECORD(Goods,n).sToNpc);
		else
			DB_RECORD(Goods,n).sToNpc		= StringTable->getBlank();

		if(DB_RECORD(Goods,n).sFromNpc)
			DB_RECORD(Goods,n).sFromNpc	= StringTable->insert(DB_RECORD(Goods,n).sFromNpc);
		else
			DB_RECORD(Goods,n).sFromNpc		= StringTable->getBlank();
	}

	///////////////////////////////////
	//通行证
	for(n=0; n < DB_RECORDNUM(Passport);n++)
	{	
		DB_RECORD(Passport,n).pAccount = StringTable->insert(DB_RECORD(Passport,n).pAccount);
		DB_RECORD(Passport,n).pPassword = StringTable->insert(DB_RECORD(Passport,n).pPassword);
		for(U32 m=0; m<RPG_PC_MAX; m++)
		{	
			if(DB_RECORD(Passport,n).arPCs[m])
				DB_RECORD(Passport,n).arPCs[m] = StringTable->insert(DB_RECORD(Passport,n).arPCs[m]);
		}
	}
}

////////////////////////////////////////////////////////////////
void Destroy()
{
}

};//namespace DB









///////////////////////////////////////////////
//bool RPGDatabase::IntegratePlayer(DB::GPLAYER*	pRecord, GPlayer* pGObject, IntegratePlayerOprs opr)
DB_IMPLEMENT_INTEGRATE(GPLAYER, Player)
{
	AssertWarn(pRecord,"指定记录不可为空");
	U32					n;
	U32					dwID;
	IntegratePlayerOprs opr;

	if(m_stateStack.size())
		opr = (IntegratePlayerOprs)m_stateStack.last();
	else 
		opr = IPO_ALL;


	if(opr & IPO_PCLIST)
	{
		pGObject->m_dataCharacter	= pRecord->dataChar;
		pGObject->m_dataPlayer		= pRecord->data;
		//处理人物装备
		INTEGER_PLAYER_SLOTS(Equipments, DB::GEQUIPMENTS ,DB::FO_EQUIPS_ID, PCS_EQUIPMENTS, EQUIP_SLOTNUM);
	}

	//处理非人物列表时
	if(opr & IPO_OTHER)
	{
		//处理背包
		INTEGER_PLAYER_SLOTS(BagGoods, DB::GBAGGOODS, DB::FO_BAGGOODS_ID, PCS_BAGGOODS, BAG_SLOTNUM);
		//处理人物动作
		INTEGER_PLAYER_SLOTS(Actions, DB::GACTIONS, DB::FO_ACTIONS_ID, PCS_ACTIONS, ACTION_AMOUNT);
		//处理人物动作
		INTEGER_PLAYER_SLOTS(KeyCells, DB::GKEYCELLS, DB::FO_KEYCELLS_ID, PCS_KEYCELLS, KEY_CELL_AMOUNT);

		//处理技能
		//INTEGER_PLAYER_SLOTS(Skills, DB::GSKILLS, DB::FO_SKILLS_ID, PCS_SKILLS, SKILL_SLOTNUM);

		///////////////////////////////////
		//处理Npc关联任务状态
		PROCESS_ASSOCIATE_TABLE_STE_ID(Player, TaskState,  pRecord->dataChar.pCharName, pGObject);

	}
	return true;
}





//bool  RPGDatabase::IntegrateNpc(DB::GNPC* pRecord, GNpc* pGObject)
DB_IMPLEMENT_INTEGRATE( GNPC, Npc )
{
	AssertWarn(pRecord,"指定记录不可为空");
	U32					n;

	pGObject->m_dataCharacter	= pRecord->dataChar;

⌨️ 快捷键说明

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