#include "StdAfx.h" #include "QuestSimpleWindow.h" #include "PlaneObject.h" #include "QuestManager.h" #include "GameResourceManager.h" #include "ItemManager.h" #include "FontAgent.h" #include "GameUIManager.h" #include "ObjectManager.h" #include "Hero.h" #include "PVPManager.h" #include "TriggerManager.h" cQuestSimpleWindow::cQuestSimpleWindow() : mpHighImage(0) , mpLowImage(0) , mHighCheckPos(0, 0) , mHighNoCheckPos(0, 0) , mLowCheckPos(0, 0) , mImageSize(0, 0) , mInitWidth(0) , mInitX(0) , mpSelectImage(0) , mShowSelect( false ) , mpOnSkin(0) , mpOnImage(0) , mShowOn(false) { memset( mpBackImage, 0, sizeof(mpBackImage) ); memset( mpBackSkin, 0, sizeof(mpBackSkin) ); } cQuestSimpleWindow::~cQuestSimpleWindow() { for( int i = 0; i < eBACKIMAGE_MAX; ++i ) SAFE_DELETE( mpBackImage[i] ); SAFE_DELETE( mpOnImage ); SAFE_DELETE( mpSelectImage ); SAFE_DELETE( mpLowImage ); SAFE_DELETE( mpHighImage ); Clear(); } void cQuestSimpleWindow::Clear() { /// Ŭ¸®¾î typedef tPointerList cProgressList; cQuestMap::cIterator i = mQuestMap.Begin(); cQuestMap::cIterator end = mQuestMap.End(); for( ; i != end; ++i ) { sQuestHaveData* data = (sQuestHaveData*)(i->mSecond); if( data ) { cProgressList::cIterator b = data->mQuestProgressList.Begin(); cProgressList::cIterator bend = data->mQuestProgressList.End(); for( ; b != bend; ++b ) { sQuestProgress* progress = (sQuestProgress*)(*b); SAFE_DELETE( progress ); } data->mQuestProgressList.Clear(); } SAFE_DELETE( data ); } mQuestMap.Clear(); mShowSelect = false; } void cQuestSimpleWindow::Open() { } void cQuestSimpleWindow::Close() { cUIWindow::Close(); Clear(); } void cQuestSimpleWindow::Show( bool onsound ) { if( PVPMAN->IsEnableBattle() == true ) return; cUIWindow::Show( onsound ); } void cQuestSimpleWindow::UpdateSkin() { cUIWindow::UpdateSkin(); int x = GetScreenWidth() - GetAbsoluteRect().GetWidth() - mInitX; int y = GetAbsoluteRect().mTop; SetRelativePos( cUIPos(x, y) ); UpdateSize(); } bool cQuestSimpleWindow::OnCreate( cUINodeProperty* pproperty ) { if( cUIWindow::OnCreate( pproperty ) == false ) return false; /// ´Ù¸¥À©µµ¿ì¿Í ½º³À Àû¿ë ¾ÈÇϵµ·Ï ÇÔ SetExceptSnap( true ); /// À̹ÌÁö »ý¼º cUISkin* pSkin = UIMAN->GetSkin(); if( !pSkin ) { assert(0); return false; } cUINodeSkin* pHighSkin = pSkin->GetNodeSkin( "Quest_FolderHigh" ); cUINodeSkin* pHighNoSkin = pSkin->GetNodeSkin( "Quest_FolderHighNoCheck" ); if( pHighSkin && pHighNoSkin ) { mpHighImage = new cUIImage( pHighSkin->mpTexture ); mHighNoCheckPos.mX = pHighSkin->mSkinInfo->mTexX; mHighNoCheckPos.mY = pHighSkin->mSkinInfo->mTexY; unsigned int w = pHighSkin->mSkinInfo->mWidth; unsigned int h = pHighSkin->mSkinInfo->mHeight; unsigned int x = pHighSkin->mSkinInfo->mX; unsigned int y = pHighSkin->mSkinInfo->mY; mpHighImage->SetTextureRect( mHighCheckPos.mX, mHighCheckPos.mY, mHighCheckPos.mX + w, mHighCheckPos.mY + h ); mpHighImage->SetScreenRect( cUIRect( x, y, x + w, y + h ) ); mHighCheckPos.mX = pHighNoSkin->mSkinInfo->mTexX; mHighCheckPos.mY = pHighNoSkin->mSkinInfo->mTexY; mImageSize.mWidth = w; mImageSize.mHeight = h; } cUINodeSkin* pLowSkin = pSkin->GetNodeSkin( "Quest_FolderLow" ); if( pLowSkin ) { mpLowImage = new cUIImage( pLowSkin->mpTexture ); mLowCheckPos.mX = pLowSkin->mSkinInfo->mTexX; mLowCheckPos.mY = pLowSkin->mSkinInfo->mTexY; unsigned int w = pLowSkin->mSkinInfo->mWidth; unsigned int h = pLowSkin->mSkinInfo->mHeight; unsigned int x = pLowSkin->mSkinInfo->mX; unsigned int y = pLowSkin->mSkinInfo->mY; mpLowImage->SetTextureRect( mLowCheckPos.mX, mLowCheckPos.mY, mLowCheckPos.mX + w, mLowCheckPos.mY + h ); mpLowImage->SetScreenRect( cUIRect( x, y, x + w, y + h ) ); } // ¼±Åà À̹ÌÁö cUINodeSkin* selectSkin = pSkin->GetNodeSkin( "QuestSimple_Select" ); if( selectSkin && selectSkin->mpTexture ) { mpSelectImage = new cPlaneObject; /// ÅØ½ºÃ³ ¿µ¿ª ¼³Á¤ unsigned short tx = (unsigned short)selectSkin->mSkinInfo->mTexX; unsigned short ty = (unsigned short)selectSkin->mSkinInfo->mTexY; unsigned short tw = (unsigned short)selectSkin->mSkinInfo->mTexWidth; unsigned short th = (unsigned short)selectSkin->mSkinInfo->mTexHeight; unsigned int x = GetAbsoluteRect().mLeft; unsigned int y = GetAbsoluteRect().mTop; if( mpSelectImage->Create( selectSkin->mpTexture, x, y, tw, th, tx, ty, tx + tw, ty + th ) == false ) { assert( 0 && "failed to create select image"); return false; } } // ÃßÀû À̹ÌÁö mpOnSkin = pSkin->GetNodeSkin( "Quest_ChaseOn" ); if( mpOnSkin && mpOnSkin->mpTexture ) { mpOnImage = new cPlaneObject; unsigned short tx = (unsigned short)mpOnSkin->mSkinInfo->mTexX; unsigned short ty = (unsigned short)mpOnSkin->mSkinInfo->mTexY; unsigned short tw = (unsigned short)mpOnSkin->mSkinInfo->mTexWidth; unsigned short th = (unsigned short)mpOnSkin->mSkinInfo->mTexHeight; unsigned int x = GetAbsoluteRect().mLeft + GetAbsoluteRect().GetWidth() - tw; unsigned int y = GetAbsoluteRect().mTop; if( mpOnImage->Create( mpOnSkin->mpTexture, x, y, tw, th, tx, ty, tx + tw, ty + th ) == false ) { assert( 0 && "failed to create mpOnSkin image"); return false; } } /// ¹è°æ À̹ÌÁö »ý¼º mpBackSkin[eBACKIMAGE_TOP] = pSkin->GetNodeSkin( "QuestSimple_Top" ); mpBackSkin[eBACKIMAGE_BOTTOM] = pSkin->GetNodeSkin( "QuestSimple_Bottom" ); mpBackSkin[eBACKIMAGE_CENTER] = pSkin->GetNodeSkin( "QuestSimple_Back" ); mpBackSkin[eBACKIMAGE_LEFT] = pSkin->GetNodeSkin( "QuestSimple_Left" ); mpBackSkin[eBACKIMAGE_RIGHT] = pSkin->GetNodeSkin( "QuestSimple_Right" ); for( int i = 0; i < eBACKIMAGE_MAX; ++i ) { if( mpBackSkin[i] && mpBackSkin[i]->mpTexture ) { /// ÅØ½ºÃ³ ¿µ¿ª ¼³Á¤ unsigned short tx = (unsigned short)mpBackSkin[i]->mSkinInfo->mTexX; unsigned short ty = (unsigned short)mpBackSkin[i]->mSkinInfo->mTexY; unsigned short tw = (unsigned short)mpBackSkin[i]->mSkinInfo->mTexWidth; unsigned short th = (unsigned short)mpBackSkin[i]->mSkinInfo->mTexHeight; unsigned int x = GetAbsoluteRect().mLeft; unsigned int y = GetAbsoluteRect().mTop; mpBackImage[i] = new cPlaneObject; if( mpBackImage[i]->Create( mpBackSkin[i]->mpTexture, x, y, x+1, y+1, tx, ty, tx + tw, ty + th ) == false ) { assert( 0 && "failed to create back image"); return false; } } } mInitWidth = mAbsoluteRect.GetWidth(); cUINodeSkin* winSkin = pSkin->GetNodeSkin( mSkinName ); if( winSkin ) mInitX = winSkin->mSkinInfo->mX; int x = GetScreenWidth() - GetAbsoluteRect().GetWidth() - mInitX; int y = GetAbsoluteRect().mTop; SetRelativePos( cUIPos(x, y) ); return true; } void cQuestSimpleWindow::UpdateRect() { cUIWindow::UpdateRect(); if( mQuestMap.GetSize() > 0 ) { /// À©µµ¿ì »çÀÌÁî ¼³Á¤ int x = GetAbsoluteRect().mLeft; int y = GetAbsoluteRect().mTop; /// À̹ÌÁö ¼³Á¤ if( mpBackImage[eBACKIMAGE_TOP] ) { //int skinHeight = mpBackSkin[eBACKIMAGE_TOP]->mSkinInfo->mHeight; mpBackImage[eBACKIMAGE_TOP]->SetScreenXY( x, y ); } if( mpBackImage[eBACKIMAGE_CENTER] ) { mpBackImage[eBACKIMAGE_CENTER]->SetScreenXY( x + START_GAPX, y + START_GAPY ); } if( mpBackImage[eBACKIMAGE_BOTTOM] ) { int backHeight = GetAbsoluteRect().GetHeight() - ( 2 * START_GAPY ); mpBackImage[eBACKIMAGE_BOTTOM]->SetScreenXY( x, y + backHeight + START_GAPY ); } if( mpBackImage[eBACKIMAGE_LEFT] ) { mpBackImage[eBACKIMAGE_LEFT]->SetScreenXY( x, y + START_GAPY ); } if( mpBackImage[eBACKIMAGE_RIGHT] ) { mpBackImage[eBACKIMAGE_RIGHT]->SetScreenXY( x + START_GAPX + mInitWidth, y + START_GAPY ); } } // ¼±ÅÃÀ̹ÌÁö À§Ä¡ °»½Å UpdateSelect(); } void cQuestSimpleWindow::OnRender( cUIFontItemKeeper* pKeeper ) { if( mVisible == false ) return; /// µ¥ÀÌÅÍ Ãâ·Â if( mQuestMap.GetSize() == 0 ) return; /// À̹ÌÁö ·»´õ¸µ for( int i = 0; i < eBACKIMAGE_MAX; ++i ) { if( mpBackImage[i] ) mpBackImage[i]->Draw(); } /// ¼±Åà À̹ÌÁö if( mpSelectImage && mShowSelect ) mpSelectImage->Draw(); // ÃßÀûÀ̹ÌÁö if( mpOnImage && mShowOn ) mpOnImage->Draw(); int textposX = GetAbsoluteRect().mLeft + START_GAPX; int textPosY = GetAbsoluteRect().mTop + START_GAPY; int rowHeight = FONTAGENT->GetTextHeight( cFontAgent::eFont_UI ); typedef tPointerList cProgressList; /// Ãâ·Â cQuestMap::cIterator b = mQuestMap.Begin(); cQuestMap::cIterator end = mQuestMap.End(); for( ; b != end; ++b ) { sQuestHaveData* data = (sQuestHaveData*)(b->mSecond); if( !data ) { assert(0); return; } int addX = 0; if( data->mCloseImage ) { /// À̹ÌÁö ÅØ½ºÃÄ ÁÂÇ¥ ¼¼ÆÃ cUIPos texPos = ( data->mClose == false ) ? mHighCheckPos : mHighNoCheckPos; data->mCloseImage->SetTextureRect( cUIRect( texPos.mX, texPos.mY,texPos.mX + data->mCloseImage->GetWidth(), texPos.mY + data->mCloseImage->GetHeight() ) ); data->mCloseImage->SetPos( textposX, textPosY ); data->mCloseImage->Draw(); addX = (data->mCloseImage->GetWidth() + 2); } /// ÇöÀç °¡Áø°¹¼ö / ÃÑ °¹¼ö Ãâ·Â int have = data->mQuestProgressList.GetSize(); TCHAR temp[128] = {0,}; ::_stprintf_s( temp, GAMERESOURCEMAN->GetGameText(446), (LPTSTR)data->mMapName.Cstr(), have, data->mTotalCount ); /// ¸Ê À̸§ Ãâ·Â pKeeper->AddFontItem( cFontAgent::eFont_UI, temp, textposX + addX, textPosY, COLOR_YELLOW ); textPosY += rowHeight; /// ÆîÃÄÁ® ÀÖÀ¸¸é Äù½ºÆ® ¸®½ºÆ® Ãâ·Â if( data->mClose == false ) { addX = 0; cProgressList::cIterator b = data->mQuestProgressList.Begin(); cProgressList::cIterator bend = data->mQuestProgressList.End(); for( ; b != bend; ++b ) { sQuestProgress* progress = (sQuestProgress*)(*b); if( !progress ) { assert(0); return; } /// üũ ¾ÈµÇÀÖÀ¸¸é ¸®½ºÆ®¿¡ Ãâ·Â ÀÚü¸¦ ¾ÈÇÔ if( progress->mCloseImage ) { /// À̹ÌÁö ÅØ½ºÃÄ ÁÂÇ¥ ¼¼ÆÃ cUIPos texPos = mLowCheckPos; progress->mCloseImage->SetTextureRect( cUIRect( texPos.mX, texPos.mY,texPos.mX + progress->mCloseImage->GetWidth(), texPos.mY + progress->mCloseImage->GetHeight() ) ); progress->mCloseImage->SetPos( textposX, textPosY ); progress->mCloseImage->Draw(); addX = (progress->mCloseImage->GetWidth() + 2); } /// ¿Ï·á üũ cStringT questName; unsigned long questColor = COLOR_GREEN; questName = progress->mQuestName; // cQuestDefine *questDefine = progress->mDefine; /// ¹Ýº¹ // if( questDefine && questDefine->mRepeatType == eQUEST_REPEAT ) // questName.Append( GAMERESOURCEMAN->GetGameText( 472 ) ); /// Àú ·¹º§ Äù½ºÆ® short lowLevel = TRIGGERMAN->GetLowLevel( progress->mIndex ); if( lowLevel != 0 && lowLevel <= (HERO->GetLevel() - LOW_LEVEL_QUEST_GAP ) ) { questName.Append( GAMERESOURCEMAN->GetGameText( 476 ) ); questColor = COLOR_LOW_LEVEL_QUEST; } /// Äù½ºÆ® À̸§ Ãâ·Â pKeeper->AddFontItem( cFontAgent::eFont_UI, (LPTSTR)questName.Cstr(), textposX + addX, textPosY, questColor ); textPosY += rowHeight; /// Äù½ºÆ® Àǹ«Á¶°ÇÃâ·Â if( progress->mDefine ) { /// 1. ½Ã°£ Á¦ÇÑ Ãâ·Â cQuestDefine* define = progress->mDefine; cQuestLimit* limit = define->mQuestLimit; if( limit && limit->mTime > 0 ) { long restTime = QUESTMAN->GetQuestRestTime( progress->mIndex ); int time = (int)(restTime*0.001); if( time >= 0 ) { int h = time / 3600; int m = time / 60; int s = time % 60; cStringT th,tm,ts; if( h != 0 ) th.Format( GAMERESOURCEMAN->GetGameText( 70 ), h ); if( m != 0 ) tm.Format( GAMERESOURCEMAN->GetGameText( 71 ), m ); ts.Format( GAMERESOURCEMAN->GetGameText( 72 ), s ); th = (th+tm+ts); cStringT timeStr; timeStr.Format( GAMERESOURCEMAN->GetGameText( 471 ), (LPCTSTR)th.Cstr() ); pKeeper->AddFontItem( cFontAgent::eFont_UI, (LPCTSTR)timeStr.Cstr(), textposX + addX, textPosY, COLOR_ORANGE ); textPosY += rowHeight; } } /// 2. Àǹ«Á¶°Ç »ó¼¼ Ç¥Çö cQuestDuty* duty = define->mQuestDuty; if( duty ) { cStringT str; __int64 end = 0xFF; __int64 check = *progress->mCheck; /// ÂüÁ¶ for( unsigned int i = 0; i < MAX_DUTY; ++i ) { eDutyType type = duty->mDuty[i].dutyType; unsigned long targetIdx = duty->mDuty[i].targetIdx; unsigned int count = duty->mDuty[i].count; unsigned long skillIndex = duty->mDuty[i].skillIndex; if( type == eDUTY_NONE ) break; /// Á¤º¸ Ãâ·Â switch( type ) { case eDUTY_HUNT: /// »ç³É { LPCTSTR monName = GAMERESOURCEMAN->GetMonsterName( targetIdx ); str.Format( GAMERESOURCEMAN->GetGameText( 451 ), monName, count ); /// ¿Ï·á if( (check & end) == (define->mComplete & end) ) str.Append( GAMERESOURCEMAN->GetGameText( 445 ) ); /// ÁøÇàÁß else { __int64 cnt = check & end; for( unsigned int b = 0; b < i; ++b) cnt = cnt >> 8; cStringT str1; str1.Format( GAMERESOURCEMAN->GetGameText( 459 ), (unsigned int)cnt, count ); str += str1; } pKeeper->AddFontItem( cFontAgent::eFont_UI, (LPCTSTR)str.Cstr(), textposX + addX, textPosY, mDefaultColor ); textPosY += rowHeight; } break; case eDUTY_COLLECT: /// ¼öÁý { LPCTSTR itemName = ITEMMAN->GetItemName( targetIdx ); str.Format( GAMERESOURCEMAN->GetGameText( 453 ), itemName, count ); /// ¿Ï·á if( (check & end) == (define->mComplete & end) ) str.Append( GAMERESOURCEMAN->GetGameText( 445 ) ); /// ÁøÇàÁß else { __int64 cnt = check & end; for( unsigned int b = 0; b < i; ++b) cnt = cnt >> 8; cStringT str1; str1.Format( GAMERESOURCEMAN->GetGameText( 459 ), (unsigned int)cnt, count ); str += str1; } pKeeper->AddFontItem( cFontAgent::eFont_UI, (LPCTSTR)str.Cstr(), textposX + addX, textPosY, mDefaultColor ); textPosY += rowHeight; } break; case eDUTY_MEET: /// npc ¸¸³ª±â { LPCTSTR npcName = GAMERESOURCEMAN->GetNpcName( targetIdx ); str.Format( GAMERESOURCEMAN->GetGameText( 455 ), npcName ); /// ¿Ï·á if( (check & end) == (define->mComplete & end) ) str.Append( GAMERESOURCEMAN->GetGameText( 445 ) ); pKeeper->AddFontItem( cFontAgent::eFont_UI, (LPCTSTR)str.Cstr(), textposX + addX, textPosY, mDefaultColor ); textPosY += rowHeight; } break; case eDUTY_ACTIVESKILL: // ½ºÅ³¹ßµ¿ { LPCTSTR skillName = GAMERESOURCEMAN->GetSkillNameText( skillIndex ); LPCTSTR monName = GAMERESOURCEMAN->GetMonsterName( targetIdx ); str.Format( GAMERESOURCEMAN->GetGameText( 456 ), skillName, monName ); /// ¿Ï·á if( (check & end) == (define->mComplete & end) ) str.Append( GAMERESOURCEMAN->GetGameText( 445 ) ); pKeeper->AddFontItem( cFontAgent::eFont_UI, (LPCTSTR)str.Cstr(), textposX + addX, textPosY, mDefaultColor ); textPosY += rowHeight; } break; case eDUTY_ENHANCE: // ½ºÅ³¹ßµ¿ { str.Format( GAMERESOURCEMAN->GetGameText( 457 ) ); /// ¿Ï·á if( (check & end) == (define->mComplete & end) ) str.Append( GAMERESOURCEMAN->GetGameText( 445 ) ); pKeeper->AddFontItem( cFontAgent::eFont_UI, (LPCTSTR)str.Cstr(), textposX + addX, textPosY, mDefaultColor ); textPosY += rowHeight; } break; case eDUTY_PUTCARD: // ½ºÅ³¹ßµ¿ { str.Format( GAMERESOURCEMAN->GetGameText( 458 ) ); /// ¿Ï·á if( (check & end) == (define->mComplete & end) ) str.Append( GAMERESOURCEMAN->GetGameText( 445 ) ); pKeeper->AddFontItem( cFontAgent::eFont_UI, (LPCTSTR)str.Cstr(), textposX + addX, textPosY, mDefaultColor ); textPosY += rowHeight; } break; case eDUTY_PVPJOIN: case eDUTY_PVPWIN: case eDUTY_PVPLOSE: { unsigned int pvpIndex = 0; switch( targetIdx ) { case MAP_DEATHMATCH: pvpIndex = 859; break; case MAP_FLAG: pvpIndex = 860; break; } unsigned int textIndex = 0; switch( type ) { case eDUTY_PVPJOIN: textIndex = 465; break; case eDUTY_PVPWIN: textIndex = 466; break; case eDUTY_PVPLOSE: textIndex = 467; break; } str.Format( GAMERESOURCEMAN->GetGameText( textIndex ), GAMERESOURCEMAN->GetGameText( pvpIndex ), count ); /// ¿Ï·á if( (check & end) == (define->mComplete & end) ) str.Append( GAMERESOURCEMAN->GetGameText( 445 ) ); /// ÁøÇàÁß else { __int64 cnt = check & end; for( unsigned int b = 0; b < i; ++b) cnt = cnt >> 8; cStringT str1; str1.Format( GAMERESOURCEMAN->GetGameText( 459 ), (unsigned int)cnt, count ); str += str1; } pKeeper->AddFontItem( cFontAgent::eFont_UI, (LPCTSTR)str.Cstr(), textposX + addX, textPosY, mDefaultColor ); textPosY += rowHeight; } break; } /// ¿Ï·á üũ¿ë end = end << 8; } } /// »ó¼¼Ç¥Çö ¿Ï·á }/// Àǹ«Á¶°Ç Ç¥Çö ¿Ï·á } } } /// pKeeper->DrawAll(); } void cQuestSimpleWindow::OnLButtonDoubleClick( const cUIPos& pos ) { OnLButtonDown( pos, false, false, false ); } void cQuestSimpleWindow::OnLButtonDown( const cUIPos& pos, bool ctrl, bool alt, bool ) { cUIWindow::OnLButtonDown( pos, ctrl, alt, false ); /// À̹ÌÁö ¿µ¿ª üũ if( pos.mY < GetAbsoluteRect().mTop + START_GAPY ) return; int leftX = GetAbsoluteRect().mLeft + START_GAPX; int rightX = GetAbsoluteRect().mLeft + START_GAPX + mImageSize.mWidth; int rowHeight = FONTAGENT->GetTextHeight( cFontAgent::eFont_UI ); unsigned int selectRow = (pos.mY - (GetAbsoluteRect().mTop + START_GAPY) ) / rowHeight; unsigned int row = 0; /// ¼±ÅÃµÈ À̹ÌÁö ã±â typedef tPointerList cProgressList; cQuestMap::cIterator i = mQuestMap.Begin(); cQuestMap::cIterator end = mQuestMap.End(); for( ; i != end; ++i ) { sQuestHaveData* data = (sQuestHaveData*)(i->mSecond); if( !data ) { assert(0); return; } /// ¼±ÅÃµÈ À̹ÌÁö if( selectRow == row && data->mCloseImage ) { data->mClose = !data->mClose; /// ¸Ê ¶óÀÎÀº ´ÝÈ÷°Å³ª ¿­¸®´Ï±î Àç°è»êÇϰí, /// Àǹ«Á¶°Ç ¶óÀÎÀº ´ÝÈ÷¸é ¹«Á¶°Ç »èÁ¦¹Ç·Î Àç°è»ê ¾ÈÇÑ´Ù UpdateSize(); return; } row++; /// ÆîÃÄÁ® ÀÖÀ» °æ¿ì if( data->mClose == false ) { cProgressList::cIterator b = data->mQuestProgressList.Begin(); cProgressList::cIterator bend = data->mQuestProgressList.End(); for( ; b != bend; ++b ) { sQuestProgress* progress = (sQuestProgress*)(*b); if( !progress ) { assert(0); return; } /// ¼±ÅÃµÈ À̹ÌÁö ÀÎÁö °Ë»ç if( selectRow == row && progress->mCloseImage ) { // üũ À̹ÌÁö ¿µ¿ª¾È¿¡ ÀÖÀ¸¸é ¹ß»ý if( pos.mX >= leftX && pos.mX <= rightX ) { QUESTMAN->DeleteQuestSelect( progress->mIndex, true ); } else { QUESTMAN->UpdateChaseQuest( progress->mIndex ); } return; } row++; /// Àǹ«Á¶°Ç °¹¼ö Ãß°¡ cQuestDefine* define = progress->mDefine; cQuestDuty* duty = define->mQuestDuty; cQuestLimit* limit = define->mQuestLimit; if( limit && limit->mTime > 0 ) { if( selectRow == row ) { QUESTMAN->UpdateChaseQuest( progress->mIndex ); return; } row++; } if( duty ) { for( unsigned int i = 0; i < MAX_DUTY; ++i ) { eDutyType type = duty->mDuty[i].dutyType; if( type != eDUTY_NONE ) { if( selectRow == row ) { QUESTMAN->UpdateChaseQuest( progress->mIndex ); return; } row++; } } } } } } } /// Äù½ºÆ®Á¤º¸ »ðÀÔ void cQuestSimpleWindow::AddQuestInfo( unsigned long questIndex, __int64* check ) { cQuestDefine* define = QUESTMAN->GetQuestDefine( questIndex ); if( !define ) { assert(0); return; } /// µ¥ÀÌÅͰ¡ ¾øÀ¸¸é »õ·Î»ý¼º sQuestHaveData* data = (sQuestHaveData*)mQuestMap.GetAt( define->mTakeMapIndex ); if( !data ) { data = new sQuestHaveData; data->mMapName = GAMERESOURCEMAN->GetMapName( define->mTakeMapIndex ); data->mClose = false; data->mCloseImage = mpHighImage; if( mQuestMap.Insert( define->mTakeMapIndex, data ) == false ) { assert(0); SAFE_DELETE( data ); return; } } /// Äù½ºÆ® °¹¼ö °»½Å data->mTotalCount = QUESTMAN->GetCount( define->mTakeMapIndex ); /// »ó¼¼ Á¤º¸ ¼¼ÆÃ sQuestProgress* progress = new sQuestProgress; progress->mIndex = questIndex; progress->mDefine = define; progress->mCheck = check; progress->mCloseImage = mpLowImage; progress->mTime = 0; TCHAR temp[128]={0,}; ::_stprintf_s( temp, _T( "[%d] %s" ), define->mLevel, GAMERESOURCEMAN->GetQuestTitle( define->mTitleIndex ) ); progress->mQuestName = temp; data->mQuestProgressList.PushBack( progress ); /// À©µµ¿ì »çÀÌÁî Àç°è»ê UpdateSize(); /// if( mQuestMap.GetSize() > 0 && mVisible == false ) { cQuestWindow* win = GAMEUI->GetQuestWindow(); if( win && win->IsShowInfo() == true ) { /// npc À©µµ¿ì°¡ º¸ÀÌ¸é ¿ì¼± ¿¹¾à if( HERO->IsOpenNpcTalk() == false ) Show(); else UIMAN->SetRestoreShow( this ); } } //UpdateSelect(); } /// »èÁ¦ void cQuestSimpleWindow::DeleteQuestInfo( unsigned long questIndex ) { cQuestDefine* define = QUESTMAN->GetQuestDefine( questIndex ); if( !define ) { assert(0); return; } /// µ¥ÀÌÅͰ¡ ¾øÀ¸¸é »õ·Î»ý¼º sQuestHaveData* data = (sQuestHaveData*)mQuestMap.GetAt( define->mTakeMapIndex ); if( !data ) { assert(0); return; } typedef tPointerList cProgressList; cProgressList::cIterator b = data->mQuestProgressList.Begin(); cProgressList::cIterator bend = data->mQuestProgressList.End(); for( ; b != bend; ++b ) { sQuestProgress* progress = (sQuestProgress*)(*b); if( progress && progress->mIndex == questIndex ) { SAFE_DELETE( progress ); data->mQuestProgressList.Erase( b ); break; } } /// ÇÏÀ§ µ¥ÀÌÅͰ¡ ³²¾ÆÀÖÁö ¾ÊÀ¸¸é ¸Ê Á¤º¸ »èÁ¦ if( data->mQuestProgressList.GetSize() == 0 ) { SAFE_DELETE(data); mQuestMap.Erase( define->mTakeMapIndex ); } /// À©µµ¿ì »çÀÌÁî Àç°è»ê if( mQuestMap.GetSize() == 0 ) Hide(); else UpdateSize(); // UpdateSelect(); } void cQuestSimpleWindow::UpdateSize() { int totalLine = 0; int rowHeight = FONTAGENT->GetTextHeight( cFontAgent::eFont_UI ); typedef tPointerList cProgressList; /// Ãâ·Â cQuestMap::cIterator i = mQuestMap.Begin(); cQuestMap::cIterator end = mQuestMap.End(); for( ; i != end; ++i ) { sQuestHaveData* data = (sQuestHaveData*)(i->mSecond); if( !data ) { assert(0); return; } /// 1. ¸ÊÀ̸§ Ãâ·Â ¶óÀÎ Ãß°¡ totalLine++; /// ÆîÃÄÁ® ÀÖÀ¸¸é Äù½ºÆ® ¸®½ºÆ® Ãâ·Â if( data->mClose == false ) { cProgressList::cIterator b = data->mQuestProgressList.Begin(); cProgressList::cIterator bend = data->mQuestProgressList.End(); for( ; b != bend; ++b ) { sQuestProgress* progress = (sQuestProgress*)(*b); if( !progress ) { assert(0); return; } /// 1. Äù½ºÆ® À̸§ Ãâ·Â ¶óÀÎ Ãß°¡ totalLine++; /// Äù½ºÆ® Àǹ«Á¶°ÇÃâ·Â if( progress->mDefine ) { /// 1. ½Ã°£ Á¦ÇÑ Ãâ·Â cQuestDefine* define = progress->mDefine; cQuestLimit* limit = define->mQuestLimit; if( limit && limit->mTime > 0 ) { long restTime = QUESTMAN->GetQuestRestTime( progress->mIndex ); int time = (int)(restTime*0.001); if( time >= 0 ) { /// 3. Àǹ«Á¶°Ç - ½Ã°£ Ãâ·Â ¶óÀÎ Ãß°¡ totalLine++; } } cQuestDuty* duty = define->mQuestDuty; if( duty ) { __int64 end = 0xFF; //__int64 check = *progress->mCheck; /// ÂüÁ¶ for( unsigned int i = 0; i < MAX_DUTY; ++i ) { eDutyType type = duty->mDuty[i].dutyType; if( type == eDUTY_NONE ) break; /// 4. Àǹ«Á¶°Ç Ãâ·Â ¶óÀÎ Ãß°¡ switch( type ) { case eDUTY_HUNT: totalLine++; break; case eDUTY_COLLECT: totalLine++; break; case eDUTY_MEET: totalLine++; break; case eDUTY_ACTIVESKILL: totalLine++; break; case eDUTY_ENHANCE: totalLine++; break; case eDUTY_PUTCARD: totalLine++; break; case eDUTY_PVPJOIN: totalLine++; break; case eDUTY_PVPWIN: totalLine++; break; case eDUTY_PVPLOSE: totalLine++; break; } /// ¿Ï·á üũ¿ë end = end << 8; } } } } } } /// À©µµ¿ì »çÀÌÁî ¼³Á¤ int w = mInitWidth + (START_GAPX * 2); int h = totalLine * rowHeight + (START_GAPY * 2); SetRelativeSize( cUISize(w, h) ); int x = GetAbsoluteRect().mLeft; int y = GetAbsoluteRect().mTop; /// À̹ÌÁö ¼³Á¤ if( mpBackImage[eBACKIMAGE_TOP] ) { int skinHeight = mpBackSkin[eBACKIMAGE_TOP]->mSkinInfo->mHeight; mpBackImage[eBACKIMAGE_TOP]->SetScreenRect( x, y, w, skinHeight ); } if( mpBackImage[eBACKIMAGE_CENTER] ) { int backHeight = totalLine * rowHeight; mpBackImage[eBACKIMAGE_CENTER]->SetScreenRect( x + START_GAPX, y + START_GAPY, mInitWidth, backHeight ); } if( mpBackImage[eBACKIMAGE_BOTTOM] ) { int backHeight = totalLine * rowHeight; int skinHeight = mpBackSkin[eBACKIMAGE_BOTTOM]->mSkinInfo->mHeight; mpBackImage[eBACKIMAGE_BOTTOM]->SetScreenRect( x, y + backHeight + START_GAPY, w, skinHeight ); } if( mpBackImage[eBACKIMAGE_LEFT] ) { int backHeight = totalLine * rowHeight; int skinWidth = mpBackSkin[eBACKIMAGE_LEFT]->mSkinInfo->mWidth; mpBackImage[eBACKIMAGE_LEFT]->SetScreenRect( x, y + START_GAPY, skinWidth, backHeight ); } if( mpBackImage[eBACKIMAGE_RIGHT] ) { int backHeight = totalLine * rowHeight; int skinWidth = mpBackSkin[eBACKIMAGE_RIGHT]->mSkinInfo->mWidth; mpBackImage[eBACKIMAGE_RIGHT]->SetScreenRect( x + START_GAPX + mInitWidth, y + START_GAPY, skinWidth, backHeight ); } /// Àüü ĸ¼Ç ÁöÁ¤ mCaptionRect.Set( 0, 0, w, h ); } void cQuestSimpleWindow::UpdateSelect() { unsigned long questIndex = QUESTMAN->GetChangeQuestIndex(); if( questIndex == 0 ) { mShowSelect = false; mShowOn = false; return; } int startRow = FindStartRow( questIndex ); if( startRow == -1 ) { mShowSelect = false; mShowOn = false; return; } // ¼±ÅÃÇÑ Äù½ºÆ®À妽º¸¦ ¸Å´ÏÀú¿¡ ¾Ë¸² cQuestDefine* define = QUESTMAN->GetQuestDefine( questIndex ); if( !define ) { mShowSelect = false; mShowOn = false; return; } mShowOn = ( define->mQuestInfo ) ? true : false; int rowCount = 1; cQuestLimit* limit = define->mQuestLimit; if( limit && limit->mTime > 0 ) rowCount++; cQuestDuty* duty = define->mQuestDuty; if( duty ) { for( unsigned int i = 0; i < MAX_DUTY; ++i ) { eDutyType type = duty->mDuty[i].dutyType; if( type != eDUTY_NONE ) rowCount++; } } // À̹ÌÁö ó¸® int rowHeight = FONTAGENT->GetTextHeight( cFontAgent::eFont_UI ); cUIRect rc; rc.mLeft = GetAbsoluteRect().mLeft; rc.mRight = rc.mLeft + GetAbsoluteRect().GetWidth(); rc.mTop = GetAbsoluteRect().mTop + START_GAPY + ( rowHeight * startRow ); rc.mBottom = rc.mTop + ( rowHeight * rowCount ); if( mpSelectImage ) { mShowSelect = true; mpSelectImage->SetScreenXY( (unsigned short)rc.mLeft, (unsigned short)rc.mTop ); mpSelectImage->SetScreenWH( (unsigned short)rc.GetWidth(), (unsigned short)rc.GetHeight() ); } // ÃßÀû À̹ÌÁö ó¸® if( mpOnSkin ) { int tw = (short)mpOnSkin->mSkinInfo->mTexWidth; //int th = (short)mpOnSkin->mSkinInfo->mTexHeight; mpOnImage->SetScreenXY( rc.mRight - tw, rc.mTop ); } } int cQuestSimpleWindow::FindStartRow( unsigned long questIndex ) { if( questIndex == 0 ) return -1; if( mQuestMap.GetSize() == 0 ) return -1; //int leftX = GetAbsoluteRect().mLeft + START_GAPX; //int rightX = GetAbsoluteRect().mLeft + START_GAPX + mImageSize.mWidth; int row = 0; typedef tPointerList cProgressList; cQuestMap::cIterator i = mQuestMap.Begin(); cQuestMap::cIterator end = mQuestMap.End(); for( ; i != end; ++i ) { sQuestHaveData* data = (sQuestHaveData*)(i->mSecond); if( !data ) { assert(0); return -1; } row++; if( data->mClose == false ) { // ÆîÃÄÁ® ÀÖÀ¸¸é cProgressList::cIterator b = data->mQuestProgressList.Begin(); cProgressList::cIterator bend = data->mQuestProgressList.End(); for( ; b != bend; ++b ) { sQuestProgress* progress = (sQuestProgress*)(*b); if( !progress ) { assert(0); return -1; } int startRow = row; /// ½ÃÀÛ ÁÙ ¹øÈ£ ã¾Æ¼­ ¸®ÅÏ if( progress->mIndex == questIndex ) return startRow; row++; /// Àǹ«Á¶°Ç ¶óÀμö Ãß°¡ cQuestDefine* define = progress->mDefine; cQuestDuty* duty = define->mQuestDuty; cQuestLimit* limit = define->mQuestLimit; if( limit && limit->mTime > 0 ) row++; if( duty ) { for( unsigned int i = 0; i < MAX_DUTY; ++i ) { eDutyType type = duty->mDuty[i].dutyType; if( type != eDUTY_NONE ) row++; } } } } } return -1; } void cQuestSimpleWindow::GetHideMapCategorySet( tHashSet& mapSet ) { /// Ãâ·Â cQuestMap::cIterator i = mQuestMap.Begin(); cQuestMap::cIterator end = mQuestMap.End(); for( ; i != end; ++i ) { sQuestHaveData* data = (sQuestHaveData*)(i->mSecond); if( !data ) { assert(0); continue; } /// ´ÝÇô ÀÖÀ¸¸é ÇØ´ç ¸Ê À妽º ¾ò±â if( data->mClose == true ) { if( data->mQuestProgressList.GetSize() > 0 ) { //cProgressList::cIterator b = data->mQuestProgressList.Begin(); sQuestProgress* progress = (sQuestProgress*)( data->mQuestProgressList.Front() ); if( !progress ) { assert(0); return; } /// Äù½ºÆ® Àǹ«Á¶°ÇÃâ·Â if( progress->mDefine ) { mapSet.Insert( progress->mDefine->mTakeMapIndex ); } } } } } void cQuestSimpleWindow::SetHideMapCategory( unsigned long mapIndex ) { /// Ãâ·Â cQuestMap::cIterator i = mQuestMap.Begin(); cQuestMap::cIterator end = mQuestMap.End(); for( ; i != end; ++i ) { sQuestHaveData* data = (sQuestHaveData*)(i->mSecond); if( !data ) { assert(0); continue; } /// ´ÝÇô ÀÖÀ¸¸é ÇØ´ç ¸Ê À妽º ¾ò±â if( data->mClose == false ) { if( data->mQuestProgressList.GetSize() > 0 ) { //cProgressList::cIterator b = data->mQuestProgressList.Begin(); sQuestProgress* progress = (sQuestProgress*)( data->mQuestProgressList.Front() ); if( !progress ) { assert(0); return; } /// Äù½ºÆ® Àǹ«Á¶°ÇÃâ·Â if( progress->mDefine ) { if( progress->mDefine->mTakeMapIndex == mapIndex ) { data->mClose = true; UpdateSize(); return; } } } } } }