Files
Sun1602/ProgramCommon/PetInfoParser.cpp
T
2022-10-26 12:25:11 +08:00

218 lines
5.6 KiB
C++

#include "StdAfx.h"
#include ".\PetInfoParser.h"
#include <ItemOptionHeader.h>
PetInfoParser::PetInfoParser(void)
{
}
PetInfoParser::~PetInfoParser(void)
{
Unload();
}
VOID PetInfoParser::Release()
{
Unload();
}
VOID PetInfoParser::Init( char * pszPackFileName )
{
SetPackFileName( pszPackFileName );
}
VOID PetInfoParser::Unload()
{
PET_SCRIPT_INFO_HASH::iterator it, end( m_HashPetInfo.end() );
for( it = m_HashPetInfo.begin() ; it != end ; ++it)
{
sPet_Script_Info * pInfo = (it->second);
SAFE_DELETE( pInfo );
}
m_HashPetInfo.clear();
}
//#pragma warning ( push )
//#pragma warning ( disable : 4244)
BOOL PetInfoParser::_Load( BOOL bReload )
{
int nRowSize = GetRowSize();
for( int nRow = 0; nRow < nRowSize; ++nRow )
{
DWORD dwIndex = GetDataDWORD( "dwIndex", nRow );
sPet_Script_Info * pInfo = NULL;
PET_SCRIPT_INFO_HASH::iterator itr = m_HashPetInfo.find( dwIndex );
if ( itr == m_HashPetInfo.end() )
{
// 없으면!
pInfo = new sPet_Script_Info;
memset(pInfo, 0, sizeof(sPet_Script_Info));
m_HashPetInfo[dwIndex] = pInfo;
}
else
{
pInfo = itr->second;
if( FALSE == bReload )
{
SUNLOG( eCRITICAL_LOG, "신굶匡숭鑒앴댄轎, Code = %u", dwIndex );
FASSERT( !"鑒앴唐댄轎." );
}
}
pInfo->m_wIndexCode = dwIndex;
strncpy( pInfo->m_pszName, GetDataString( "Name", nRow ), MAX_MONSTERNAME_LENGTH );
pInfo->m_dwNameCode = GetDataDWORD( "NameCode", nRow );
pInfo->m_MonsterCode = GetDataWORD( "wMonsterCode", nRow );
#ifdef _GS_ADD_PET_ENCHANT_EFFECT
pInfo->effect_subtype = GetDataWORD( "EffectType", nRow );
#endif//_GS_ADD_PET_ENCHANT_EFFECT
pInfo->m_byFullnessUp = GetDataBYTE( "byFullnessUp", nRow );
pInfo->m_byFullnessDown[0] = GetDataBYTE( "byFullnessDown1", nRow );
pInfo->m_byFullnessDown[1] = GetDataBYTE( "byFullnessDown2", nRow );
pInfo->m_byIntimacyUp = GetDataBYTE( "byIntimacyUp", nRow );
pInfo->m_byIntimacyDown[0] = GetDataBYTE( "byIntimacyDown1", nRow );
pInfo->m_byIntimacyDown[1] = GetDataBYTE( "byIntimacyDown2", nRow );
pInfo->m_byAIType = GetDataBYTE( "byAIType", nRow );
#ifdef __CN_PET_OPTION_APPLY_FLAG
pInfo->m_eApplyOptionFlag = (sPet_Script_Info::ePET_OPTION_FLAG)GetDataInt( "Cumulate", nRow );
#endif
//클라이언트 연출용(펫 고정UI & 펫시작위치)
pInfo->m_byPdisplayMove = GetDataBYTE( "PdisplayMove", nRow );
pInfo->m_byPpossition = GetDataBYTE( "Pposition", nRow );
TCHAR szTemp[MAX_FIELD_NAME_SIZE];
for( int i = 0 ; i < MAX_PET_OPTION_EXTENT_COUNT; i++)
{
_snprintf( szTemp, MAX_FIELD_NAME_SIZE, "byIntimacyMin%d\0", i+1 );
pInfo->m_byIntimacyMin[i] = GetDataBYTE( szTemp, nRow );
_snprintf( szTemp, MAX_FIELD_NAME_SIZE, "byIntimacyMax%d\0", i+1 );
pInfo->m_byIntimacyMax[i] = GetDataBYTE( szTemp, nRow );
for( int j = 0 ; j < MAX_PET_OPTION_COUNT; j++)
{
_snprintf( szTemp, MAX_FIELD_NAME_SIZE, "wPet%dOptionKind%d\0", i+1, j+1 );
pInfo->m_PetOptionInfo[i].m_wOptionKind[j] = GetDataWORD( szTemp, nRow );
_snprintf( szTemp, MAX_FIELD_NAME_SIZE, "byPet%dValueType%d\0", i+1, j+1 );
pInfo->m_PetOptionInfo[i].m_byValueType[j] = GetDataBYTE( szTemp, nRow );
_snprintf( szTemp, MAX_FIELD_NAME_SIZE, "iPet%dValue%d\0", i+1, j+1 );
pInfo->m_PetOptionInfo[i].m_iValue[j] = GetDataInt( szTemp, nRow );
}
}
if( !ValidCheck( pInfo ) )
return FALSE;
}
return TRUE;
}
//#pragma warning ( pop )
BOOL PetInfoParser::LoadScript( eSCRIPT_CODE ScriptCode, BOOL bReload )
{
switch( ScriptCode )
{
case SCRIPT_PET_INFO:
return _Load( bReload );
}
return FALSE;
}
BOOL PetInfoParser::ValidCheck(sPet_Script_Info *pInfo)
{
for( int i = 0 ; i < MAX_PET_OPTION_EXTENT_COUNT; i++)
{
for( int j = 0 ; j < MAX_PET_OPTION_COUNT; j++)
{
eATTR_TYPE AttrType = (eATTR_TYPE)pInfo->m_PetOptionInfo[i].m_wOptionKind[j];
BYTE NumericType = pInfo->m_PetOptionInfo[i].m_byValueType[j];
int OptionValue = pInfo->m_PetOptionInfo[i].m_iValue[j];
if( NumericType != VALUE_TYPE_VALUE ) OptionValue = OptionValue / 10;
// 비율타입 옵션 체크
if( !CheckOptionValidity( AttrType, NumericType, OptionValue ) )
{
SUNLOG(eCRITICAL_LOG,
"|[PetInfo]|轟槻돨朞淃令 Option|Index=%d|OptionIndex=%d|OptionType=%d|OptionValue=%d|",
pInfo->m_wIndexCode, AttrType, NumericType, OptionValue );
}
}
}
#ifdef __CN_PET_OPTION_APPLY_FLAG
//(shogen)(20090825)
if( pInfo->m_eApplyOptionFlag < 0 || pInfo->m_eApplyOptionFlag >= sPet_Script_Info::ePET_OPTION_FLAG_MAX )
{
ASSERT(FALSE);
SUNLOG( eCRITICAL_LOG, "[PetInfoParser] Index(%d), 轟槻돨俚뙈令 m_eApplyOptionFlag(%d)",
pInfo->m_wIndexCode, pInfo->m_eApplyOptionFlag );
}
#endif
return TRUE;
}
sPet_Script_Info * PetInfoParser::GetPetInfo( DWORD Index )
{
sPet_Script_Info * pPetInfo = NULL;
PET_SCRIPT_INFO_HASH::iterator it = m_HashPetInfo.find( Index );
if ( it != m_HashPetInfo.end() )
{
pPetInfo = it->second;
return pPetInfo;
}
return NULL;
}
int PetInfoParser::GetOptionLevel( WORD wPetIndex , int iCurIntimacy)
{
sPet_Script_Info * pPetInfo = GetPetInfo(wPetIndex);
assert(pPetInfo && "轟녘膠乞多");
if(!pPetInfo) return 0;
for( int lv = 0 ; lv < MAX_PET_OPTION_EXTENT_COUNT; lv++)
{
if( pPetInfo->m_byIntimacyMin[lv] <= iCurIntimacy && iCurIntimacy <= pPetInfo->m_byIntimacyMax[lv])
return lv;
}
return 0;
}
sPet_Script_Info* PetInfoParser::GetNext()
{
sPet_Script_Info* pPetInfo;
if( m_HashPetInfoIterator != m_HashPetInfo.end())
{
pPetInfo = m_HashPetInfoIterator->second;
m_HashPetInfoIterator++;
return pPetInfo;
}
return NULL;
}