📄 rpgdatabase.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 + -