#include "StdAfx.h" #include ".\UnitRegenInfo.h" #include "FormulaRatioParser.h" #include "NPCInfoParser.h" UnitRegenInfo::UnitRegenInfo(void) //, m_LeaderRegenID(0) //: m_NPCCode(0) : m_StartPos(NULL) , m_DestPos(NULL) , m_NumOfPos(0) , m_GroupID(0) , regen_type_(0) //_NA_0_20100222_UNIT_TRIGGERS_REGEN , walk_state_(NULL) //_NA_0_20100222_UNIT_TRIGGERS_PATHLIST { } UnitRegenInfo::~UnitRegenInfo(void) { Release(); } void UnitRegenInfo::Release() { SAFE_DELETE_ARRAY( m_StartPos ); SAFE_DELETE_ARRAY( m_DestPos ); SAFE_DELETE_ARRAY(walk_state_); //_NA_0_20100222_UNIT_TRIGGERS_PATHLIST m_NumOfPos = 0; m_GroupID = 0; regen_type_ = 0; //_NA_0_20100222_UNIT_TRIGGERS_REGEN regen_monster_selector_.Release(); } void UnitRegenInfo::Init( BYTE NumOfNPC, WORD NumOfPos ) { ASSERT( NumOfNPC <= NUM_REGENUNITTYPE ); ASSERT( !m_StartPos && !m_DestPos ); m_NumOfPos = NumOfPos; m_StartPos = new WzVector[NumOfPos]; m_DestPos = new WzVector[NumOfPos]; walk_state_ = new eCHAR_MOVE_STATE[NumOfPos]; //_NA_0_20100222_UNIT_TRIGGERS_PATHLIST regen_type_ = 0; //_NA_0_20100222_UNIT_TRIGGERS_REGEN m_GroupID = 0; } void UnitRegenInfo::SetRegenTime( DWORD RegenTime ) { m_RegenTime = RegenTime; BASE_FORMULA_RATIOINFO *pFormulaRatio = FormulaRatioParser::Instance()->GetFormulaRatio( RATIO_TYPE_REGEN_TIME ); if( !pFormulaRatio ) return; if( pFormulaRatio->m_fRatio <= 0 || pFormulaRatio->m_fRatio == 1 ) return; const int count = regen_monster_selector_.GetCount(); if (count <= 0) { SUNLOG( eFULL_LOG, "[UnitRegenInfo::SetRegenTime] Call SetRegenTime() After call Init() first of all!" ); return; } // ·°Å°¸ó½ºÅͳª º¸½º±Þ ¸ó½ºÅÍ´Â ¸®Á¨¼Óµµ Á¶Àý¿¡¼­ Á¦¿ÜÇÑ´Ù. BOOL bRatioApply = TRUE; for (int i = 0; i < count; ++i) { BASE_NPCINFO *pBaseNPCInfo = NPCInfoParser::Instance()->GetNPCInfo( m_pNPCCodes[i] ); if( !pBaseNPCInfo ) continue; if( pBaseNPCInfo->m_byGrade == eNPC_MIDDLEBOSS || pBaseNPCInfo->m_byGrade == eNPC_BOSS || pBaseNPCInfo->m_byGrade == eNPC_LUCKY_MONSTER ) { bRatioApply = FALSE; break; } } if( bRatioApply ) { m_RegenTime = max( 1000, (DWORD)( m_RegenTime * pFormulaRatio->m_fRatio ) ); } } // °¡Áø npc ÄÚµåÁß ·£´ýÇÏ°Ô Çϳª¸¦ ¸®ÅÏÇÑ´Ù. int UnitRegenInfo::GetRandomNPCCode() { // changed by _NA_0_20100706_RANDOM_REGEN const DWORD total_ratio = regen_monster_selector_.GetTotalRatio(); DWORD ratio = random(0, total_ratio-1); MONSTERCODE code = 0; BOOL is_success = regen_monster_selector_.Select(ratio, code); ASSERT(is_success); return code; } void UnitRegenInfo::SetStartPos(WORD idx, WzVector * pos) { ASSERT( idx < m_NumOfPos ); m_StartPos[idx] = *pos; } void UnitRegenInfo::SetDestPos(WORD idx, WzVector * pos) { ASSERT( idx < m_NumOfPos ); m_DestPos[idx] = *pos; } DWORD UnitRegenInfo::GetNpcCodeArray(MONSTERCODE* OUT npc_code_array, int size) { const int map_size = regen_monster_selector_.GetCount(); ASSERT(map_size <= size); RatioSelector::ACTIONS& action_data = regen_monster_selector_.GetActionData(); RatioSelector::ACTIONS::iterator itr = action_data.begin(); for (int i = 0;itr != action_data.end(); ++itr, ++i) { npc_code_array[i] = itr->first; } return map_size; } WORD UnitRegenInfo::GetRandomPosIndex() { if( m_NumOfPos == 1 || GetUnitType() == eMOVE_ATTITUDE_PATHLIST) { return 0; } return static_cast(dRandom(0, m_NumOfPos)); } void UnitRegenInfo::SetWalkState(WORD idx, eCHAR_MOVE_STATE walk_state) { ASSERT( idx < m_NumOfPos ); walk_state_[idx] = walk_state; } /////////////////////////////////////////////////////////// // _NA_0_20100706_RANDOM_REGEN »èÁ¦ BOOL UnitRegenInfo::IsRandomRegen() { if( m_RegenType == 0 ) { // ¸ó½ºÅÍ ÀÏ¹Ý ¸®Á¨ m_SelectedNPC = 0; return TRUE; } else { ASSERT( 0 != m_NumOfNPC ); // ·£´ý ¸ó½ºÅÍ ¸®Á¨ BYTE i = 0; int seed = random(0, 99); for( i = 0 ; i < m_NumOfNPC ; ++i ) { if( seed < m_pSelectRates[i]) { m_SelectedNPC = i; return TRUE; } } } return FALSE; } // _NA_0_20100706_RANDOM_REGEN »èÁ¦ // µ¥ÀÌÅ͸¦ ¸É¹ö¿¡ ¼ÂÆÃÇÑÈÄ Ã³À½¿¡ Çѹø È£ÃâÇÏ¿© °è»êÇØ µÎ¾î¾ß ÇÑ´Ù. void UnitRegenInfo::CalcRatio() { // È®·üÀÇ ±Þ¼ö for( int i = 1 ; i < m_NumOfNPC ; ++i ) { m_pSelectRates[i] += m_pSelectRates[i-1]; } } // _NA_0_20100706_RANDOM_REGEN »èÁ¦ void UnitRegenInfo::SetNPCCodes(BYTE idx, int value) { ASSERT( idx < m_NumOfNPC ); m_pNPCCodes[idx] = value; } // _NA_0_20100706_RANDOM_REGEN »èÁ¦ void UnitRegenInfo::SetSelectRates(BYTE idx, int value) { ASSERT( idx < m_NumOfNPC ); m_pSelectRates[idx] = value; } ///////////////////////////////////////////////////////////