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