#include "StdAfx.h" #include ".\UnitRegenManager.h" #include ".\GameField.h" #include #include // Àӽà #include "Monster.h" UnitRegenManager::_POOL UnitRegenManager::m_Pool; UnitRegenManager::UnitRegenManager(void) : m_pUnitRegenInfoManager(NULL) , m_pGameField(NULL) { } void UnitRegenManager::CreatePool( DWORD dwPoolSize ) { m_Pool.Initialize( dwPoolSize, 0, "UnitRegenManager", AssertionLogger4Pool_Server ); UnitRegen::SetPool( &m_Pool ); } void UnitRegenManager::Release() { SetUnitRegenInfoManager( NULL ); SetGameField( NULL ); std::for_each( m_WaitingUnitRegenHash.begin(), m_WaitingUnitRegenHash.end(), std::bind1st(std::mem_fun(&UnitRegenManager::free), this) ); m_WaitingUnitRegenHash.clear(); m_bPreRegen = true; m_setRegenSector.clear(); } void UnitRegenManager::free( UNITREGEN_PAIR value_type ) { UnitRegen::FREE(value_type.second); } void UnitRegenManager::Init( GameField * pField, UnitRegenInfoManager * pInfoMgr, bool bPreRegen ) { SetGameField( pField ); SetUnitRegenInfoManager( pInfoMgr ); // Lobby´Â pInfoMgrÀÌ NULL ÀÌ´Ù. m_bPreRegen = bPreRegen; m_setRegenSector.clear(); if( m_bPreRegen && pInfoMgr ) { // ¸®Á¨Á¤º¸°¡ ÀÖÀ»°æ¿ì¸¸ MGR°¡ µ¿ÀÛÇÑ´Ù. UNITREGENINFO_HASH & rUnitInfoHash = pInfoMgr->GetUnitRegenInfoHash(); std::for_each( rUnitInfoHash.begin(), rUnitInfoHash.end(), std::bind1st(std::mem_fun(&UnitRegenManager::SpawnAll), this) ); } } void UnitRegenManager::Update() { UNITREGEN_HASH::iterator it = m_WaitingUnitRegenHash.begin(), end = m_WaitingUnitRegenHash.end(); while( it != end ) { UnitRegen * pUnit = (it->second); if( pUnit->IsRegenTime() ) { // ÇØ´ç ¼½ÅÍ ±Ùó¿¡ Ç÷¹À̾ ¾øÀ¸¸é ¸®Á¨À» ÇÏÁö ¾Ê´Â´Ù. Sector *pSector = m_pGameField->GetSector( pUnit->GetUnitRegenInfo()->GetSectorIndex() ); if( !pSector || !pSector->GetReferenceCount() ) { ++it; continue; } //_NA_0_20100222_UNIT_TRIGGERS_REGEN = { UnitRegenInfo* const unit_regen_info = pUnit->GetUnitRegenInfo(); ASSERT(unit_regen_info); const bool is_trigger_regen = unit_regen_info->IsRegenTypeTrigger(); if (is_trigger_regen == true) { SUNLOG(eDEV_LOG, "[UnitRegenManager] triggerRegen ºöÂÔ UnitRegen." "£¨²»ÒªÌí¼ÓOnWaiting£©" "DubugName = %s, WutFileName = %s", unit_regen_info->GetDebugName(), unit_regen_info->GetWutFileName()); m_WaitingUnitRegenHash.erase(it++); UnitRegen::FREE(pUnit); continue; } //} if (m_pGameField->SpawnMonster(pUnit->GetUnitRegenInfo())) { m_WaitingUnitRegenHash.erase(it++); UnitRegen::FREE( pUnit ); } else { pUnit->Restart(); ++it; } } else { ++it; } } } //_NA_0_20100706_RANDOM_REGEN »èÁ¦ bool UnitRegenManager::Spawn( UnitRegenInfo * pUnitInfo ) { if( !pUnitInfo->IsRandomRegen() ) { return false; } if( !m_pGameField->SpawnMonster( pUnitInfo ) ) { return false; } return true; } void UnitRegenManager::SpawnAll( UNITREGENINFO_PAIR value_type ) { UnitRegenInfo * pUnitRegenInfo = value_type.second; // _NA_0_20100222_UNIT_TRIGGERS_REGEN // ¼½ÅÍ º°·Î ¸®Á¨ µÇ´Â Ãʱ⠸®Á¨ ºÒ°¡ // RegenTime ¿¡ ÀÇÇØ¼­ ºÒ°¡. // ACTION_SHOW_OR_HIDE_UNIT¸¦ ÅëÇØ¼­ Á÷Á¢ SpawnMonster const bool is_trigger_regen = pUnitRegenInfo->IsRegenTypeTrigger(); if (is_trigger_regen == true) return; if (!m_pGameField->SpawnMonster(pUnitRegenInfo)) { SUNLOG( eCRITICAL_LOG, "ÎÞ·¨½øÐгõʼÔÙÉú. DubugName = %s, WutFileName = %s" , pUnitRegenInfo->GetDebugName(), pUnitRegenInfo->GetWutFileName() ); } } void UnitRegenManager::SpawnSector( DWORD dwSectorIndex ) { if( m_bPreRegen || !GetUnitRegenInfoManager() ) return; // ÀÌ¹Ì ¸®Á¨µÈ ¼½ÅÍÀÎÁö üũ SET_SECTOR_REGEN_ITR setItr = m_setRegenSector.find( dwSectorIndex ); if( setItr != m_setRegenSector.end() ) return; // ÇØ´ç ¼½ÅÍ¿¡ ÇØ´çÇÏ´Â ¸®Á¨Á¤º¸µéÀ» ¸®Á¨ÇÑ´Ù. UNITREGENINFO_HASH & rUnitInfoHash = GetUnitRegenInfoManager()->GetUnitRegenInfoHash(); UNITREGENINFO_HASH_ITR itend = rUnitInfoHash.end(); for( UNITREGENINFO_HASH_ITR it = rUnitInfoHash.begin(); it != itend ; ++it ) { UnitRegenInfo *pUnitRegenInfo = it->second; if( pUnitRegenInfo->GetSectorIndex() == dwSectorIndex ) { SpawnAll( *it ); } } // ÀÌ ¼½ÅÍÀÇ ¸®Á¨À» ¿Ï·áÇßÀ½À» ÀúÀåÇÑ´Ù. m_setRegenSector.insert( dwSectorIndex ); } // ¸®Á¨ ½ÃÀÛ void UnitRegenManager::AddOnWaiting( REGENID id, DWORD SomeRegenTime ) { UnitRegenInfo * pUnitRegenInfo = GetUnitRegenInfoManager()->FindUnit(id); if( !pUnitRegenInfo ) { SUNLOG( eCRITICAL_LOG, "["__FUNCTION__"] Can't Find RegenID %d", id ); return; } if (pUnitRegenInfo->IsRegenTypeTrigger() == true) return; UnitRegen * pUnit = UnitRegen::ALLOC(); pUnit->Init( pUnitRegenInfo ); if( 0 != SomeRegenTime ) pUnit->SetRegenTime( SomeRegenTime ); //ASSERT( NULL == Find(pUnitRegenInfo->GetID()) ); //Áߺ¹°Ë»ç if( NULL != Find(pUnitRegenInfo->GetID()) ) { SUNLOG( eCRITICAL_LOG, "["__FUNCTION__"] Find pUnitRegenInfo->GetID() %d", id ); } Insert( pUnitRegenInfo->GetID(), pUnit ); }