#include "stdafx.h" #include #include #include #include #include "RegenParser.h" RegenParser::RegenParser() { } RegenParser::~RegenParser() { } VOID RegenParser::Release() { Unload(); } VOID RegenParser::Init( DWORD dwPoolSize ) { } VOID RegenParser::Unload() { do { REGENINFO_HASH_ITR itend = m_RegenHashTable.end(); for( REGENINFO_HASH_ITR it=m_RegenHashTable.begin() ; it != itend ; ++it ) { REGEN_INFO* pINFO = it->second; delete pINFO; } m_RegenHashTable.clear(); } while(0); } VOID RegenParser::Reload() { // Load( m_pszFileName, TRUE ); } //---------------------------------------------------------------------------- // 阁胶磐甫 眠啊茄促. BOOL RegenParser::AddMonster( REGEN_INFO* pInfo, DWORD dwID ) { m_RegenHashTable.insert( std::make_pair( dwID, pInfo ) ); return TRUE; } BOOL RegenParser::DelMonster( REGEN_INFO* pInfo, DWORD dwID ) { m_RegenHashTable.erase( dwID ); return TRUE; } BOOL RegenParser::CheckValidity( REGEN_INFO* pRegenInfo ) { BOOL bSuccess = TRUE; // 捞悼 己氢 眉农 if( pRegenInfo->byMoveAttitude >= eMOVE_ATTITUDE_MAX ) { SUNLOG( eCRITICAL_LOG, "[RegenParser] RegenIndex[%d] 无效的字段[byMoveAttitude][%d]! \n", pRegenInfo->dwNum, pRegenInfo->byMoveAttitude ); pRegenInfo->byMoveAttitude = eMOVE_ATTITUDE_WANDER; bSuccess = FALSE; } // 府哩 鸥烙 if( pRegenInfo->dwRegenTime == 0 ) { SUNLOG( eCRITICAL_LOG, "[RegenParser] RegenIndex[%d] dwRegenTime值为0! \n", pRegenInfo->dwNum ); pRegenInfo->dwRegenTime = 1000; bSuccess = FALSE; } // 府哩 犬伏 if( pRegenInfo->fRegenRate == 0 ) { SUNLOG( eCRITICAL_LOG, "[RegenParser] RegenIndex[%d] fRegenRate值为0! \n", pRegenInfo->dwNum ); pRegenInfo->fRegenRate = 1.f; bSuccess = FALSE; } // 弊缝 for( int i = 0; i < MAX_GROUP_NUM; ++i ) { if( !pRegenInfo->wGroupID[i] ) continue; BASE_GROUPINFO *pBaseGroupInfo = GroupParser::Instance()->GetGroupInfo( pRegenInfo->wGroupID[i] ); if( !pBaseGroupInfo ) { SUNLOG( eCRITICAL_LOG, "[RegenParser] RegenIndex[%d] GroupInfo[%d] 不存在! \n", pRegenInfo->dwNum, pRegenInfo->wGroupID[i] ); pRegenInfo->wGroupID[i] = 0; bSuccess = FALSE; } } // 府哩 NPC for( int i = 0; i < MAX_REGEN_MONSTER_KIND; ++i ) { if( !pRegenInfo->dwMonCode[i] ) continue; BASE_NPCINFO *pBaseNPCInfo = NPCInfoParser::Instance()->GetNPCInfo( pRegenInfo->dwMonCode[i] ); if( !pBaseNPCInfo ) { SUNLOG( eCRITICAL_LOG, "[RegenParser] RegenIndex[%d] NPCInfo[%d] 不存在! \n", pRegenInfo->dwNum, pRegenInfo->dwMonCode[i] ); pRegenInfo->dwMonCode[i] = 0; pRegenInfo->dwMaxNum[i] = 0; bSuccess = FALSE; } } return bSuccess; } BOOL RegenParser::_LoadRegen( BOOL bReload ) { char szLocationID[MAX_AREA_ID_LENGTH+1]; int nRowSize = GetRowSize(); for( int nRow = 0; nRow < nRowSize; ++nRow ) { BOOL bAdd = FALSE; DWORD dwID = GetDataInt( "Num", nRow ); REGENINFO_HASH_ITR itFind = m_RegenHashTable.find( dwID ); REGEN_INFO* pINFO = NULL; if( itFind == m_RegenHashTable.end() ) { pINFO = new REGEN_INFO; ZeroMemory( pINFO, sizeof(REGEN_INFO) ); bAdd = TRUE; } else { pINFO = itFind->second; if( FALSE == bReload ) { ASSERT( !"数据有错误." ); } } pINFO->bPosType = 0; pINFO->dwNum = dwID; strncpy( pINFO->szDesc, GetDataString( "Desc", nRow ), MAX_REGEN_DESC_LEN ); pINFO->MapCode = GetDataInt( "Mapcode", nRow ); pINFO->dwFieldIndex = GetDataInt( "FieldIndex", nRow ); ZeroMemory( szLocationID, sizeof(szLocationID) ); strncpy( szLocationID, GetDataString( "LocationID", nRow ), MAX_AREA_ID_LENGTH ); pINFO->dwLocationID = (DWORD)StrToWzID( szLocationID ); pINFO->wMonsterType = GetDataInt( "MonType", nRow ); pINFO->bAllRegen = GetDataInt( "bAllRegen", nRow ); pINFO->byMoveAttitude = GetDataInt( "byMoveAttitude", nRow ); pINFO->dwRegenTime = GetDataInt( "dRegenTime", nRow ); pINFO->fRegenRate = GetDataFloat( "fRegenRate", nRow ); TCHAR szTemp[MAX_FIELD_NAME_SIZE]; for( INT i = 0 ; i < MAX_GROUP_NUM ; ++i ) { _snprintf( szTemp, MAX_FIELD_NAME_SIZE, "GroupID%d\0", i+1 ); pINFO->wGroupID[i] = GetDataInt( szTemp, nRow ); } for( INT i = 0 ; i < MAX_REGEN_MONSTER_KIND ; ++i ) { _snprintf( szTemp, MAX_FIELD_NAME_SIZE, "MonCode%d\0", i+1 ); pINFO->dwMonCode[i] = GetDataInt( szTemp, nRow ); _snprintf( szTemp, MAX_FIELD_NAME_SIZE, "MaxRegenLimit%d\0", i+1 ); pINFO->dwMaxNum[i] = GetDataInt( szTemp, nRow ); } if( bAdd ) { m_RegenHashTable.insert( std::make_pair(dwID, pINFO) ); } // 蜡瓤己阑 八刘茄促. CheckValidity( pINFO ); } return TRUE; } BOOL RegenParser::_LoadPos( BOOL bReload ) { int nRowSize = GetRowSize(); for( int nRow = 0; nRow < nRowSize; ++nRow ) { BOOL bAdd = FALSE; DWORD dwID = GetDataInt( "Index", nRow ); dwID += 1000000; // 林狼!!!! 困摹技泼 阁胶磐绰 碍力肺 dwID甫 1000000 锅 促澜何磐 REGENINFO_HASH_ITR itFind = m_RegenHashTable.find( dwID ); REGEN_INFO* pINFO = NULL; if( itFind == m_RegenHashTable.end() ) { pINFO = new REGEN_INFO; ZeroMemory( pINFO, sizeof(REGEN_INFO) ); bAdd = TRUE; } else { pINFO = itFind->second; if( FALSE == bReload ) { ASSERT( !"数据有错误." ); } } pINFO->bPosType = 1; pINFO->dwNum = dwID; pINFO->bDistance = GetDataInt( "Distance", nRow ); pINFO->bAllRegen = GetDataInt( "bAllRegen", nRow ); pINFO->fRegenRate = GetDataFloat( "fRegenRate", nRow ); TCHAR szTemp[MAX_FIELD_NAME_SIZE]; for( int i = 0; i < MAX_REGEN_MONSTER_KIND; i++ ) { _snprintf( szTemp, MAX_FIELD_NAME_SIZE, "MCode%d\0", i+1 ); pINFO->dwMonCode[i] = GetDataInt( szTemp, nRow ); _snprintf( szTemp, MAX_FIELD_NAME_SIZE, "MnUm%d\0", i+1 ); pINFO->dwMaxNum[i] = GetDataInt( szTemp, nRow ); } strncpy( pINFO->szDesc, GetDataString( "Desc", nRow ), MAX_REGEN_DESC_LEN ); pINFO->MapCode = GetDataInt( "Mapcode", nRow ); pINFO->dwFieldIndex = GetDataInt( "FieldIndex", nRow ); pINFO->dwRegenTime = GetDataInt( "dRegenTime", nRow ); // script date type : int pINFO->pvPos.x = (float)GetDataInt( "X", nRow ); pINFO->pvPos.y = (float)GetDataInt( "Y", nRow ); pINFO->pvPos.z = (float)GetDataInt( "Z", nRow ); pINFO->dwLocationID = dwID; pINFO->wMonsterType = 1; pINFO->byMoveAttitude = 0; for( int i = 0; i < MAX_GROUP_NUM; ++i ) { pINFO->wGroupID[i] = 0; } if( bAdd ) { m_RegenHashTable.insert( std::make_pair( dwID, pINFO ) ); } } return TRUE; } BOOL RegenParser::LoadScript( eSCRIPT_CODE ScriptCode, BOOL bReload ) { switch( ScriptCode ) { case SCRIPT_REGEN: return _LoadRegen( bReload ); case SCRIPT_REGEN_POS: return _LoadPos( bReload ); }; return FALSE; }