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

📄 rpgdatabase.cc

📁 五行MMORPG引擎系统V1.0
💻 CC
字号:
//RPGDatabase.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
{

////////////////////////////////////////////////////////////////////////////////
IMPLEMENT_CONOBJECT(RPGDatabase);



/////////////////////////////////////////////////////////////////
// class RPGDatabase 构造函数 /析构函数
RPGDatabase::RPGDatabase(DBProxy* pProxy)
:Parent(pProxy)
{
	//m_pClassName	= "RPGDatabase";
	m_stateStack.reserve(16);
	m_stateStack.clear();
	m_pCurNpc	= NULL;
	m_pCurTask	= NULL;
}
RPGDatabase::~RPGDatabase()
{
}

void RPGDatabase::initPersistFields()
{
	Parent::initPersistFields();
}


void RPGDatabase::Init()
{
	AssertWarn(g_pRPGDataMan,"需要先创建RPGDataMan实例");

	U32	n;
	RPG::GGOODSDEFINE*	pGoodsDefine;
	U32	dwID;

	//////////////////////////////
	//建立物品定义表
	for(n=0; n < DB_RECORDNUM(GoodsDefine);n++)
	{	
		dwID				= DB::Tables::ms_arGoodsDefines[n].data.dwID;
		pGoodsDefine	= g_pRPGDataMan->InsertGoodsDefine(dwID);
		*pGoodsDefine	= DB::Tables::ms_arGoodsDefines[n].data;	
	}//for

}


//void RPGDatabase::consoleInit()
//{
//}


//#ifdef RPGCMD_USE_THREAD
void RPGDatabase::run(S32 arg)
//#else
//void RPGDatabase::Process()
//#endif
{
#ifdef RPGCMD_USE_THREAD
	Thread::prioIDLE();
#else
	if(!m_bRunning)
		return;
#endif

	GCMDTASK*	pTask;
	//U32			dwTime;
	S32			n;

#ifdef RPGCMD_USE_THREAD
	for(;m_bRunning;)
#endif
	{
		//dwTime	= Platform::getRealMilliseconds();

		//if(dwTime - m_dwTimer > 1000)
		//{
		//	m_dwTimer = dwTime;
		//	Con::printf("%s %d",m_pClassName,m_dwTimer);
		//}
		//////////////////////////////////////////
		//派发指令任务到各DBAccess
		if(m_mutexInst.lock(CMDPRO_WAIT))
		{
			pTask = m_taskQueue.Shift();
			m_mutexInst.unlock();
		}
		else
			pTask = NULL;

		if(pTask)
		{
			//处理完毕,即把结果送到 DBProxy队列
			OnSendingTask(pTask);

			Con::printf("RPGDatabase CMD: %d",pTask->dwCmd);
			m_pDBProxy->ResultTask(pTask);


#ifdef RPGCMD_USE_THREAD
			if(m_mutexInst.lock(CMDPRO_WAIT))
			{
				if(m_taskQueue.IsEmpty())
					Thread::prioIDLE();
				m_mutexInst.unlock();
			}
#endif
		}//if(pTask)

#ifdef RPGCMD_USE_THREAD
		Platform::sleep(m_dwRunDelay);
#endif
	}//for

	//deleteObject();
}


S32 RPGDatabase::OnSendingTask(GCMDTASK* pTask)
{
	AssertWarn(pTask,"指令任务不能为NULL");

	S32 nError;
	switch(pTask->dwCmd)
	{
	case CMD_PP_PCLIST:
		nError = ProcessPCList(pTask->unParam1.str);
		break;

	case CMD_PC_LOAD:
		nError = ProcessPlayer(pTask->unParam1.str);
		break;

	default:
		nError = E_UNKNOW;
		break;
	}

	pTask->nError = nError;

	return (nError == E_OK)?TO_OK:TO_FAILED;
}

//void RPGDatabase::OnTaskFinished(GCMDTASK* pTask,TaskStates state)
//{
//}

//BOOL RPGDatabase::OnRespondeTask(GCMDTASK* pTask)
//{
//	return TRUE;
//}



S32 RPGDatabase::ProcessLogin(StringTableEntry pAccount,StringTableEntry pPassword)
{
	return E_OK;
}



S32 RPGDatabase::ProcessPCList(StringTableEntry pAccount)
{
	//由dataMan获取Passport,并填充 各可玩(简型)人物列表
	GPassport*		pPassport;
	//GPlayer*			pGPlayer;
	DB::GPASSPORT*	pRecord;
	//DB::GPLAYER*	pRecordPlayer;
	U32				n;
	U32				dwID;
	STE				sPlayerName;

	pRecord = DB::SearchField(DB::Tables::ms_arPassports,pAccount, DB::FO_PP_ACCOUNT, DB_RECORDNUM(Passport));
	if(pRecord == NULL)
		return E_PP_NOTEXIST;

	//g_pRPGDataMan->UnregPassport(pAccount);
	if(g_pRPGDataMan->GetPassport(pAccount))
		return E_OK;

	pPassport = g_pRPGDataMan->RegPassport(pAccount);
	
	m_stateStack.push_back(IPO_PCLIST);
	for(n=0; n < RPG_PC_MAX; n++)
	{
		sPlayerName		= pRecord->arPCs[n];
		(*pPassport)[n] = ProcessPlayerKey(sPlayerName);
	}//for
	m_stateStack.pop_back();
	return E_OK;
}


S32 RPGDatabase::ProcessPlayer(StringTableEntry pName)
{
	//由dataMan获取Passport,并填充 各可玩(简型)人物列表
	DB::GPLAYER*	pRecordPlayer;
	GPlayer*			pGPlayer;

	IntegratePlayerOprs	oprs;


	//. 获取主角数据
	pGPlayer			= g_pRPGDataMan->GetPlayer(pName);
	if(!pGPlayer)
	{
		m_stateStack.push_back(IPO_PCLIST);
		pGPlayer = ProcessPlayerKey(pName,FALSE);
		m_stateStack.pop_back();
		if(!pGPlayer)
			return E_PC_NOTEXIST;
	}

	//1. 先处理场景数据,包括NPC、任务等
	ProcessScene(pGPlayer->GetMapIDName());

	//2. 再处理主角数据
	m_stateStack.push_back(IPO_OTHER);
	pGPlayer = ProcessPlayerKey(pName,FALSE);
	m_stateStack.pop_back();

	//pRecordPlayer = DB::SearchField(DB_TABLE(Player), pName, DB::FO_PLAYER_NAME, DB_RECORDNUM(Player));
	//if(pRecordPlayer)
	//{
	//	pGPlayer			= g_pRPGDataMan->RegPlayer(pName);
	//	if(pGPlayer)
	//		IntegratePlayer(pRecordPlayer, pGPlayer);
	//}//if(pRecordPlayer)

	if(!pGPlayer)
		return E_PC_NOTEXIST;

	return E_OK;
}


//S32 RPGDatabase::ProcessNPC(StringTableEntry pName)
//{
//	//由dataMan获取Passport,并填充 各可玩(简型)人物列表
//	DB::GNPC*	pRecordNPC;
//	GNpc*			pGNpc;
//	
//	pRecordNPC = DB::SearchField(DB_TABLE(Npc), pName, DB::FO_NPC_NAME, DB_RECORDNUM(Npc));
//	if(pRecordNPC)
//	{	
//		pGNpc			= g_pRPGDataMan->GetNpc(pRecordNPC->dwID);//dataChar.pCharName);
//		//if(IntegrateNpc(pRecordNPC, pGNpc, FALSE))
//		//	return E_OK;
//	}
//	return E_NPC_NOTEXIST;
//}



S32 RPGDatabase::ProcessScene(StringTableEntry pName)
{
	//	1.注册场景
	//	2.关联场景中NPC
	//	3.关联场景中Player
	DB::GSCENE*		pRecordScene;
	DB::GNPC*		pRecordNpc;
	GScene*			pGScene;
	U32				n,dwID;
	GNpc*				pGNpc;
	

	pRecordScene = DB::SearchField(DB_TABLE(Scene), pName, DB::FO_SCENE_IDNAME, DB_RECORDNUM(Scene));
	//if(pRecordScene && !g_pRPGDataMan->GetScene(pRecordScene->data.pIDName))
	{	
		pGScene	= g_pRPGDataMan->RegScene(pRecordScene->data.pIDName);
		if(pGScene)
		{
			pGScene->m_dataScene = pRecordScene->data;
			//处理Scene关联Npc,宏化
			//PROCESS_ASSOCIATE_TABLE_SCENE(Scene,Npc,  NPC);
			PROCESS_ASSOCIATE_TABLE_SCENE(Npc/*,  NPC*/);
			//处理Scene关联Player,宏化
			//PROCESS_ASSOCIATE_TABLE_SCENE(Scene,Player, PLAYER );
			PROCESS_ASSOCIATE_TABLE_SCENE(Player/*, PLAYER*/ );

			//处理NPC对话
			for(n=0; n<pGScene->m_arNpcs.size(); n++)
				IntegrateNpcDat(pGScene->m_arNpcs[n]);
			return E_OK;
		}
	}
	return E_SCENE_NOTEXIST;
}


//S32 RPGDatabase::ProcessNPCDialog(StringTableEntry pName)
//{
//	//由dataMan获取Passport,并填充 各可玩(简型)人物列表
//	DB::GNPC*	pRecordNPC;
//	GNpc*			pGNpc;
//	
//	pRecordNPC = DB::SearchField(DB_TABLE(Npc), pName, DB::FO_NPC_NAME, DB_RECORDNUM(Npc));
//	if(pRecordNPC)
//	{	
//		pGNpc			= g_pRPGDataMan->GetNpc(pRecordNPC->dwID);//dataChar.pCharName);
//		//if(IntegrateNpc(pRecordNPC, pGNpc, FALSE))
//		//	return E_OK;
//	}
//	return E_NPC_NOTEXIST;
//}








};//namespace RPG

⌨️ 快捷键说明

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