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

101 lines
2.8 KiB
C++

#include "StdAfx.h"
#include "RandAttrReader.h"
CRandAttrReader::~CRandAttrReader()
{
m_pLua = NULL;
}
void CRandAttrReader::showError(LPCTSTR sError)
{
m_sLastErrDesc = sError;
RefString s = _T("[RandAttrReader]");
s += sError;
throw s;
}
__forceinline GAMEATTRVALUE CRandAttrReader::readAttrValue(const tagGameAttributeType attrType, LPCSTR sName)
{
GAMEATTRVALUE result;
result.nValue =0;
if (attrType < 1 || attrType >= GameAttributeCount) return result;
switch(AttrDataTypes[attrType])
{
case adSmall:
case adShort:
case adInt:
result.nValue = getFieldInt(sName);
break;
case adUSmall:
case adUShort:
case adUInt:
result.uValue = (UINT)getFieldInt64(sName);
break;
case adFloat:
result.fValue = (float)getFieldNumber(sName);
break;
}
return result;
}
INT_PTR CRandAttrReader::readConfig(lua_State* L, PRANDOMATTRTERM pRandAttrTerms, CDataAllocator &dataAllocator, INT_PTR numTermToRead)
{
static INT DefRequestValue = 0;
INT_PTR numReaded = 0;
m_pLua = L;
if (enumTableFirst())
{
do
{
if ( numReaded >= numTermToRead )
{
endTableEnum();
break;
}
int nDefaultJob = 0;
int nDefaultMaxNum = 0;
int nDefaultLockMaxValue = 0;
pRandAttrTerms->type = (BYTE)getFieldInt("type");
pRandAttrTerms->job = (BYTE)getFieldInt("job", &nDefaultJob);
pRandAttrTerms->prob =(WORD) getFieldInt("prop");
pRandAttrTerms->maxNum = (BYTE)getFieldInt("maxNum", &nDefaultMaxNum);
pRandAttrTerms->lockMaxValue = getFieldInt("lockMaxValue", &nDefaultLockMaxValue);
if (feildTableExists("typeValue") && openFieldTable("typeValue"))
{
pRandAttrTerms->valueList.count = lua_objlen(m_pLua, -1);
pRandAttrTerms->valueList.pData = (RANDOMATTVALUE*)dataAllocator.allocObjects( pRandAttrTerms->valueList.count * sizeof(RANDOMATTVALUE)) ;
if (enumTableFirst())
{
int valueIndex = 0;
int def = 0;
do
{
RANDOMATTVALUE* pSmithTypeValue = pRandAttrTerms->valueList.pData + valueIndex;
pSmithTypeValue->minValue = readAttrValue((tagGameAttributeType)pRandAttrTerms->type, "min");
pSmithTypeValue->maxValue = readAttrValue((tagGameAttributeType)pRandAttrTerms->type, "max");
if ((AttrDataTypes[pRandAttrTerms->type] ==adInt && pSmithTypeValue->minValue.nValue > pSmithTypeValue->maxValue.nValue)
||(AttrDataTypes[pRandAttrTerms->type] ==adFloat && pSmithTypeValue->minValue.fValue > pSmithTypeValue->maxValue.fValue))
{
OutputMsg(rmError, "Type=%d:RandAttrMin > RandAttrMax",pRandAttrTerms->type);
return numReaded;
}
pSmithTypeValue->prob = getFieldInt("prop", &def);
valueIndex++;
}while (enumTableNext());
}
closeTable();
}
numReaded++;
pRandAttrTerms++;
}
while (enumTableNext());
}
return numReaded;
}