357 lines
7.7 KiB
C++
357 lines
7.7 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
|
|||
|
|
#include "PetProvider.h"
|
|||
|
|
#include "../base/Container.hpp"
|
|||
|
|
using namespace wylib::stream;
|
|||
|
|
|
|||
|
|
|
|||
|
|
CPetProvider::CPetProvider() : m_dataAllocator(_T("PetDataAlloc"))
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CPetProvider::~CPetProvider()
|
|||
|
|
{
|
|||
|
|
m_petData.empty();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CPetProvider::showError(LPCTSTR sError)
|
|||
|
|
{
|
|||
|
|
m_sLastErrDesc = sError;
|
|||
|
|
RefString s = _T("[Config Error]");
|
|||
|
|
s += sError;
|
|||
|
|
throw s;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//装载宠物的经验
|
|||
|
|
bool CPetProvider::LoadPetExp(LPCTSTR sFilePath)
|
|||
|
|
{
|
|||
|
|
//bool bResult = InheritedReader::LoadFile(this,sFilePath,&CPetProvider::ReadPetExp);
|
|||
|
|
bool bResult = false;
|
|||
|
|
bResult = Inherited::LoadFile(sFilePath);
|
|||
|
|
if (!bResult)
|
|||
|
|
{
|
|||
|
|
showError(_T("ReadPetExp config error!"));
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//bResult = InheritedReader::LoadFile(this,sFilePath,&CPetProvider::ReadPetMergePropRate);
|
|||
|
|
//if (!bResult)
|
|||
|
|
//{
|
|||
|
|
// showError(_T("ReadPetMergeProp config error!"));
|
|||
|
|
// return false;
|
|||
|
|
//}
|
|||
|
|
if(ReadPetExp() ==false)
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
setScript(NULL);
|
|||
|
|
|
|||
|
|
bResult = Inherited::LoadFile(sFilePath);
|
|||
|
|
|
|||
|
|
if( ReadPetMergePropRate() ==false)
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
setScript(NULL);
|
|||
|
|
|
|||
|
|
return bResult;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CPetProvider::ReadPetExp()
|
|||
|
|
{
|
|||
|
|
if ( !openGlobalTable("PetLevelUpExp") )
|
|||
|
|
return false;
|
|||
|
|
|
|||
|
|
|
|||
|
|
//获取配置中的物品数量
|
|||
|
|
const INT_PTR nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
//如果物品数量为0则输出未配置任何物品的错误
|
|||
|
|
if ( nCount <= 0 )
|
|||
|
|
showError(_T("no exp data on pet exp config"));
|
|||
|
|
//申请出物品数据并将物品数据内存块清空
|
|||
|
|
m_petExp.count =nCount;
|
|||
|
|
|
|||
|
|
if( nCount > 0 )
|
|||
|
|
{
|
|||
|
|
m_petExp.pData = ( DataList<unsigned int>*) m_dataAllocator.allocObjects( nCount * sizeof(DataList<unsigned int>)) ;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
INT_PTR nIndex =0; //当前遍历的index
|
|||
|
|
if (enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
DataList<unsigned int>* pData = m_petExp.pData + nIndex;
|
|||
|
|
|
|||
|
|
const INT_PTR nItemCount = lua_objlen(m_pLua, -1); //有多少个物品
|
|||
|
|
pData->count = nItemCount; //拥有的物品的类型
|
|||
|
|
|
|||
|
|
pData->pData = ( unsigned int*) m_dataAllocator.allocObjects( nItemCount * sizeof(unsigned int)) ;
|
|||
|
|
INT_PTR j=0;
|
|||
|
|
if (enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
pData->pData[j] = (unsigned int)getFieldInt(NULL);
|
|||
|
|
j++;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
nIndex ++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CPetProvider::ReadPetMergePropRate()
|
|||
|
|
{
|
|||
|
|
if (!openGlobalTable("PetMergePropRate"))
|
|||
|
|
return false;
|
|||
|
|
|
|||
|
|
//获取配置中的物品数量
|
|||
|
|
const INT_PTR nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
//如果物品数量为0则输出未配置任何物品的错误
|
|||
|
|
if ( nCount <= 0 )
|
|||
|
|
showError(_T("no config data on PetMergePropRate config"));
|
|||
|
|
//申请出物品数据并将物品数据内存块清空
|
|||
|
|
m_petMergePropRate.count = nCount;
|
|||
|
|
|
|||
|
|
if (nCount > 0)
|
|||
|
|
{
|
|||
|
|
m_petMergePropRate.pData = (DataList<PetMergePropRate>*)m_dataAllocator.allocObjects(nCount * sizeof(DataList<PetMergePropRate>));
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
INT_PTR nIndex =0; //当前遍历的index
|
|||
|
|
if (enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
DataList<PetMergePropRate> *pData = m_petMergePropRate.pData + nIndex;
|
|||
|
|
|
|||
|
|
const INT_PTR nItemCount = lua_objlen(m_pLua, -1); //有多少个物品
|
|||
|
|
pData->count = nItemCount; //拥有的物品的类型
|
|||
|
|
|
|||
|
|
pData->pData = (PetMergePropRate*)m_dataAllocator.allocObjects(nItemCount * sizeof(PetMergePropRate)) ;
|
|||
|
|
INT_PTR j=0;
|
|||
|
|
if (enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
pData->pData[j].wType = (WORD)getFieldInt("type");
|
|||
|
|
pData->pData[j].fRate = (float)getFieldNumber("value");
|
|||
|
|
|
|||
|
|
j++;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
nIndex ++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* Comments:装载全部怪物的数据
|
|||
|
|
* @Return bool: 失败返回false
|
|||
|
|
*/
|
|||
|
|
bool CPetProvider::LoadPets(LPCTSTR sFilePath)
|
|||
|
|
{
|
|||
|
|
//return InheritedReader::LoadFile(this,sFilePath,&CPetProvider::ReadAllPet);
|
|||
|
|
if( Inherited::LoadFile(sFilePath) )
|
|||
|
|
{
|
|||
|
|
bool r= ReadAllPet();
|
|||
|
|
setScript(NULL);
|
|||
|
|
return r;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool CPetProvider::ReadAllPet()
|
|||
|
|
{
|
|||
|
|
if ( !openGlobalTable("Pets") )
|
|||
|
|
{
|
|||
|
|
showError(_T("no global table Pets Found"));
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_petData.clear();
|
|||
|
|
INT_PTR nIdx =0;
|
|||
|
|
if (enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
PETCONFIG onePet;
|
|||
|
|
ReadOnePet(m_dataAllocator,&onePet,nIdx);
|
|||
|
|
m_petData.add(onePet);
|
|||
|
|
nIdx++;
|
|||
|
|
}
|
|||
|
|
while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CPetProvider::ReadOnePet(CDataAllocator &dataAllocator,PPETCONFIG pPet,INT_PTR nPetId)
|
|||
|
|
{
|
|||
|
|
pPet->id = getFieldInt("id");
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
if(nPetId != pPet->id)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError,_T("宠物的ID错误,配置的id=%d,期望为%d"),pPet->id, (int)nPetId);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
getFieldStringBuffer("name",pPet->name,sizeof(pPet->name) );
|
|||
|
|
|
|||
|
|
int nDef=0;
|
|||
|
|
//pPet->defaultSkill = getFieldInt("defaultSkillId",&nDef);
|
|||
|
|
|
|||
|
|
pPet->nModel = getFieldInt("modelid",&nDef);
|
|||
|
|
pPet->icon =getFieldInt("icon",&nDef);
|
|||
|
|
pPet->aiId =getFieldInt("aiId",&nDef);
|
|||
|
|
|
|||
|
|
nDef =36;
|
|||
|
|
|
|||
|
|
//读取各级宠物的属性
|
|||
|
|
if ( feildTableExists("property") && openFieldTable("property") )
|
|||
|
|
{
|
|||
|
|
const INT_PTR nCount =(INT_PTR) lua_objlen(m_pLua, -1) ;
|
|||
|
|
|
|||
|
|
if (enumTableFirst())
|
|||
|
|
{
|
|||
|
|
INT_PTR i=0;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if(i >= MAX_PET_LEVEL_COUNT) break;
|
|||
|
|
|
|||
|
|
CREATURBATTLEEDATA data;
|
|||
|
|
|
|||
|
|
nDef =0;
|
|||
|
|
double fDef =0.0;
|
|||
|
|
data.nColor =0;
|
|||
|
|
|
|||
|
|
data.nMaxHp = getFieldInt("nMaxHp",&nDef);
|
|||
|
|
data.nMaxMp = getFieldInt("nMaxMp",&nDef);
|
|||
|
|
|
|||
|
|
data.nPhysicalAttackMin = getFieldInt("nPhysicalAttackMin",&nDef);
|
|||
|
|
|
|||
|
|
data.nPhysicalAttackMax = getFieldInt("nPhysicalAttackMax",&nDef);
|
|||
|
|
data.nMagicAttackMin = getFieldInt("nMagicAttackMin",&nDef);
|
|||
|
|
data.nMagicAttackMax = getFieldInt("nMagicAttackMax",&nDef);
|
|||
|
|
data.nWizardAttackMin = getFieldInt("nWizardAttackMin",&nDef);
|
|||
|
|
data.nWizardAttackMax = getFieldInt("nWizardAttackMax",&nDef);
|
|||
|
|
data.nHysicalDefenceMin = getFieldInt("nHysicalDefenceMin",&nDef);
|
|||
|
|
data.nHysicalDefenceMax = getFieldInt("nHysicalDefenceMax",&nDef);
|
|||
|
|
data.nMagicDefenceMin = getFieldInt("nMagicDefenceMin",&nDef);
|
|||
|
|
data.nMagicDefenceMax = getFieldInt("nMagicDefenceMax",&nDef);
|
|||
|
|
|
|||
|
|
data.nHitrate = getFieldInt("nHitrate",&nDef);
|
|||
|
|
data.nDogerate = getFieldInt("nDogerate",&nDef);
|
|||
|
|
|
|||
|
|
data.nMagicHitRate = getFieldInt("nMagicHitRate",&nDef);
|
|||
|
|
data.nMagicDogerate = getFieldInt("nMagicDogerate",&nDef);
|
|||
|
|
|
|||
|
|
data.nHpRateRenew =(float) getFieldNumber("fHpRateRenew",&fDef);
|
|||
|
|
data.nMpRateRenew = (float)getFieldNumber("fMpRateRenew",&fDef);
|
|||
|
|
|
|||
|
|
data.nMoveOneSlotTime = getFieldInt("nMoveOneSlotTime",&nDef);
|
|||
|
|
data.nAttackSpeed = getFieldInt("nAttackSpeed",&nDef);
|
|||
|
|
|
|||
|
|
data.nLuck = getFieldInt("nLuck",&nDef);
|
|||
|
|
|
|||
|
|
CPropertySystem::InitMonsterCalculator(data,pPet->levels[i].cal);
|
|||
|
|
|
|||
|
|
unsigned int clr = DEFAULT_NAME_COLOR;
|
|||
|
|
const char *pKey = "color";
|
|||
|
|
if (feildTableExists(pKey) && openFieldTable(pKey))
|
|||
|
|
{
|
|||
|
|
INT_PTR count = lua_objlen(m_pLua, -1);
|
|||
|
|
if (count > 0)
|
|||
|
|
{
|
|||
|
|
if (enumTableFirst())
|
|||
|
|
{
|
|||
|
|
int elem[4] = {0}, idx = 0;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
if (idx < 4)
|
|||
|
|
elem[idx] = (int)getFieldNumber(NULL);
|
|||
|
|
idx++;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
|
|||
|
|
clr = (COLORREF) ( ((BYTE)(elem[3])) | (((BYTE)(elem[2]))<<8) | (((BYTE)(elem[1]))<<16) | ((BYTE)(elem[0])<<24) );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
pPet->levels[i].color= clr;
|
|||
|
|
|
|||
|
|
|
|||
|
|
i++;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
bool CPetProvider::ReadTable(char *sName, int *pAddr,int nMaxCount)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if ( feildTableExists(sName) && openFieldTable(sName) )
|
|||
|
|
{
|
|||
|
|
const INT_PTR nCount =(INT_PTR) lua_objlen(m_pLua, -1) ;
|
|||
|
|
if ( nCount <= 0 )
|
|||
|
|
{
|
|||
|
|
//pPet->.count =0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
INT_PTR nIdx = 0;
|
|||
|
|
|
|||
|
|
int * pBaseLevel =pAddr;
|
|||
|
|
int * pOneCondition =NULL;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
pOneCondition= pBaseLevel + nIdx;
|
|||
|
|
if( nMaxCount > nIdx )
|
|||
|
|
{
|
|||
|
|
*pOneCondition = getFieldInt(NULL);
|
|||
|
|
}
|
|||
|
|
nIdx++;
|
|||
|
|
}while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|