📄 rpgdatabasetableprocess.cc
字号:
//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 + -