897 lines
23 KiB
C++
897 lines
23 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
|
|||
|
|
#include "AchieveProvider.h"
|
|||
|
|
#include "AchieveData.h"
|
|||
|
|
#include "../base/Container.hpp"
|
|||
|
|
using namespace wylib::stream;
|
|||
|
|
|
|||
|
|
CAchieveProvider::CAchieveProvider() : m_DataAllocator(_T("AchieveDataAlloc")), m_eventAllocator(_T("AchieveEventAlloc"))
|
|||
|
|
{
|
|||
|
|
CVector<int> temp;
|
|||
|
|
for(INT_PTR i=0;i< eMaxAtomEventID;i++)
|
|||
|
|
{
|
|||
|
|
m_atomEventVec.add(temp);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CAchieveProvider::~CAchieveProvider()
|
|||
|
|
{
|
|||
|
|
m_achieveData.empty();
|
|||
|
|
for (int i = 0; i < m_atomEventVec.count(); i++)
|
|||
|
|
{
|
|||
|
|
m_atomEventVec[i].empty();
|
|||
|
|
}
|
|||
|
|
m_achieveEvents.empty();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CAchieveProvider::showError(LPCTSTR sError)
|
|||
|
|
{
|
|||
|
|
m_sLastErrDesc = sError;
|
|||
|
|
RefString s = _T("[CAchieveProvider Config Error]");
|
|||
|
|
s += sError;
|
|||
|
|
throw s;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CAchieveProvider::LoadBadgeConfig(LPCSTR 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 Badge config"));
|
|||
|
|
//读取标准物品配置数据
|
|||
|
|
Result = ReadBabgeConfig();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (RefString &s)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("load %s config error: %s"),sFilePath, s.rawStr());
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on load Badge config"));
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
|
|||
|
|
return Result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CAchieveProvider::ReadBabgeConfig()
|
|||
|
|
{
|
|||
|
|
if ( !openGlobalTable("BadgeConfig") )
|
|||
|
|
return false;
|
|||
|
|
const INT_PTR nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
|
|||
|
|
if ( nCount <= 0 )
|
|||
|
|
{
|
|||
|
|
showError(_T("no data on title config"));
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ( nCount > 0 )
|
|||
|
|
{
|
|||
|
|
//循环读取
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
INT_PTR nIdx = 0;
|
|||
|
|
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
ACHIEVEBADGE achieveBadge;
|
|||
|
|
achieveBadge.nId = getFieldInt("id");
|
|||
|
|
achieveBadge.wItemId = getFieldInt("itemId");
|
|||
|
|
/* achieveBadge.wCount = getFieldInt("itemCount");
|
|||
|
|
achieveBadge.btQuality = getFieldInt("itemQuality");
|
|||
|
|
achieveBadge.btStrong = getFieldInt("itemStrong");
|
|||
|
|
achieveBadge.btBindFlag = getFieldInt("itemBindFlag");
|
|||
|
|
achieveBadge.nLeftTime = getFieldInt("itemLeftTime");*/
|
|||
|
|
achieveBadge.nAchievePoint = getFieldInt("achievePoint");
|
|||
|
|
m_BadgeData.add(achieveBadge);
|
|||
|
|
nIdx++;
|
|||
|
|
}
|
|||
|
|
while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
closeTable();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* Comments:装载全部怪物的数据
|
|||
|
|
* @Return bool: 失败返回false
|
|||
|
|
*/
|
|||
|
|
bool CAchieveProvider::LoadAchieves(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 ai config"));
|
|||
|
|
//读取标准物品配置数据
|
|||
|
|
Result = ReadAllAchieve();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (RefString &s)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("load %s config error: %s"),sFilePath, s.rawStr());
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on load LoadAchieves config"));
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
|
|||
|
|
return Result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool CAchieveProvider::ReadAllTitles()
|
|||
|
|
{
|
|||
|
|
if ( !openGlobalTable("Titles") )
|
|||
|
|
return false;
|
|||
|
|
|
|||
|
|
|
|||
|
|
CBaseList<TITLECONFIG> userDataList;
|
|||
|
|
|
|||
|
|
const INT_PTR nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
|
|||
|
|
if ( nCount <= 0 )
|
|||
|
|
{
|
|||
|
|
showError(_T("no data on title config"));
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
userDataList.reserve(nCount);
|
|||
|
|
TITLECONFIG *pData= userDataList;
|
|||
|
|
ZeroMemory(pData, sizeof(TITLECONFIG) * nCount);
|
|||
|
|
|
|||
|
|
|
|||
|
|
//循环读取
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
INT_PTR nIdx = 0;
|
|||
|
|
CDataAllocator dataAllocator(_T("TitleDataTmpAlloc"));
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
TITLECONFIG * pOneData= &userDataList[nIdx];
|
|||
|
|
ReadOneTitle(dataAllocator,pOneData);
|
|||
|
|
nIdx++;
|
|||
|
|
}
|
|||
|
|
while (enumTableNext());
|
|||
|
|
|
|||
|
|
//读取物品配置完成,将临时列表中的物品数据全部拷贝到自身中
|
|||
|
|
m_titles.reserve(nCount);
|
|||
|
|
m_titles.trunc(0);
|
|||
|
|
m_titles.addArray(pData, nCount);
|
|||
|
|
//调用自身的物品属性申请器的析构函数,以便释放之前的物品属性的内存块
|
|||
|
|
m_titleAllocator.~CObjectAllocator();
|
|||
|
|
//将临时的物品属性申请器的内存数据拷贝到自身申请器中
|
|||
|
|
m_titleAllocator = dataAllocator;
|
|||
|
|
//情况临时物品属性申请器的内存数据,防止新读取的物品属性数据被销毁
|
|||
|
|
ZeroMemory(&dataAllocator, sizeof(dataAllocator));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
closeTable();
|
|||
|
|
//OutputMsg(rmTip,_T("Load Finished"));
|
|||
|
|
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CAchieveProvider::ReadOneTitle(CDataAllocator &dataAllocator,TITLECONFIG *pTitle)
|
|||
|
|
{
|
|||
|
|
getFieldStringBuffer("name",pTitle->name,sizeof(pTitle->name) );
|
|||
|
|
pTitle->nGroupId = getFieldInt("groupId");
|
|||
|
|
pTitle->nDurTime = getFieldInt("time");
|
|||
|
|
bool bDef = false;
|
|||
|
|
pTitle->isDelete = getFieldBoolean("isDelete",&bDef); //该称号是否删除了
|
|||
|
|
bDef = false;
|
|||
|
|
pTitle->isFamous = getFieldBoolean("isFamous",&bDef); //该称号是否是名人称号
|
|||
|
|
int nDeufalt = 0;
|
|||
|
|
pTitle->nHeadTitleId = getFieldInt("headTitleId",&nDeufalt);
|
|||
|
|
|
|||
|
|
if ( feildTableExists("buff") && openFieldTable("buff") )
|
|||
|
|
{
|
|||
|
|
const INT_PTR nCount =(INT_PTR) lua_objlen(m_pLua, -1) ;
|
|||
|
|
if ( nCount <= 0 )
|
|||
|
|
{
|
|||
|
|
pTitle->buffs.count =0; //没有技能
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
pTitle->buffs.count =nCount;
|
|||
|
|
pTitle->buffs.pData =(PTITLEBUFF)dataAllocator.allocObjects(nCount * sizeof(TITLEBUFF));
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
INT_PTR nIdx = 0;
|
|||
|
|
|
|||
|
|
PTITLEBUFF pBaseLevel =(PTITLEBUFF )pTitle->buffs.pData;
|
|||
|
|
PTITLEBUFF pOneCondition =NULL;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
pOneCondition= pBaseLevel + nIdx;
|
|||
|
|
pOneCondition->bType = (BYTE) getFieldInt("type");
|
|||
|
|
pOneCondition->bGroup = (BYTE) getFieldInt("group");
|
|||
|
|
pOneCondition->value = (float) getFieldNumber("value");
|
|||
|
|
nIdx++;
|
|||
|
|
}while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
bool CAchieveProvider::LoadTitles(LPCSTR 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 ai config"));
|
|||
|
|
//读取标准物品配置数据
|
|||
|
|
Result = ReadAllTitles();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (RefString &s)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("load %s config error: %s"),sFilePath, s.rawStr());
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on load LoadTitles config"));
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
|
|||
|
|
return Result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CAchieveProvider::LoadTopTitles(LPCSTR 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 ai config"));
|
|||
|
|
//读取标准物品配置数据
|
|||
|
|
Result = ReadAllTopTitle();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (RefString &s)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("load %s config error: %s"),sFilePath, s.rawStr());
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on load HeadTitle config "));
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
|
|||
|
|
return Result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CAchieveProvider::ReadAllTopTitle()
|
|||
|
|
{
|
|||
|
|
if ( !openGlobalTable("HeadTitle") )
|
|||
|
|
return false;
|
|||
|
|
CBaseList<TOPTITLECONFIG> userDataList;
|
|||
|
|
|
|||
|
|
const INT_PTR nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
if ( nCount <= 0 )
|
|||
|
|
{
|
|||
|
|
showError(_T("no data on HeadTitle config"));
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
userDataList.reserve(nCount);
|
|||
|
|
TOPTITLECONFIG *pData= userDataList;
|
|||
|
|
ZeroMemory(pData, sizeof(TOPTITLECONFIG) * nCount);
|
|||
|
|
|
|||
|
|
//循环读取
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
INT_PTR nIdx = 0;
|
|||
|
|
CDataAllocator dataAllocator(_T("TopTitleDataTmpAlloc"));
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
TOPTITLECONFIG * pOneData= &userDataList[nIdx];
|
|||
|
|
ReadOneTopTitle(dataAllocator,pOneData);
|
|||
|
|
nIdx++;
|
|||
|
|
}
|
|||
|
|
while (enumTableNext());
|
|||
|
|
|
|||
|
|
//读取头衔配置完成,将临时列表中的头衔数据全部拷贝到自身中
|
|||
|
|
m_topTitles.reserve(nCount);
|
|||
|
|
m_topTitles.trunc(0);
|
|||
|
|
m_topTitles.addArray(pData, nCount);
|
|||
|
|
//调用自身的申请器的析构函数,以便释放之前的内存块
|
|||
|
|
m_topTitleAllocator.~CObjectAllocator();
|
|||
|
|
//将临时的申请器的内存数据拷贝到自身申请器中
|
|||
|
|
m_topTitleAllocator = dataAllocator;
|
|||
|
|
//清空临时申请器的内存数据,防止新读取的数据被销毁
|
|||
|
|
ZeroMemory(&dataAllocator, sizeof(dataAllocator));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
closeTable();
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CAchieveProvider::ReadOneTopTitle(CDataAllocator &dataAllocator,TOPTITLECONFIG *pTopTitle)
|
|||
|
|
{
|
|||
|
|
pTopTitle->nRankId = getFieldInt("rankId");
|
|||
|
|
pTopTitle->nMinRank = getFieldInt("minRank");
|
|||
|
|
pTopTitle->nMaxRank = getFieldInt("maxRank");
|
|||
|
|
pTopTitle->nTitleId = getFieldInt("titleId");
|
|||
|
|
//读取静态属性
|
|||
|
|
if ( feildTableExists("staitcAttrs") && openFieldTable("staitcAttrs") )
|
|||
|
|
{
|
|||
|
|
//使用物品类似读取方式
|
|||
|
|
if (!ReadAttributeTable(dataAllocator, pTopTitle->staticAttrs))
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("ReadOneTopTitle Attr Error!"));
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CAchieveProvider::ReadAttributeTable(CDataAllocator &dataAllocator, CStdItem::AttributeGroup &AttrGroup)
|
|||
|
|
{
|
|||
|
|
PGAMEATTR pAttr;
|
|||
|
|
AttrGroup.nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
pAttr = AttrGroup.pAttrs = (PGAMEATTR)dataAllocator.allocObjects(sizeof(*AttrGroup.pAttrs) * AttrGroup.nCount);
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
pAttr->type = getFieldInt("type");
|
|||
|
|
//判断物品属性类型是否有效
|
|||
|
|
if ( pAttr->type < aUndefined || pAttr->type >= GameAttributeCount )
|
|||
|
|
{
|
|||
|
|
showErrorFormat(_T("attribute type config error %d"),pAttr->type);
|
|||
|
|
}
|
|||
|
|
switch(AttrDataTypes[pAttr->type])
|
|||
|
|
{
|
|||
|
|
case adSmall:
|
|||
|
|
case adShort:
|
|||
|
|
case adInt:
|
|||
|
|
pAttr->value.nValue = getFieldInt("value");
|
|||
|
|
break;
|
|||
|
|
case adUSmall:
|
|||
|
|
case adUShort:
|
|||
|
|
case adUInt:
|
|||
|
|
pAttr->value.uValue = (UINT)getFieldInt64("value");
|
|||
|
|
break;
|
|||
|
|
case adFloat:
|
|||
|
|
pAttr->value.fValue = (float)getFieldNumber("value");
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
pAttr++;
|
|||
|
|
}
|
|||
|
|
while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
CAttrCalc& CAchieveProvider::CalcHeadTitleAttributes(INT_PTR nTitleId, CAttrCalc &calc)
|
|||
|
|
{
|
|||
|
|
PTOPTITLECONFIG pConfig = GetTopTitle(nTitleId);
|
|||
|
|
|
|||
|
|
if (pConfig != NULL)
|
|||
|
|
{
|
|||
|
|
//写入静态属性
|
|||
|
|
if ( pConfig->staticAttrs.nCount > 0 )
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
for (INT_PTR i=pConfig->staticAttrs.nCount-1; i>-1; --i)
|
|||
|
|
{
|
|||
|
|
calc << pConfig->staticAttrs.pAttrs[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return calc;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CAchieveProvider::ReadAllAchieve()
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if ( !openGlobalTable("Achieves") )
|
|||
|
|
return false;
|
|||
|
|
|
|||
|
|
|
|||
|
|
CBaseList<ACHIEVEDATA> userDataList;
|
|||
|
|
|
|||
|
|
const INT_PTR nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
|
|||
|
|
if ( nCount <= 0 )
|
|||
|
|
{
|
|||
|
|
showError(_T("no data on achieve config"));
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
userDataList.reserve(nCount);
|
|||
|
|
ACHIEVEDATA *pData= userDataList;
|
|||
|
|
ZeroMemory(pData, sizeof(ACHIEVEDATA) * nCount);
|
|||
|
|
|
|||
|
|
|
|||
|
|
//循环读取
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
INT_PTR nIdx = 0;
|
|||
|
|
CDataAllocator dataAllocator(_T("AchieveDataTmpAlloc"));
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
ACHIEVEDATA * pOneData= &userDataList[nIdx];
|
|||
|
|
|
|||
|
|
//读取
|
|||
|
|
if(ReadOneAchieve( dataAllocator,pOneData,nIdx) ==false)
|
|||
|
|
{
|
|||
|
|
showErrorFormat(_T("achieve config error, id=%d "),nIdx );
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
nIdx++;
|
|||
|
|
}
|
|||
|
|
while (enumTableNext());
|
|||
|
|
|
|||
|
|
//读取物品配置完成,将临时列表中的物品数据全部拷贝到自身中
|
|||
|
|
m_achieveData.reserve(nCount);
|
|||
|
|
m_achieveData.trunc(0);
|
|||
|
|
m_achieveData.addArray(pData, nCount);
|
|||
|
|
//调用自身的物品属性申请器的析构函数,以便释放之前的物品属性的内存块
|
|||
|
|
m_DataAllocator.~CObjectAllocator();
|
|||
|
|
//将临时的物品属性申请器的内存数据拷贝到自身申请器中
|
|||
|
|
m_DataAllocator = dataAllocator;
|
|||
|
|
//情况临时物品属性申请器的内存数据,防止新读取的物品属性数据被销毁
|
|||
|
|
ZeroMemory(&dataAllocator, sizeof(dataAllocator));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
closeTable();
|
|||
|
|
OutputMsg(rmTip,_T("Load achieve Finished"));
|
|||
|
|
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//装载成就的分组的数据
|
|||
|
|
bool CAchieveProvider::LoadAchieveGroup(LPCSTR 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 ai config"));
|
|||
|
|
|
|||
|
|
if ( !openGlobalTable("AchieveGroups") )
|
|||
|
|
return false;
|
|||
|
|
m_achieveGroup.clear();
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
int nIdx = 0;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
ACHIEVEGROUP data;
|
|||
|
|
int id = getFieldInt("id");
|
|||
|
|
if(id != nIdx)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError,_T("%d Data id error,id=%d"),sFilePath,nIdx);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
int nDefault=0;
|
|||
|
|
|
|||
|
|
data.nCamp = getFieldInt("camp",&nDefault);
|
|||
|
|
data.nLevel = getFieldInt("level",&nDefault);
|
|||
|
|
|
|||
|
|
data.nVocation = getFieldInt("vocation",&nDefault);
|
|||
|
|
nDefault=-1;
|
|||
|
|
data.nSex = getFieldInt("sex",&nDefault);
|
|||
|
|
|
|||
|
|
data.titleId = getFieldInt("titleID",0);
|
|||
|
|
|
|||
|
|
if (!openFieldTable("titleNeedAchieves"))
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError,_T("装载战绩配置失败,找不到militaryRank[].range"));
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (enumTableFirst()) //
|
|||
|
|
{
|
|||
|
|
INT_PTR nIdx = 0;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
if( nIdx < GROUP_ARCHIEVE_MAX )
|
|||
|
|
{
|
|||
|
|
data.mTitleNeedAchieves[nIdx] = (int)getFieldInt(NULL);
|
|||
|
|
nIdx++;
|
|||
|
|
}
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
|
|||
|
|
m_achieveGroup.add(data);
|
|||
|
|
nIdx ++;
|
|||
|
|
}while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (RefString &s)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("load %s config error: %s"),sFilePath, s.rawStr());
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on load LoadAchieveGroup config"));
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* Comments: 读取一个怪物的数据
|
|||
|
|
* Param CDataAllocator & dataAllocator: 内存分配器
|
|||
|
|
* Param AICONFIG * oneAi: ai指针
|
|||
|
|
* @Return bool:
|
|||
|
|
*/
|
|||
|
|
bool CAchieveProvider::ReadOneAchieve(CDataAllocator &dataAllocator,ACHIEVEDATA *oneAchieve,INT_PTR nIndex)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
getFieldStringBuffer("name",oneAchieve->name,sizeof(oneAchieve->name) );
|
|||
|
|
int nAchieveID = getFieldInt("id");
|
|||
|
|
if((int)nIndex != nAchieveID) //
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmTip,_T("成就ID配置错误,index=%d"),nIndex);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
oneAchieve->nCondCount = getFieldInt("needCondCount");
|
|||
|
|
bool bDefault =false;
|
|||
|
|
oneAchieve->bNeedBroadcast = getFieldBoolean("broadcast",&bDefault);
|
|||
|
|
|
|||
|
|
int nDef = 0;
|
|||
|
|
oneAchieve->groupId = getFieldInt("groupId",&nDef);
|
|||
|
|
oneAchieve->nBadgeId = getFieldInt("badgeId",&nDef);
|
|||
|
|
|
|||
|
|
//该成就是否已经删除了
|
|||
|
|
bDefault =false;
|
|||
|
|
oneAchieve->bIsDelete = getFieldBoolean("isDelete",&bDefault);
|
|||
|
|
|
|||
|
|
oneAchieve->isDefaultActive = getFieldBoolean("isDefaultActive",&bDefault); //该称号是否删除了
|
|||
|
|
|
|||
|
|
oneAchieve->isDayRefresh = getFieldBoolean("isDayRefresh",&bDefault);
|
|||
|
|
oneAchieve->isMonthRefresh = getFieldBoolean("isMonthRefresh", &bDefault);
|
|||
|
|
|
|||
|
|
oneAchieve->showPos = (BYTE)getFieldInt("showPos",&nDef);
|
|||
|
|
|
|||
|
|
if ( feildTableExists("conds") && openFieldTable("conds") )
|
|||
|
|
{
|
|||
|
|
const INT_PTR nCount =(INT_PTR) lua_objlen(m_pLua, -1) ;
|
|||
|
|
if ( nCount <= 0 )
|
|||
|
|
{
|
|||
|
|
oneAchieve->conditions.count =0; //没有技能
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
oneAchieve->conditions.count =nCount; //技能的动作
|
|||
|
|
oneAchieve->conditions.pData =(PACHIEVECONDITION)dataAllocator.allocObjects(nCount * sizeof(ACHIEVECONDITION));
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
INT_PTR nIdx = 0;
|
|||
|
|
|
|||
|
|
PACHIEVECONDITION pBaseLevel =(PACHIEVECONDITION )oneAchieve->conditions.pData;
|
|||
|
|
PACHIEVECONDITION pOneCondition =NULL;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
pOneCondition= pBaseLevel + nIdx;
|
|||
|
|
pOneCondition->wEventID = (WORD) getFieldInt("eventId");
|
|||
|
|
pOneCondition->nCount = getFieldInt("count");
|
|||
|
|
|
|||
|
|
//pOneCondition->wDataPos =(WORD) getFieldInt("dataPos");
|
|||
|
|
//pOneCondition->bDataSize =(BYTE) getFieldInt("dataByteCount");
|
|||
|
|
if(pOneCondition->wEventID < m_achieveEvents.count())
|
|||
|
|
{
|
|||
|
|
if(m_achieveEvents[pOneCondition->wEventID].achieveIDList.pData == NULL)
|
|||
|
|
{
|
|||
|
|
m_achieveEvents[pOneCondition->wEventID].achieveIDList.pData = (int*)dataAllocator.allocObjects(
|
|||
|
|
MAX_ACHIEVE_EVENT_ACHIEVE_COUNT * sizeof(int)); //每个成就事件默认有30个成就关注
|
|||
|
|
m_achieveEvents[pOneCondition->wEventID].achieveIDList.count =0;
|
|||
|
|
}
|
|||
|
|
int nCount= (int)m_achieveEvents[pOneCondition->wEventID].achieveIDList.count ;
|
|||
|
|
if( nCount < MAX_ACHIEVE_EVENT_ACHIEVE_COUNT) //避免内存越界
|
|||
|
|
{
|
|||
|
|
*(m_achieveEvents[pOneCondition->wEventID].achieveIDList.pData + nCount) = nAchieveID; //将这个成就添加进去
|
|||
|
|
m_achieveEvents[pOneCondition->wEventID].achieveIDList.count ++;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError,_T("成就事件%d 已经有超过了%d个成就关注了"),pOneCondition->wEventID,MAX_ACHIEVE_EVENT_ACHIEVE_COUNT);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError,_T("成就ID=%d,事件id=%d不存在"),nIdx,pOneCondition->wEventID);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
nIdx++;
|
|||
|
|
}while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ( feildTableExists("awards") && openFieldTable("awards") )
|
|||
|
|
{
|
|||
|
|
const INT_PTR nCount =(INT_PTR) lua_objlen(m_pLua, -1) ;
|
|||
|
|
if ( nCount <= 0 )
|
|||
|
|
{
|
|||
|
|
oneAchieve->awards.count =0; //没有技能
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
oneAchieve->awards.count =nCount; //技能的动作
|
|||
|
|
oneAchieve->awards.pData =(PACHIEVEAWARD)dataAllocator.allocObjects(nCount * sizeof(ACHIEVEAWARD));
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
INT_PTR nIdx = 0;
|
|||
|
|
|
|||
|
|
PACHIEVEAWARD pBaseLevel =(PACHIEVEAWARD )oneAchieve->awards.pData;
|
|||
|
|
PACHIEVEAWARD pOneAward =NULL;
|
|||
|
|
int nDefault=0;
|
|||
|
|
int nCount=1;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
pOneAward= pBaseLevel + nIdx;
|
|||
|
|
pOneAward->bType = (BYTE) getFieldInt("type");
|
|||
|
|
pOneAward->wID = (WORD) getFieldInt("id");
|
|||
|
|
pOneAward->nCount = (unsigned int)getFieldInt("count",&nCount);
|
|||
|
|
pOneAward->bQuality =(BYTE) getFieldInt("quality",&nDefault);
|
|||
|
|
pOneAward->bBind =(BYTE) getFieldInt("bind",&nDefault);
|
|||
|
|
pOneAward->bStrong =(BYTE) getFieldInt("strong",&nDefault);
|
|||
|
|
|
|||
|
|
nDefault =-1; //所有的性别都能用
|
|||
|
|
pOneAward->nSex = getFieldInt("sex",&nDefault);
|
|||
|
|
|
|||
|
|
nDefault =0;
|
|||
|
|
pOneAward->nVocation = getFieldInt("job",&nDefault);
|
|||
|
|
nIdx++;
|
|||
|
|
}while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CAchieveProvider::LoadAchieveEvents(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 ai config"));
|
|||
|
|
//读取标准物品配置数据
|
|||
|
|
Result = ReadAllAchieveEvent();
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (RefString &s)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("load %s config error: %s"),sFilePath, s.rawStr());
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on load LoadAchieveEvents config"));
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
|
|||
|
|
return Result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//读取成就的事件
|
|||
|
|
bool CAchieveProvider::ReadAllAchieveEvent()
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if ( !openGlobalTable("AchieveEvents") )
|
|||
|
|
return false;
|
|||
|
|
|
|||
|
|
|
|||
|
|
CBaseList<ACHIEVEEVENT> userDataList;
|
|||
|
|
|
|||
|
|
const INT_PTR nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
|
|||
|
|
if ( nCount <= 0 )
|
|||
|
|
{
|
|||
|
|
showError(_T("no data on achieve event config"));
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
userDataList.reserve(nCount);
|
|||
|
|
ACHIEVEEVENT *pData= userDataList;
|
|||
|
|
ZeroMemory(pData, sizeof(ACHIEVEEVENT) * nCount);
|
|||
|
|
|
|||
|
|
|
|||
|
|
//循环读取
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
INT_PTR nIdx = 0;
|
|||
|
|
CDataAllocator dataAllocator(_T("AchieveEvtTmpAlloc"));
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
ACHIEVEEVENT * pOneData= &userDataList[nIdx];
|
|||
|
|
|
|||
|
|
//读取
|
|||
|
|
if(ReadOneEvent( dataAllocator,pOneData,nIdx) ==false)
|
|||
|
|
{
|
|||
|
|
showErrorFormat(_T("achieve event config error, id=%d "),nIdx );
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
nIdx++;
|
|||
|
|
}
|
|||
|
|
while (enumTableNext());
|
|||
|
|
|
|||
|
|
//读取物品配置完成,将临时列表中的物品数据全部拷贝到自身中
|
|||
|
|
m_achieveEvents.trunc(0);
|
|||
|
|
m_achieveEvents.reserve(nCount);
|
|||
|
|
m_achieveEvents.addArray(pData, nCount);
|
|||
|
|
//调用自身的物品属性申请器的析构函数,以便释放之前的物品属性的内存块
|
|||
|
|
m_eventAllocator.~CObjectAllocator();
|
|||
|
|
//将临时的物品属性申请器的内存数据拷贝到自身申请器中
|
|||
|
|
m_eventAllocator = dataAllocator;
|
|||
|
|
//情况临时物品属性申请器的内存数据,防止新读取的物品属性数据被销毁
|
|||
|
|
ZeroMemory(&dataAllocator, sizeof(dataAllocator));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
closeTable();
|
|||
|
|
OutputMsg(rmTip,_T("Load achieve event Finished"));
|
|||
|
|
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//读取一个事件
|
|||
|
|
bool CAchieveProvider::ReadOneEvent(CDataAllocator &dataAllocator,ACHIEVEEVENT *pEvent,INT_PTR nAchieveEventID)
|
|||
|
|
{
|
|||
|
|
pEvent->wAtomEventID = (WORD)getFieldInt("atomEventId");
|
|||
|
|
int nDef = 0;
|
|||
|
|
pEvent->bPlusParamId = (BYTE)getFieldInt("plusParamId",&nDef);
|
|||
|
|
|
|||
|
|
if(pEvent->wAtomEventID >= eMaxAtomEventID || pEvent->wAtomEventID == eAchieveEventIdNone)
|
|||
|
|
//if( pEvent->wAtomEventID == eAchieveEventIdNone)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmWaning,_T("成就的原子事件ID=%d超过了最大值%d"),pEvent->wAtomEventID,eMaxAtomEventID );
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
m_atomEventVec[pEvent->wAtomEventID].add((int)nAchieveEventID); //成就事件加入到这个列表
|
|||
|
|
}
|
|||
|
|
pEvent->bLogicOp = (BYTE)getFieldInt("logicop");
|
|||
|
|
if ( feildTableExists("conds") && openFieldTable("conds") )
|
|||
|
|
{
|
|||
|
|
const INT_PTR nCount =(INT_PTR) lua_objlen(m_pLua, -1) ;
|
|||
|
|
if ( nCount <= 0 )
|
|||
|
|
{
|
|||
|
|
pEvent->conds.count = 0; //没有技能
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
pEvent->conds.count = nCount; //技能的动作
|
|||
|
|
pEvent->conds.pData =(PACHIEVEEVENTCOND)dataAllocator.allocObjects(nCount * sizeof(ACHIEVEEVENTCOND));
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
INT_PTR nIdx = 0;
|
|||
|
|
|
|||
|
|
PACHIEVEEVENTCOND pBaseLevel =(PACHIEVEEVENTCOND )pEvent->conds.pData;
|
|||
|
|
PACHIEVEEVENTCOND pOneCondition =NULL;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
pOneCondition= pBaseLevel + nIdx;
|
|||
|
|
pOneCondition->bParamID = (BYTE) getFieldInt("paramID");
|
|||
|
|
pOneCondition->bParamType = (BYTE) getFieldInt("paramType");
|
|||
|
|
ReadEventCond(dataAllocator,pOneCondition);
|
|||
|
|
nIdx++;
|
|||
|
|
}while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//读取一个事件的条件
|
|||
|
|
bool CAchieveProvider::ReadEventCond(CDataAllocator &dataAllocator,ACHIEVEEVENTCOND * pCond)
|
|||
|
|
{
|
|||
|
|
if ( feildTableExists("params") && openFieldTable("params") )
|
|||
|
|
{
|
|||
|
|
const INT_PTR nCount =(INT_PTR) lua_objlen(m_pLua, -1) ;
|
|||
|
|
pCond->params.count= (int)nCount; //个数
|
|||
|
|
if (enumTableFirst())
|
|||
|
|
{
|
|||
|
|
pCond->params.pData = (int *)dataAllocator.allocObjects(nCount * sizeof(int));
|
|||
|
|
INT_PTR nIdx = 0;
|
|||
|
|
int* pBaseLevel =(int* )pCond->params.pData;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
pBaseLevel[nIdx] = (int) getFieldInt(NULL);
|
|||
|
|
nIdx++;
|
|||
|
|
}while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|