Files
mir_server/server/LogicServer/config/WingsAngelcfg.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

136 lines
2.9 KiB
C++

#include "StdAfx.h"
#include "WingsAngelcfg.h"
CWingsAngel::CWingsAngel()
:Inherited(),m_NewDataAllocator(_T("WingsAngelDataAlloc"))
{
}
CWingsAngel::~CWingsAngel()
{
}
bool CWingsAngel::LoadConfig(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 RideGame config"));
//读取标准物品配置数据
Result = readConfigs();
}
catch (RefString &s)
{
OutputMsg(rmError, _T("load RideGame config error: %s"), s.rawStr());
}
catch (...)
{
OutputMsg(rmError, _T("unexpected error on load RideGame config"));
}
//销毁脚本虚拟机
setScript(NULL);
return Result;
}
bool CWingsAngel::readConfigs()
{
if ( !openGlobalTable("WingCfg") )
return FALSE;
if (!openFieldTable("level"))
{
return FALSE;
}
size_t nLvCount = lua_objlen(m_pLua,-1);
CDataAllocator dataAllocator;
m_Config.nCount = (int)nLvCount;
m_Config.nWing = (tagLevelConfig*)dataAllocator.allocObjects(sizeof(tagLevelConfig)*nLvCount);
if ( enumTableFirst() )
{
int nIdx = 1;
do
{
tagLevelConfig &tempStar = m_Config.nWing[nIdx-1];
tempStar.nLuck = getFieldInt("LuckValue");
nIdx++;
}
while(enumTableNext());
}
closeTable();
if (!openFieldTable("basePropConfig"))
{
return FALSE;
}
size_t nCount = lua_objlen(m_pLua,-1);
if(nLvCount != nCount)
{
return FALSE;
}
if ( enumTableFirst() )
{
int nIdx = 1;
do
{
tagLevelConfig &tempStar = m_Config.nWing[nIdx-1];
size_t sCount = lua_objlen(m_pLua,-1);
tempStar.nLevel = nIdx;
tempStar.nCount = (int)sCount;
if ( enumTableFirst() )
{
INT_PTR sIndex = 1;
tempStar.PropList = (GAMEATTR*)dataAllocator.allocObjects(sizeof(GAMEATTR)*sCount);
do
{
GAMEATTR &tmpProp = tempStar.PropList[sIndex-1];
tmpProp.type = getFieldInt("type");
tmpProp.reserve[0] = getFieldInt("addmode");
switch(AttrDataTypes[tmpProp.type])
{
case adSmall:
case adShort:
case adInt:
tmpProp.value.nValue = getFieldInt("value");
break;
case adUSmall:
case adUShort:
case adUInt:
tmpProp.value.uValue = (UINT)getFieldInt64("value");
break;
case adFloat:
tmpProp.value.fValue = (float)getFieldNumber("value");
break;
}
sIndex++;
}
while(enumTableNext());
}
nIdx++;
}
while(enumTableNext());
}
closeTable();
//原来的内存块释放到
m_NewDataAllocator.~CObjectAllocator();
//将临时的内存块复制到正式的
m_NewDataAllocator = dataAllocator;
//清空临时的
ZeroMemory(&dataAllocator, sizeof(dataAllocator));
return true;
}