#include "StdAfx.h" #include "MonsterSummonParser.h" #include ".\NpcInfoParser.h" #include "misc.h" #include MonsterSummonParser::MonsterSummonParser() : m_pMonsterSummonHash(NULL) { } MonsterSummonParser::~MonsterSummonParser() { } VOID MonsterSummonParser::Init( DWORD dwPoolSize ) { m_pMonsterSummonHash = new util::SolarHashTable; m_pMonsterSummonHash->Initialize( dwPoolSize ); m_pRatioSelectHash = new util::SolarHashTable *>; m_pRatioSelectHash->Initialize( dwPoolSize ); } VOID MonsterSummonParser::Release() { Unload(); SAFE_DELETE( m_pMonsterSummonHash ); SAFE_DELETE( m_pRatioSelectHash ); } VOID MonsterSummonParser::Unload() { if( m_pMonsterSummonHash ) { MonsterSummonScriptInfo *pInfo = NULL ; for( MONSTER_SUMMON_ITER it = m_pMonsterSummonHash->begin(); it != m_pMonsterSummonHash->end(); ++it ) { pInfo = *it; SAFE_DELETE( pInfo ); } m_pMonsterSummonHash->RemoveAll(); } if( m_pRatioSelectHash ) { ReliableRatioRandomizer *pRatio = NULL; for( SUMMON_RATIO_ITER it = m_pRatioSelectHash->begin(); it != m_pRatioSelectHash->end(); ++it ) { pRatio = *it; SAFE_DELETE( pRatio ); } m_pRatioSelectHash->RemoveAll(); } } //#pragma warning ( push ) //#pragma warning ( disable : 4244) BOOL MonsterSummonParser::LoadScript(eSCRIPT_CODE ScriptCode, BOOL bReload) { switch( ScriptCode ) { case SCRIPT_MONSTERSUMMON: return _Load( bReload); } return FALSE; } BOOL MonsterSummonParser::_Load(BOOL bReload) { __UNUSED(bReload); int nRowSize = GetRowSize(); for( int nRow = 0; nRow < nRowSize; ++nRow ) { MonsterSummonScriptInfo * pInfo = new MonsterSummonScriptInfo; ReliableRatioRandomizer* pRatioSelect = new ReliableRatioRandomizer; pInfo->m_wMonsterGroupCode = GetDataWORD( "wMonsterGCode", nRow); pInfo->m_wMonsterNum = GetDataWORD( "wMonsterNum", nRow); pInfo->m_dMaxRatio = GetDataDouble( "P_Amount", nRow); pInfo->m_LiveTime = GetDataDWORD( "wTime", nRow); pInfo->m_LimitedLV = GetDataBYTE( "wLvLilmit", nRow); double dAccumulation = 0; double dRatio = 0; TCHAR szTemp[MAX_FIELD_NAME_SIZE]; for( DWORD i = 0; i < MAX_MONSTER_SUMMON_IN_GROUP; i++ ) { _snprintf( szTemp, MAX_FIELD_NAME_SIZE, "MonsterIndex%d\0", i + 1); pInfo->m_pMonster[i].MonsterCode = GetDataDWORD( szTemp, nRow); _snprintf( szTemp, MAX_FIELD_NAME_SIZE, "MRation%d\0", i + 1); dRatio = GetDataDouble( szTemp, nRow); pInfo->m_pMonster[i].dSeed = ( dRatio/ pInfo->m_dMaxRatio); dAccumulation = dAccumulation + dRatio; if( pInfo->m_pMonster[i].MonsterCode ) pRatioSelect->AddRatio( (DWORD)(i + 1), dRatio, pInfo->m_dMaxRatio); } if( CheckValidity( pInfo, dAccumulation) ) { m_pMonsterSummonHash->Add( pInfo, pInfo->m_wMonsterGroupCode); m_pRatioSelectHash->Add( pRatioSelect, pInfo->m_wMonsterGroupCode); } else { SAFE_DELETE( pInfo); SAFE_DELETE( pRatioSelect); } } return TRUE; } //#pragma warning ( pop ) BOOL MonsterSummonParser::CheckValidity( MonsterSummonScriptInfo *pMonsterSummonInfo, double dAccumulation ) { if( pMonsterSummonInfo->m_dMaxRatio == 0) { SUNLOG(eCRITICAL_LOG, "在MonsterSummon脚本的%u怪物组代码中概率之和为0. "); return FALSE; } if( dAccumulation > pMonsterSummonInfo->m_dMaxRatio ) { SUNLOG(eCRITICAL_LOG, "MonsterSummon脚本:%u组代码中概率的总和超过最大值.", pMonsterSummonInfo->m_wMonsterGroupCode ); return FALSE; } //家券且 阁胶磐啊 胶农赋飘俊 粮犁窍绰啊? for(DWORD i = 0; i < MAX_MONSTER_SUMMON_IN_GROUP; i++) { if( pMonsterSummonInfo->m_pMonster[i].MonsterCode == 0 ) continue; if( !NPCInfoParser::Instance()->GetNPCInfo( pMonsterSummonInfo->m_pMonster[i].MonsterCode ) ) { SUNLOG(eCRITICAL_LOG, "Monster Summon脚本组代码:规则编号[%u]为找到[%u]怪物信息" , pMonsterSummonInfo->m_wMonsterGroupCode, i+1 ); return FALSE; } } //家券且 阁胶磐啊 0老 荐绰 绝促. if( pMonsterSummonInfo->m_wMonsterNum == 0) return FALSE; return TRUE; } WORD MonsterSummonParser::GetMonsterSummonNum( WORD GroupCode ) { MonsterSummonScriptInfo *pInfo = m_pMonsterSummonHash->GetData( GroupCode ); if( !pInfo ) { SUNLOG(eCRITICAL_LOG, "没有MonsterSummon脚本或错误组代码:%u", GroupCode); return 0; } return pInfo->m_wMonsterNum; } DWORD MonsterSummonParser::GetMonsterLiveTime( WORD GroupCode ) const { MonsterSummonScriptInfo *pInfo = m_pMonsterSummonHash->GetData( GroupCode ); if( !pInfo ) { SUNLOG(eCRITICAL_LOG, "没有MonsterSummon脚本或错误组代码:%u", GroupCode); return 0; } return pInfo->m_LiveTime; } const MonsterSummonScriptInfo* MonsterSummonParser::GetMonsterSummonScriptInfo(WORD GroupCode) const { MonsterSummonScriptInfo *pInfo = m_pMonsterSummonHash->GetData( GroupCode ); if( !pInfo ) { SUNLOG(eCRITICAL_LOG, "没有MonsterSummon脚本或错误组代码:%u", GroupCode); return 0; } return pInfo; } CODETYPE MonsterSummonParser::GetRandomMonsterCode( WORD GroupCode ) { MonsterSummonScriptInfo *pInfo = m_pMonsterSummonHash->GetData( GroupCode ); if( !pInfo ) { SUNLOG(eCRITICAL_LOG, "没有MonsterSummon脚本或错误组代码:%u", GroupCode); return FALSE; } ReliableRatioRandomizer * pRatioSelect = NULL; pRatioSelect = m_pRatioSelectHash->GetData( GroupCode ); if( pRatioSelect == NULL) { return 0; } CODETYPE MonsterCode = 0; DWORD RandomKey = pRatioSelect->RandomizedKey(); if( RandomKey == 0 || RandomKey > MAX_MONSTER_SUMMON_IN_GROUP ) { MonsterCode = 0; } else { MonsterCode = pInfo->m_pMonster[RandomKey - 1].MonsterCode; } return MonsterCode; }