289 lines
6.7 KiB
C++
289 lines
6.7 KiB
C++
#include "StdAfx.h"
|
|
#include "QuestProvider.h"
|
|
using namespace wylib::stream;
|
|
|
|
CQuestProvider::CQuestProvider() : m_DataAllocator(_T("QuestDataAlloc"))
|
|
{
|
|
m_vAllQuestConfig.clear();
|
|
m_vMainRootQuestConfig.clear();
|
|
}
|
|
CQuestProvider::~CQuestProvider()
|
|
{
|
|
|
|
}
|
|
|
|
bool CQuestProvider::LoadQuest(LPCTSTR sFilePath)
|
|
{
|
|
bool Result = false;
|
|
CMemoryStream ms;
|
|
CCustomLuaPreProcessor pp;
|
|
|
|
try
|
|
{
|
|
//从文件加载配置脚本
|
|
if ( ms.loadFromFile(sFilePath) <= 0 )
|
|
showErrorFormat(_T("unable to load from %s"), sFilePath);
|
|
//对配置脚本进行预处理
|
|
GetLogicServer()->GetVSPDefine().RegisteToPreprocessor(pp);
|
|
LPCTSTR sText = pp.parse((LPCTSTR)ms.getMemory(), sFilePath);
|
|
//设置脚本内容
|
|
if ( !setScript(sText) )
|
|
showError(_T("syntax error on quest config"));
|
|
//读取标准物品配置数据
|
|
|
|
Result = ReadQuestItem();
|
|
}
|
|
catch (RefString &s)
|
|
{
|
|
OutputMsg(rmError, _T("load quest config error: %s"), s.rawStr());
|
|
}
|
|
catch (...)
|
|
{
|
|
OutputMsg(rmError, _T("unexpected error on load quest config"));
|
|
}
|
|
//销毁脚本虚拟机
|
|
setScript(NULL);
|
|
return Result;
|
|
}
|
|
|
|
bool CQuestProvider::ReadQuestItem()
|
|
{
|
|
if ( !openGlobalTable("TaskDisplayConfig") )
|
|
return false;
|
|
//获取配置中的物品数量
|
|
// size_t nItemCount = lua_objlen(m_pLua, -1);
|
|
// //如果物品数量为0则输出未配置任何物品的错误
|
|
// if ( nItemCount <= 0 )
|
|
// {
|
|
// showError(_T("no quest data on Quest config"));
|
|
// return FALSE;
|
|
// }
|
|
//循环读取物品配置数据
|
|
int idx = 0;
|
|
if ( enumTableFirst() )
|
|
{
|
|
do
|
|
{
|
|
if ( enumTableFirst() )
|
|
{
|
|
do
|
|
{
|
|
QuestInfoCfg cfg;
|
|
readItemData(cfg);
|
|
m_vAllQuestConfig[cfg.nQid][cfg.nState] = cfg;
|
|
if(cfg.nisFirst == -1)
|
|
m_vMainRootQuestConfig[cfg.nQid] = GetQuestConfig(cfg.nQid, cfg.nState);
|
|
}
|
|
while (enumTableNext());
|
|
}
|
|
}
|
|
while (enumTableNext());
|
|
}
|
|
|
|
closeTable();
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CQuestProvider::readItemData(QuestInfoCfg& item )
|
|
{
|
|
bool boDefVal = false;
|
|
int nDef = 0;
|
|
item.nQid = getFieldInt("id");
|
|
item.nState = getFieldInt("state");
|
|
item.nLevelLimit = getFieldInt("levellimit");
|
|
item.nCircle = getFieldInt("zhuanshenglimit", &nDef);
|
|
item.nOpenDayLimit = getFieldInt("opendaylimit", &nDef);
|
|
item.nisFirst = getFieldInt("isfirst", &nDef);
|
|
item.nIscomplete = getFieldInt("iscomplete", &nDef);
|
|
item.nAnnular = getFieldInt("iscircle", &nDef);
|
|
item.nShowSchedule = getFieldInt("schedule", &nDef);
|
|
item.nFrontQid = getFieldInt("pretask", &nDef);
|
|
item.ntasktype = getFieldInt("tasktype", &nDef);
|
|
item.nAcceptState = getFieldInt("taskaccept", &nDef);
|
|
if ( feildTableExists("buttonchange") && openFieldTable("buttonchange") )
|
|
{
|
|
|
|
if(enumTableFirst())
|
|
{
|
|
do
|
|
{
|
|
ChangeQuestState state;
|
|
state.nQid = getFieldInt("taskid", &nDef);
|
|
state.nState = getFieldInt("state", &nDef);
|
|
item.button.push_back(state);
|
|
}while(enumTableNext());
|
|
}
|
|
closeTable();
|
|
}
|
|
|
|
|
|
if ( feildTableExists("autochange") && openFieldTable("autochange") )
|
|
{
|
|
if(enumTableFirst())
|
|
{
|
|
do
|
|
{
|
|
ChangeQuestState state;
|
|
state.nQid = getFieldInt("taskid", &nDef);
|
|
state.nState = getFieldInt("state", &nDef);
|
|
item.nAuto.push_back(state);
|
|
}while(enumTableNext());
|
|
}
|
|
closeTable();
|
|
}
|
|
|
|
if ( feildTableExists("changeState") && openFieldTable("changeState") )
|
|
{
|
|
item.mQuestInfo.nType = getFieldInt("type", &nDef);
|
|
item.mQuestInfo.nValue = getFieldInt("value", &nDef);
|
|
item.mQuestInfo.nSubType = getFieldInt("subtype", &nDef);
|
|
if(feildTableExists("mapid") && openFieldTable("mapid"))
|
|
{
|
|
if(enumTableFirst())
|
|
{
|
|
do
|
|
{
|
|
int nId = getFieldInt(NULL);
|
|
item.mQuestInfo.nMaps.push_back(nId);
|
|
}while(enumTableNext());
|
|
}
|
|
closeTable();
|
|
}
|
|
if(feildTableExists("group") && openFieldTable("group"))
|
|
{
|
|
if(enumTableFirst())
|
|
{
|
|
do
|
|
{
|
|
int nId = getFieldInt(NULL);
|
|
item.nGroups.push_back(nId);
|
|
}while(enumTableNext());
|
|
}
|
|
closeTable();
|
|
}
|
|
|
|
if(feildTableExists("id") && openFieldTable("id"))
|
|
{
|
|
if(enumTableFirst())
|
|
{
|
|
do
|
|
{
|
|
int nId = getFieldInt(NULL);
|
|
item.mQuestInfo.nIds.push_back(nId);
|
|
}while(enumTableNext());
|
|
}
|
|
closeTable();
|
|
}
|
|
closeTable();
|
|
}
|
|
|
|
if ( feildTableExists("flyshoescost") && openFieldTable("flyshoescost") )
|
|
{
|
|
if(enumTableFirst())
|
|
{
|
|
do
|
|
{
|
|
QuestCostFlyshoe flycost;
|
|
flycost.times = getFieldInt("times", &nDef);
|
|
if(feildTableExists("cost") && openFieldTable("cost") )
|
|
{
|
|
flycost.costs.nId = getFieldInt("id",&nDef);
|
|
flycost.costs.nCount = getFieldInt("count",&nDef);
|
|
flycost.costs.nType = getFieldInt("type",&nDef);
|
|
closeTable();
|
|
}
|
|
item.m_nCostFlyShoes.push_back(flycost);
|
|
}while(enumTableNext());
|
|
}
|
|
closeTable();
|
|
}
|
|
int nType = 1;
|
|
if ( feildTableExists("tasknameclick") && openFieldTable("tasknameclick") )
|
|
{
|
|
// TeleportInfo tel;
|
|
// tel.nMapid = getFeildInt("map", &nDef);
|
|
// tel.nId = getFeildInt("id", &nDef);
|
|
// tel.nNpcId = getFeildInt("npcid", &nDef);
|
|
// tel.nX = getFeildInt("x", &nDef);
|
|
// tel.nY = getFeildInt("y", &nDef);
|
|
// tel.nRange = getFeildInt("range", &nDef);
|
|
// item.m_nTelinfo[type].push_back(tel);
|
|
if(enumTableFirst())
|
|
{
|
|
do
|
|
{
|
|
ReadTelePortInfo(item, nType);
|
|
}while(enumTableNext());
|
|
}
|
|
closeTable();
|
|
}
|
|
|
|
|
|
nType++;
|
|
if ( feildTableExists("teleportpos") && openFieldTable("teleportpos") )
|
|
{
|
|
if(enumTableFirst())
|
|
{
|
|
do
|
|
{
|
|
ReadTelePortInfo(item, nType);
|
|
}while(enumTableNext());
|
|
}
|
|
closeTable();
|
|
}
|
|
|
|
nType++;
|
|
if ( feildTableExists("flyshoespos") && openFieldTable("flyshoespos") )
|
|
{
|
|
// TeleportInfo tel;
|
|
// tel.nMapid = getFeildInt("map", &nDef);
|
|
// tel.nId = getFeildInt("id", &nDef);
|
|
// tel.nX = getFeildInt("x", &nDef);
|
|
// tel.nY = getFeildInt("y", &nDef);
|
|
// tel.nRange = getFeildInt("range", &nDef);
|
|
// tel.nNpcId = getFeildInt("npcid", &nDef);
|
|
// item.m_nTelinfo[type].push_back(tel);
|
|
if(enumTableFirst())
|
|
{
|
|
do
|
|
{
|
|
ReadTelePortInfo(item, nType);
|
|
}while(enumTableNext());
|
|
}
|
|
closeTable();
|
|
}
|
|
if ( feildTableExists("award") && openFieldTable("award") )
|
|
{
|
|
if(enumTableFirst())
|
|
{
|
|
do
|
|
{
|
|
QuestAward award;
|
|
award.nCount = getFieldInt("count", &nDef);
|
|
award.nType = getFieldInt("type", &nDef);
|
|
award.nId = getFieldInt("id", &nDef);
|
|
item.awards.push_back(award);
|
|
}while(enumTableNext());
|
|
}
|
|
closeTable();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
void CQuestProvider::ReadTelePortInfo(QuestInfoCfg& item , int nType)
|
|
{
|
|
TeleportInfo tel;
|
|
int nDef = 0;
|
|
tel.nId = getFieldInt("id", &nDef);
|
|
tel.nMapid = getFieldInt("map", &nDef);
|
|
tel.nX = getFieldInt("x", &nDef);
|
|
tel.nY = getFieldInt("y", &nDef);
|
|
tel.nRange = getFieldInt("range", &nDef);
|
|
tel.nIsOpen = getFieldInt("isopen", &nDef);
|
|
tel.nAuto = getFieldInt("outboard", &nDef);
|
|
tel.nTelNpcId = getFieldInt("npcid", &nDef);
|
|
item.m_nTelinfo[nType].push_back(tel);
|
|
}
|
|
|