#include "stdafx.h" #include "CoolTimeManager.h" #include "Icon.h" #include "QuickManager.h" #include "Application.h" cCoolTimeManager* cCoolTimeManager::mSingleton = 0; cCoolTimeManager::cCoolTimeManager() : mGroupMap( 128 ) { assert( mSingleton == 0 && "bad singleton!" ); mSingleton = this; } cCoolTimeManager::~cCoolTimeManager() { Clear(); /// ±×·ì µ¥ÀÌÅÍ »èÁ¦ { cGroupMap::cIterator i = mGroupMap.Begin(); cGroupMap::cIterator end = mGroupMap.End(); for( ; i != end; ++i ) { sGroupData* p = (sGroupData*)(i->mSecond); if( p ) p->mIndexArr.Clear(); SAFE_DELETE(p); } mGroupMap.Clear(); } /// ¾ÆÀÌÅÛ ÄðŸÀÓ Á¤º¸ ¸Ê »èÁ¦ { cCoolTimeMap::cIterator b = mCoolTimeMap.Begin(); cCoolTimeMap::cIterator end = mCoolTimeMap.End(); for( ; b != end; ++b ) { sCoolTime* data = (sCoolTime*)(b->mSecond); SAFE_DELETE( data ); } mCoolTimeMap.Clear(); } /// ÄðŸÀÓ ÇÁ·Î¼¼½º Á¤º¸ »èÁ¦ { cProcessMap::cIterator b = mProcessMap.Begin(); cProcessMap::cIterator end = mProcessMap.End(); for( ; b != end; ++b ) { sCoolTime* data = (sCoolTime*)(b->mSecond); SAFE_DELETE( data ); } mProcessMap.Clear(); } } void cCoolTimeManager::Clear() { /// ÇÁ·Î¼¼½º ¸Ê Áö¿ì±â cProcessMap::cIterator b = mProcessMap.Begin(); cProcessMap::cIterator end = mProcessMap.End(); for( ; b != end; ++b ) { sCoolTime* data = (sCoolTime*)(b->mSecond); SAFE_DELETE( data ); } mProcessMap.Clear(); } /// ÄðŸÀÓ ÇÁ·Î¼¼½º¿¡ Ãß°¡ bool cCoolTimeManager::AddProcessCool( unsigned long itemIndex, long restTime, long totalTime ) { sCoolTime* data = new sCoolTime; data->startTime = THEAPP->GetWorldAccumTime(); data->restTime = restTime; data->totalTime = totalTime; if( mProcessMap.Insert( itemIndex, data ) == false ) { assert( 0 && "failed to add cooltime" ); SAFE_DELETE( data ); return false; } return true; } /// °¢ ¾ÆÀÌÅÛÀÇ ÄðŸÀÓ Á¤º¸¸¦ ÀúÀåÇÑ´Ù void cCoolTimeManager::LoadData( unsigned long itemIndex, unsigned int groupnum, long cooltime ) { sCoolTime* coolData = new sCoolTime; coolData->groupNum = groupnum; coolData->startTime = 0; coolData->restTime = cooltime; coolData->totalTime = cooltime; /// µ¥ÀÌÅÍ ÀúÀå if( mCoolTimeMap.Insert( itemIndex, coolData ) == false ) { assert( 0 && "failed to add cooltime data" ); return; } /// ±×·ì°ü·Ã µ¥ÀÌÅÍ ÀúÀå if( groupnum > 0 ) { sGroupData* data = (sGroupData*)mGroupMap.GetAt( groupnum ); if( data ) { data->mIndexArr.PushBack( itemIndex ); } else { sGroupData* p = new sGroupData; p->mIndexArr.PushBack( itemIndex ); if( mGroupMap.Insert( groupnum, p ) == false ) { assert(0); return; } } } } /// ¾ÆÀÌÅÛ »ç¿ë void cCoolTimeManager::StartCoolTime( unsigned long itemIndex ) { /// »ç¿ëµÈ ¾ÆÀÌÅÛÀÌ¿À¸é, ÄðŸÀÓ¿¡¼­ ã¾Æ¼­ ÇÁ·Î¼¼½º¿¡ ³Ö´Â´Ù. /// ±×·ìÀÌ¸é ±×·ìÀ» ¸ðµÎ ¿Ã¸°´Ù sCoolTime* coolData = GetCoolData( itemIndex ); if( !coolData ) return; /// if( coolData->groupNum == 0 ) { /// ÄðŸÀÓ ÇÁ·Î¼¼½º¿¡ Ãß°¡ AddProcessCool( itemIndex, coolData->restTime, coolData->totalTime ); /// UI ¿¡ ¼¼ÆÃ ITEMMAN->StartCoolTime( itemIndex, coolData->totalTime ); } /// ±×·ìÄðŸÀÓ µ¹¸®±â else { /// ±×·ì ¸®½ºÆ® »Ì±â sGroupData* group = (sGroupData*)mGroupMap.GetAt( coolData->groupNum ); if( !group ) { assert(0); return; } /// ±×·ì ÄðŸÀÓ ¼¼ÆÃ for( unsigned int i = 0; i < group->mIndexArr.GetSize(); ++i ) { unsigned long groupItem = (unsigned long)group->mIndexArr[i]; sCoolTime* groupData = GetCoolData( groupItem ); if( !groupData ) continue; /// ±×·ì ¾ÆÀÌÅÛÀÌ ÄðŸÀÓÁßÀÌ ¾Æ´Ô. sCoolTime* processData = GetProcessData( groupItem ); if( processData == 0 ) { /// ÀÚ±â ÄðŸÀÓ < ÀÔ·ÂµÈ ±×·ì ÄðŸÀÓ À̸é, ÀÚ±âÄðŸÀÓÀ¸·Î ¼¼ÆÃ if( groupData->totalTime <= coolData->totalTime ) { AddProcessCool( groupItem, groupData->restTime, groupData->totalTime ); ITEMMAN->StartCoolTime( groupItem, groupData->totalTime ); } /// ÀÚ±â ÄðŸÀÓ > ÀÔ·ÂµÈ ±×·ì ÄðŸÀÓ À̸é, ±×·ì ÄðŸÀÓÀ¸·Î ¼¼ÆÃ else { AddProcessCool( groupItem, coolData->restTime, coolData->totalTime ); ITEMMAN->StartCoolTime( groupItem, coolData->totalTime ); } } /// ±×·ì ¾ÆÀÌÅÛÀÌ ÄðŸÀÓ ÁßÀÓ. else { /// Àڱ⠳²Àº ÄðŸÀÓ > ÀÔ·ÂµÈ ±×·ìÄðŸÀÓ À̸é, ¹«½Ã /// Àڱ⠳²Àº ÄðŸÀÓ < ÀÔ·ÂµÈ ±×·ìÄðŸÀÓ À̸é, ÀÔ·ÂµÈ ÄðŸÀÓÀ¸·Î Àç ¼¼ÆÃ long elasedTime = THEAPP->GetWorldAccumTime() - processData->startTime; long restTime = processData->totalTime - elasedTime; /// ÀÔ·ÂµÈ ÄðŸÀÓ°ú Àڱ⠿ø·¡ ÃÑ ÄðŸÀÓµµ ºñ±³ÇÑ´Ù long totalTime = ( groupData->totalTime < coolData->totalTime ) ? groupData->totalTime : coolData->totalTime; if( restTime < totalTime ) { /// ´Ù½Ã¼¼ÆÃ processData->startTime = THEAPP->GetWorldAccumTime(); processData->totalTime = totalTime; ITEMMAN->EndCoolTime( groupItem ); ITEMMAN->StartCoolTime( groupItem, processData->totalTime ); } } } } } /// ¾ÆÀÌÅÛÀÌ Áß°£»ðÀÔ µÉ¶§ ¼¼ÆÃ void cCoolTimeManager::CopyCoolTime( unsigned long itemIndex ) { /// ½ÇÁ¦·Î Á¸ÀçÇÏ´Â µ¥ÀÌÅÍÀÎÁö °Ë»ç sCoolTime* coolData = GetCoolData( itemIndex ); if( coolData ) { /// ÇØ´ç ¾ÆÀÌÅÛÀÌ ÇÁ·Î¼¼½º ÁßÀ̶ó¸é ÄðŸÀÓ º¹»ç sCoolTime* processData = GetProcessData( itemIndex ); if( processData ) ITEMMAN->CopyCoolTime( itemIndex, processData->startTime, processData->restTime, processData->totalTime ); } } /// void cCoolTimeManager::Process( unsigned long accumTime ) { /// ÇÁ·Î¼¼½º ÇÒ ÄðŸÀÓÀÌ ¾øÀ¸¸é ¸®ÅÏ if( mProcessMap.GetSize() == 0 ) return; cProcessMap::cIterator i = mProcessMap.Begin(); cProcessMap::cIterator end = mProcessMap.End(); for( ; i != end; ) { sCoolTime* data = (sCoolTime*)(i->mSecond); unsigned long key = (unsigned long)(i->mFirst); if( !data ) continue; ++i; long elasedTime = accumTime - data->startTime; if( elasedTime > data->restTime ) { /// ÄðŸÀÓÀÌ ³¡³µÀ¸¸é ÇÁ·Î¼¼½º ¸ÊÀ¸·ÎºÎÅÍ »èÁ¦ mProcessMap.Erase( key ); SAFE_DELETE( data ); } } } /// ¼­¹ö·ÎºÎÅÍ ³²Àº ÄðŸÀÓ Á¤º¸ ÀúÀå void cCoolTimeManager::NetSetCool( sInventoryCooltime& cool ) { /// ³²Àº ½Ã°£À» ´Ù½Ã ¼¼ÆÃ AddProcessCool( cool.ItemIndex, cool.cooltime, cool.cooltime1 ); } /// sCoolTime* cCoolTimeManager::GetCoolData( unsigned long itemIndex ) { return (sCoolTime*)mCoolTimeMap.GetAt( itemIndex ); } /// ÇöÀç ÇÁ·Î¼¼½ºÁßÀÎ ÄðŸÀÓ µ¥ÀÌÆ® ȹµæ sCoolTime* cCoolTimeManager::GetProcessData( unsigned long itemIndex ) { return (sCoolTime*)mProcessMap.GetAt( itemIndex ); }