101 lines
2.8 KiB
C++
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;
|
|
}
|