#include "stdafx.h" #include "QuestManager.h" #include "UIFuncText.h" #include "Protocol.h" #include "ChatManager.h" #include "GameUIManager.h" #include "QuestWindow.h" #include "UIMsgboxEvent.h" #include "NpcWindow.h" #include "NpcRewardWindow.h" #include "QuestSimpleWindow.h" #include "ItemManager.h" #include "ObjectManager.h" #include "Hero.h" #include "Npc.h" #include "Application.h" #include "StageManager.h" #include "SoundSystem.h" #include "GameResourceManager.h" #include "InputSystem.h" #include "SimpleTipWindow.h" #include "SmallMiniMapWindow.h" #include "MiniMapWindow.h" #include "NpcScript.h" #include "BoardWindow.h" #include "NpcTutorialWindow.h" #include "TriggerManager.h" #include "OptionManager.h" #include "TwitterWindow.h" #include "TwitterScript.h" /// ¹è¿­¿ë Äü¼ÒÆ® Á¤·Ä ÇÔ¼ö int SortQuest( const void *arg1, const void *arg2 ) { sQuestList* quest1 = (sQuestList*)arg1; sQuestList* quest2 = (sQuestList*)arg2; if( quest1 && quest2 ) { cQuestDefine* define1 = QUESTMAN->GetQuestDefine( quest1->questIdx ); cQuestDefine* define2 = QUESTMAN->GetQuestDefine( quest2->questIdx ); if( define1 && define2 ) { if( define1->mLevel < define2->mLevel ) return 1; else if( define1->mLevel > define2->mLevel ) return -1; else return 0; } } assert(0); return 0; } /// ¸®½ºÆ®¿ë Á¤·Ä ÇÔ¼ö bool QuestLevelSort( unsigned long arg1, unsigned long arg2 ) { cQuestDefine* define1 = QUESTMAN->GetQuestDefine( arg1 ); cQuestDefine* define2 = QUESTMAN->GetQuestDefine( arg2 ); if( define1 && define2 ) { if( define1->mLevel > define2->mLevel ) return true; else return false; } assert(0); return false; } ///////////////////////////////////////////////////////////////////////////// cQuestManager* cQuestManager::mpSingleton = 0; cQuestManager::cQuestManager() : mpQuestText(0) , mTotalKeepCount(0) , mCompleteCount(0) , mProgressCount(0) , mCheckQuestIndex(ULONG_MAX) , mTimeMap( 64 ) , mNetLock( false ) , mLockTry( eLOCK_QUESTNONE ) , mTempQuestIndex(0) , mTempNpcIndex(0) , mTempArrIndex(0) , mChaseQuestIndex(0) { assert( mpSingleton == 0 && "bad singleton!" ); mpSingleton = this; memset( mQuest, 0, sizeof(sQuestList) * MAX_KEEPQUEST ); } cQuestManager::~cQuestManager() { SAFE_DELETE( mpQuestText ); /// cQuestDefineMap::cIterator i = mQuestDefine.Begin(); cQuestDefineMap::cIterator end = mQuestDefine.End(); for( ; i != end; ++i ) { cQuestDefine* p = (cQuestDefine*)(i->mSecond); SAFE_DELETE( p ); } mQuestDefine.Clear(); /// npc º¸À¯ Äù½ºÆ® ¸Ê »èÁ¦ { cNpcQuestMap::cIterator i = mNpcQuestMap.Begin(); cNpcQuestMap::cIterator end = mNpcQuestMap.End(); for( ; i != end; ++i ) { sNpcQuestList* p = (sNpcQuestList*)(i->mSecond); if( p ) SAFE_DELETE( p ); } mNpcQuestMap.Clear(); } /// ½Ã°£¸Ê Ŭ¸®¾î ClearQuestTime(); } /// ½Ã°£¸Ê Ŭ¸®¾î void cQuestManager::ClearQuestTime() { cTimeMap::cIterator b = mTimeMap.Begin(); cTimeMap::cIterator end = mTimeMap.End(); for( ; b != end; ++b ) { sQuestTime* data = (sQuestTime*)(b->mSecond); SAFE_DELETE( data ); } mTimeMap.Clear(); } void cQuestManager::Close() { /// ¸ÊüÀÎÁö½Ã memset( mQuest, 0, sizeof(mQuest) ); mTotalKeepCount = 0; mCompleteCount = 0; mProgressCount = 0; mNetLock = false; mLockTry = eLOCK_QUESTNONE; /// ½Ã°£¸Ê Ŭ¸®¾î { cTimeMap::cIterator b = mTimeMap.Begin(); cTimeMap::cIterator end = mTimeMap.End(); for( ; b != end; ++b ) { sQuestTime* data = (sQuestTime*)(b->mSecond); SAFE_DELETE( data ); } mTimeMap.Clear(); } /// npc »óÅ Ŭ¸®¾î { cNpcStatusMap::cIterator b = mNpcStatusMap.Begin(); cNpcStatusMap::cIterator end = mNpcStatusMap.End(); for( ; b != end; ++b ) { sNpcStausData* data = (sNpcStausData*)(b->mSecond); SAFE_DELETE( data ); } mNpcStatusMap.Clear(); } /// mCountMap.Clear(); mNewQuestSet.Clear(); mNewEventQuestSet.Clear(); } bool cQuestManager::Init() { mpQuestText = new cUIFuncText; /// Äù½ºÆ® ¼³¸í ¹®ÀÚ¿­ ·Îµå cStringT path; path.Format( L"./language/%s/Quest_Note.txt", cApplication::mLangaugeFolderW.Cstr() ); if( mpQuestText->Load( path.Cstr() ) == false ) { assert( 0 && "failed to load quest description" ); return false; } /// Äù½ºÆ® µ¥ÀÌÅÍ ·Îµå if( Load( "./Script/Resource/List_Quest.txt" ) == false ) { assert( 0 && "failed to load quest script" ); return false; } /// NPC Äù½ºÆ® ¸®½ºÆ® ·Îµå if( LoadNpcQuest( "./Script/Resource/NpcQuestList.txt" ) == false ) { assert( 0 && "failed to load npc quest list" ); return false; } return true; } cUIFuncTextNode* cQuestManager::GetNpcTextNode( unsigned int textid ) { return mpQuestText->GetNode( textid ); } sNpcQuestList* cQuestManager::GetNpcQuestMap( unsigned long npcClassIdx ) { if( npcClassIdx == 0 ) return 0; return (sNpcQuestList*)mNpcQuestMap.GetAt( npcClassIdx ); } void cQuestManager::OpenLoad() { /// ¼±ÅÃÇØ³í Á¤º¸ »èÁ¦ mChaseQuestIndex = 0; mSelectSet.Clear(); UpdateUIAll(); GAMEUI->ApplyWinodwOption_CharacterQuest(); } void cQuestManager::OpenMapChange() { mSelectSet.Clear(); UpdateUIAll(); GAMEUI->ApplyWinodwOption_CharacterQuest(); // UpdateChaseQuest( mChaseQuestIndex ); } /// Äù½ºÆ® À©µµ¿ì¸¸ °»½Å - quest add void cQuestManager::UpdateUI() { cQuestWindow* window = GAMEUI->GetQuestWindow(); if( !window ) { assert( 0 && "error quest ui" ); return; } /// UI ¿¡ Á¤º¸ ¼¼ÆÃ window->Clear(); bool newQuest = false; /// for( unsigned int i = 0; i < mTotalKeepCount; ++i ) { cQuestDefine* define = GetQuestDefine( mQuest[i].questIdx ); if( define ) { /// ¸¶Áö¸· À§Ä¡ÀÇ Äù½ºÆ®°¡ »õ·Î Ãß°¡ÇÑ Äù½ºÆ® if( i == mTotalKeepCount -1 ) newQuest = true; else newQuest = false; window->AddQuest( i, mQuest[i].questIdx, (mQuest[i].check == define->mComplete), newQuest ); } } /// °¹¼ö °»½Å CheckQuestCount(); } /// Äù½ºÆ® UI ¾÷µ¥ÀÌÆ® - quest list void cQuestManager::UpdateUIAll() { cQuestWindow* questWin = GAMEUI->GetQuestWindow(); cQuestSimpleWindow* questSimpleWin = GAMEUI->GetQuestSimpleWindow(); cMiniMapWindow* minimap = GAMEUI->GetMinimapWindow(); if( !questWin || !questSimpleWin || !minimap ) { assert( 0 && "error quest ui" ); return; } mClosedCategory.Clear(); mClosedSimpleCategory.Clear(); questWin->GetHideMapCategorySet( mClosedCategory ); questSimpleWin->GetHideMapCategorySet( mClosedSimpleCategory ); cUIRect questSimpleWinPos = questSimpleWin->GetRelativeRect(); /// UI ¿¡ Á¤º¸ ¼¼ÆÃ questWin->Clear(); questSimpleWin->Clear(); questSimpleWin->Hide(); minimap->UpdateQuestChase(); /// for( unsigned int i = 0; i < mTotalKeepCount; ++i ) { cQuestDefine* define = GetQuestDefine( mQuest[i].questIdx ); if( !define ) { assert(0); continue; } questWin->AddQuest( i, mQuest[i].questIdx, (mQuest[i].check == define->mComplete) ); if( IsSelectQuest( mQuest[i].questIdx ) == true ) questSimpleWin->AddQuestInfo( mQuest[i].questIdx, &mQuest[i].check ); } /// Á¢ÇôÁø Äù½ºÆ® Ä«Å×°í¸® ¸Ê À妽º Àû¿ë cMapIndexSet::cConstIterator pos = mClosedCategory.Begin(); cMapIndexSet::cConstIterator end = mClosedCategory.End(); for( ; pos != end ; ++pos ) { questWin->SetHideMapCategory( *pos ); } pos = mClosedSimpleCategory.Begin(); end = mClosedSimpleCategory.End(); for( ; pos != end ; ++pos ) { questSimpleWin->SetHideMapCategory( *pos ); } ///Á¢ÇôÁø »óÅÂÀÇ À©µµ¿ì À§Ä¡°ª Àû¿ë questSimpleWin->SetRelativePos( cUIPos(questSimpleWinPos.mLeft, questSimpleWinPos.mTop) ); /// °¹¼ö °»½Å CheckQuestCount(); } /// Äù½ºÆ® ÁøÇàÁß, ¿Ï·á°¡´É °¹¼ö °»½Å void cQuestManager::CheckQuestCount() { mCompleteCount = 0; mProgressCount = 0; for( unsigned int i = 0; i < mTotalKeepCount; ++i ) { cQuestDefine* define = GetQuestDefine( mQuest[i].questIdx ); if( !define ) { assert(0); continue; } /// ¿Ï·á°¡´É, ÁøÇàÁß °¹¼ö üũ if( mQuest[i].check == define->mComplete ) mCompleteCount++; else mProgressCount++; } /// °¹¼ö ¿À·ù °Ë»ç if( mTotalKeepCount < mCompleteCount + mProgressCount ) { assert(0); return; } /// UI ¾÷µ¥ÀÌÆ® cQuestWindow* window = GAMEUI->GetQuestWindow(); if( window ) window->UpdateCount( mProgressCount, mCompleteCount ); } void cQuestManager::AddNpcStatus( unsigned long npcIndex, unsigned long npcClassIndex ) { sNpcStausData* p = new sNpcStausData; p->npcClassIndex = npcClassIndex; p->effectType = eNPCQUEST_EFFECT_NONE; if( mNpcStatusMap.Insert( npcIndex, p ) == false ) { SAFE_DELETE( p ); assert(0); } } eNpcQuestEffect cQuestManager::GetNpcStatus( unsigned long npcIndex ) { sNpcStausData* p = (sNpcStausData*)mNpcStatusMap.GetAt( npcIndex ); return ( p ) ? p->effectType : eNPCQUEST_EFFECT_NONE; } void cQuestManager::UpdateNpcStatus() { if( mNpcStatusMap.IsEmpty() == true ) return; /// °¢ npc »óÅ Á¤º¸ °»½Å cNpcStatusMap::cIterator i = mNpcStatusMap.Begin(); cNpcStatusMap::cIterator end = mNpcStatusMap.End(); for( ; i != end; ++i ) { unsigned long npcIndex = (unsigned long)(i->mFirst); sNpcStausData* p = (sNpcStausData*)(i->mSecond); if( p ) { // ÀÏ¹Ý npc À϶§¸¸ Äù½ºÆ® »óÅ ó¸® sNPCList* npcInfo = NPCSCRIPT->GetNPCList( p->npcClassIndex ); if( npcInfo && npcInfo->mType <= eNPCTYPE_TUTORIALBOOK) { eNpcQuestEffect type = UpdateNpcEffect( npcIndex, p->npcClassIndex ); p->effectType = type; /// NPC °»½Å cNpc* pNpc = OBJECTMANAGER->GetNpc( npcIndex ); if( pNpc ) { pNpc->SetQuestEffect( type ); } /// ¹Ì´Ï¸Ê °»½Å cSmallMiniMapWindow* smini = GAMEUI->GetSmallMinimapWindow(); cMiniMapWindow* mini = GAMEUI->GetMinimapWindow(); if( smini && mini ) { smini->UpdateNpcEffect( npcIndex, type ); mini->UpdateNpcEffect( npcIndex, type ); } } } else assert(0); } } // °¢ npcµéÀÇ ÀÌÆåÆ® »óÅ °áÁ¤Çϱâ eNpcQuestEffect cQuestManager::UpdateNpcEffect( unsigned long npcIndex, unsigned long npcClassIndex ) { // »óÅ ¿ì¼±¼øÀ§ : ¿Ï·á(Å׸¶>ÀϹÝ>¹Ýº¹) > ½Å±Ô(Å׸¶>ÀϹÝ>¹Ýº¹) > ÁøÇà > °í·¹º§ Äù½ºÆ® ½Å±Ô > Àú·¹º§ Äù½ºÆ® ½Å±Ô eNpcQuestEffect npcEffectType = eNPCQUEST_EFFECT_NONE; // ÇöÀç ¼ÒÀ¯ÇÑ Äù½ºÆ®Áß sQuestList* quest = mQuest; for( unsigned int i = 0; i < mTotalKeepCount; ++i, ++quest ) { cQuestDefine* define = GetQuestDefine( quest->questIdx ); if( !define ) { assert(0); continue; } if( define->mTakeNpcIndex != npcClassIndex ) continue; // º¸»ó°¡´É if( quest->status == eQUEST_COMPLETE ) { ///¿ì¼± ¼ø½¬ °è»ê ÈÄ ¸®ÅÏ( Å׸¶ > ÀÏ¹Ý > ¹Ýº¹ ) switch( define->mType ) { case eQUEST_TYPE_THEME: ///Å׸¶°¡ ¿ì¼±¼øÀ§°¡ °¡Àå ³ôÀ½. ¹Ù·Î ¸®ÅÏ return eNPCQUEST_EFFECT_THEME_REWARD; case eQUEST_TYPE_NORMAL: case eQUEST_TYPE_TUTORIAL: npcEffectType = eNPCQUEST_EFFECT_REWARD; break; case eQUEST_TYPE_REPEAT: if( npcEffectType != eNPCQUEST_EFFECT_REWARD ) npcEffectType = eNPCQUEST_EFFECT_REPEAT_REWARD; break; default: { assert(0); continue; } } } // ÁøÇàÁßÀ϶§ if( quest->status == eQUEST_PLAYING ) { // ¿Ï·á°¡´É if( quest->check == define->mComplete ) { ///¿ì¼± ¼øÀ§ °è»ê ÈÄ ¸®ÅÏ switch( define->mType ) { ///¿ì¼± ¼ø½¬ °è»ê ÈÄ ¸®ÅÏ( Å׸¶ > ÀÏ¹Ý > ¹Ýº¹ ) case eQUEST_TYPE_THEME: return eNPCQUEST_EFFECT_THEME_COMPLETE; ///Å׸¶°¡ ¿ì¼±¼øÀ§°¡ °¡Àå ³ôÀ½. ¹Ù·Î ¸®ÅÏ case eQUEST_TYPE_NORMAL: case eQUEST_TYPE_TUTORIAL: npcEffectType = eNPCQUEST_EFFECT_COMPLETE; break; case eQUEST_TYPE_REPEAT: if( npcEffectType != eNPCQUEST_EFFECT_COMPLETE ) npcEffectType = eNPCQUEST_EFFECT_REPEAT_COMPLETE; break; default: { assert(0); continue; } } } else { // ±× ¿Ü´Â ÁøÇà if( npcEffectType == eNPCQUEST_EFFECT_NONE ) npcEffectType = eNPCQUEST_EFFECT_PLAYING; } } } ///¿ì¼± ¼øÀ§¿¡ ¸Â°Ô ¸®ÅÏ if( npcEffectType == eNPCQUEST_EFFECT_REWARD || npcEffectType == eNPCQUEST_EFFECT_REPEAT_REWARD || npcEffectType == eNPCQUEST_EFFECT_COMPLETE || npcEffectType == eNPCQUEST_EFFECT_REPEAT_COMPLETE ) return npcEffectType; // ½Å±Ô °Ë»ç if( mNewEventQuestSet.IsEmpty() == true && mNewQuestSet.IsEmpty() == true ) return npcEffectType; sNpcQuestList* list = GetNpcQuestMap( npcClassIndex ); if( !list ) return npcEffectType; eNpcQuestEffect tempEffectType = eNPCQUEST_EFFECT_NONE; typedef tHashSet cQuestSet; if( mNewEventQuestSet.IsEmpty() == false ) { cQuestSet::cIterator s = list->mQuestSet.Begin(); cQuestSet::cIterator send = list->mQuestSet.End(); for( ; s != send; ++s ) { unsigned long newIndex = (unsigned long)(*s); // ½Å±Ô Äù½ºÆ® ¸ñ·ÏÁß ÇØ´ç npc°¡ Á¦°øÇÏ´Â Äù½ºÆ®°¡ ÀÖÀ¸¸é if( mNewEventQuestSet.Find( newIndex ) != mNewEventQuestSet.End() ) { /// Àú ·¹º§ Äù½ºÆ® °É·¯³»±â short lowLevel = TRIGGERMAN->GetLowLevel( newIndex ); if( lowLevel != 0 && lowLevel <= (HERO->GetLevel() - LOW_LEVEL_QUEST_GAP ) ) { tempEffectType = eNPCQUEST_EFFECT_LOW_LEVEL_NEW; continue; } /// Äù½ºÆ® ŸÀÔº°·Î ±¸ºÐÇϱâ cQuestDefine* define = GetQuestDefine( newIndex ); if( !define ) { assert(0); continue; } switch( define->mType ) { ///¿ì¼± ¼ø½¬ °è»ê ÈÄ ¸®ÅÏ( Å׸¶ > ÀÏ¹Ý > ¹Ýº¹ ) case eQUEST_TYPE_THEME: return eNPCQUEST_EFFECT_THEME_NEW; ///Å׸¶°¡ ¿ì¼±¼øÀ§°¡ °¡Àå ³ôÀ½. ¹Ù·Î ¸®ÅÏ case eQUEST_TYPE_NORMAL: case eQUEST_TYPE_TUTORIAL: npcEffectType = eNPCQUEST_EFFECT_NEW; break; case eQUEST_TYPE_REPEAT: if( npcEffectType != eNPCQUEST_EFFECT_NEW ) npcEffectType = eNPCQUEST_EFFECT_REPEAT_NEW; break; default: { assert(0); continue; } } } } } if( mNewQuestSet.IsEmpty() == false ) { cQuestSet::cIterator s = list->mQuestSet.Begin(); cQuestSet::cIterator send = list->mQuestSet.End(); for( ; s != send; ++s ) { unsigned long newIndex = (unsigned long)(*s); // ½Å±Ô Äù½ºÆ® ¸ñ·ÏÁß ÇØ´ç npc°¡ Á¦°øÇÏ´Â Äù½ºÆ®°¡ ÀÖÀ¸¸é if( mNewQuestSet.Find( newIndex ) != mNewQuestSet.End() ) { /// Àú ·¹º§ Äù½ºÆ® °É·¯³»±â short lowLevel = TRIGGERMAN->GetLowLevel( newIndex ); if( lowLevel != 0 && lowLevel <= (HERO->GetLevel() - LOW_LEVEL_QUEST_GAP ) ) { tempEffectType = eNPCQUEST_EFFECT_LOW_LEVEL_NEW; continue; } cQuestDefine* define = GetQuestDefine( newIndex ); if( !define ) { assert(0); continue; } switch( define->mType ) { ///¿ì¼± ¼øÀ§ °è»ê ÈÄ ¸®ÅÏ( Å׸¶ > ÀÏ¹Ý > ¹Ýº¹ ) case eQUEST_TYPE_THEME: return eNPCQUEST_EFFECT_THEME_NEW; ///Å׸¶°¡ ¿ì¼±¼øÀ§°¡ °¡Àå ³ôÀ½. ¹Ù·Î ¸®ÅÏ case eQUEST_TYPE_NORMAL: case eQUEST_TYPE_TUTORIAL: npcEffectType = eNPCQUEST_EFFECT_NEW; break; case eQUEST_TYPE_REPEAT: if( npcEffectType != eNPCQUEST_EFFECT_NEW ) npcEffectType = eNPCQUEST_EFFECT_REPEAT_NEW; break; default: { assert(0); continue; } } } } } // »óÅ ¿ì¼±¼øÀ§ : ÁøÇà > Àú·¹º§ Äù½ºÆ® ½Å±Ô if( npcEffectType == eNPCQUEST_EFFECT_NONE && tempEffectType == eNPCQUEST_EFFECT_LOW_LEVEL_NEW ) npcEffectType = eNPCQUEST_EFFECT_LOW_LEVEL_NEW; return npcEffectType; } void cQuestManager::SetNpcQuestList( cNpcWindow* win, unsigned long npcIndex, unsigned long npcClassIndex ) { if( win == 0 ) { assert(0); return; } cNpc* pNpc = OBJECTMANAGER->GetNpc( npcIndex ); if( !pNpc ) { assert(0); return; } /// npcÀÇ Äù½ºÆ® »óŰ¡ ¾øÀ¸¸é ¸®ÅÏ if( pNpc->GetQuestEffect() == eNPCQUEST_EFFECT_NONE ) return; // Á¤·Ä sQuestList temp[MAX_KEEPQUEST]; ::memset( temp, 0, sizeof(temp) ); sQuestList* data = mQuest; sQuestList* p = temp; for( unsigned int i = 0; i < mTotalKeepCount; ++i, ++data, ++p ) { *p = *data; } if( mTotalKeepCount > 1 ) { ::qsort( (void*)temp, mTotalKeepCount, sizeof(sQuestList), SortQuest ); } /// ¿Ï·á »ðÀÔ /// º¸»ó°¡´É for( unsigned int i = 0; i < mTotalKeepCount; ++i ) { cQuestDefine* define = GetQuestDefine( temp[i].questIdx ); if( define && define->mTakeNpcIndex == npcClassIndex ) { if( temp[i].status == eQUEST_COMPLETE ) win->AddQuest( temp[i].questIdx, eNPCQUEST_REWARD ); } } /// ÁøÇà¿Ï·á°¡´É for( unsigned int i = 0; i < mTotalKeepCount; ++i ) { cQuestDefine* define = GetQuestDefine( temp[i].questIdx ); if( define && define->mTakeNpcIndex == npcClassIndex ) { if( temp[i].status == eQUEST_PLAYING && temp[i].check == define->mComplete ) win->AddQuest( temp[i].questIdx, eNPCQUEST_COMPLETE ); } } //// ½Å±Ô »ðÀÔ typedef tHashSet cQuestSet; typedef tList cTempQuestList; cTempQuestList tempQuestList; sNpcQuestList* list = GetNpcQuestMap( npcClassIndex ); if( list ) { if( mNewEventQuestSet.IsEmpty() == false ) { cQuestSet::cIterator s = list->mQuestSet.Begin(); cQuestSet::cIterator send = list->mQuestSet.End(); for( ; s != send; ++s ) { unsigned long newIndex = (unsigned long)(*s); // ½Å±Ô Äù½ºÆ® ¸ñ·ÏÁß ÇØ´ç npc°¡ Á¦°øÇÏ´Â Äù½ºÆ®°¡ ÀÖÀ¸¸é if( mNewEventQuestSet.Find( newIndex ) != mNewEventQuestSet.End() ) { tempQuestList.PushBack( newIndex ); } } } if( mNewQuestSet.IsEmpty() == false ) { cQuestSet::cIterator s = list->mQuestSet.Begin(); cQuestSet::cIterator send = list->mQuestSet.End(); for( ; s != send; ++s ) { unsigned long newIndex = (unsigned long)(*s); // ½Å±Ô Äù½ºÆ® ¸ñ·ÏÁß ÇØ´ç npc°¡ Á¦°øÇÏ´Â Äù½ºÆ®°¡ ÀÖÀ¸¸é if( mNewQuestSet.Find( newIndex ) != mNewQuestSet.End() ) { tempQuestList.PushBack( newIndex ); } } } } cTempQuestList lowLevelQuestList; unsigned int size = tempQuestList.GetSize(); if( size > 0 ) { if( size > 1 ) tempQuestList.Sort( QuestLevelSort ); cTempQuestList::cIterator i = tempQuestList.Begin(); cTempQuestList::cIterator end = tempQuestList.End(); for( ; i != end; ++i ) { unsigned long questIdx = (*i); win->AddQuest( questIdx, eNPCQUEST_NEW ); } } // ÁøÇàÁß »ðÀÔ for( unsigned int i = 0; i < mTotalKeepCount; ++i ) { cQuestDefine* define = GetQuestDefine( temp[i].questIdx ); if( define && define->mTakeNpcIndex == npcClassIndex ) { if( temp[i].status == eQUEST_PLAYING && temp[i].check < define->mComplete ) win->AddQuest( temp[i].questIdx, eNPCQUEST_PLAYING ); } } } /// ½Å±Ô Äù½ºÆ® ¸®½ºÆ® ¼¼ÆÃ, ¹Ýº¹°ú ÀÏ¹Ý ±¸ºÐ bool cQuestManager::SetBoardQuestList() { /// npc À©µµ¿ì¿¡ Äù½ºÆ® ºÐ·ùÈÄ »ðÀÔ cBoardWindow* boardWin = GAMEUI->GetBoardWindow(); if( !boardWin ) { assert(0); return false; } // Äù½ºÆ® ¸ñ·Ï ¿äû unsigned long npcIndex = HERO->GetNpcIdx(); if( npcIndex == 0 ) { assert(0); return false; } cNpc* npc = OBJECTMANAGER->GetNpc( npcIndex ); if( !npc ) { assert(0); return false; } unsigned long npcClassIndex = npc->GetClassId(); //// ½Å±Ô »ðÀÔ typedef tHashSet cQuestSet; typedef tList cTempQuestList; cTempQuestList tempQuestList; cTempQuestList tempRepeatQuestList; sNpcQuestList* list = GetNpcQuestMap( npcClassIndex ); if( list ) { if( mNewEventQuestSet.IsEmpty() == false ) { cQuestSet::cIterator s = list->mQuestSet.Begin(); cQuestSet::cIterator send = list->mQuestSet.End(); for( ; s != send; ++s ) { unsigned long newIndex = (unsigned long)(*s); // ½Å±Ô Äù½ºÆ® ¸ñ·ÏÁß ÇØ´ç npc°¡ Á¦°øÇÏ´Â Äù½ºÆ®°¡ ÀÖÀ¸¸é if( mNewEventQuestSet.Find( newIndex ) != mNewEventQuestSet.End() ) { cQuestDefine* define = QUESTMAN->GetQuestDefine( newIndex ); if( define ) { if( define->mRepeatType == eQUEST_REPEAT ) tempRepeatQuestList.PushBack( newIndex ); else tempQuestList.PushBack( newIndex ); } else assert(0); } } } if( mNewQuestSet.IsEmpty() == false ) { cQuestSet::cIterator s = list->mQuestSet.Begin(); cQuestSet::cIterator send = list->mQuestSet.End(); for( ; s != send; ++s ) { unsigned long newIndex = (unsigned long)(*s); // ½Å±Ô Äù½ºÆ® ¸ñ·ÏÁß ÇØ´ç npc°¡ Á¦°øÇÏ´Â Äù½ºÆ®°¡ ÀÖÀ¸¸é if( mNewQuestSet.Find( newIndex ) != mNewQuestSet.End() ) { cQuestDefine* define = QUESTMAN->GetQuestDefine( newIndex ); if( define ) { if( define->mRepeatType == eQUEST_REPEAT ) tempRepeatQuestList.PushBack( newIndex ); else tempQuestList.PushBack( newIndex ); } else assert(0); } } } } // boardWin->Clear(); /// eQUEST_CHALLENGE Çü ³Ö±â. unsigned int size = tempQuestList.GetSize(); if( size > 0 ) { if( size > 1 ) tempQuestList.Sort( QuestLevelSort ); cTempQuestList::cIterator i = tempQuestList.Begin(); cTempQuestList::cIterator end = tempQuestList.End(); for( ; i != end; ++i ) { unsigned long questIdx = (*i); boardWin->AddQuest( questIdx ); } } /// eQUEST_REPEAT Çü ³Ö±â. size = tempRepeatQuestList.GetSize(); if( size > 0 ) { if( size > 1 ) tempRepeatQuestList.Sort( QuestLevelSort ); cTempQuestList::cIterator i = tempRepeatQuestList.Begin(); cTempQuestList::cIterator end = tempRepeatQuestList.End(); for( ; i != end; ++i ) { unsigned long questIdx = (*i); boardWin->AddQuest( questIdx ); } } boardWin->ChangePage( eBOARD_LIST ); return true; } void cQuestManager::SetQuestTip( unsigned long npcclassIndex ) { cQuestTipWindow* tip = GAMEUI->GetQuestTip(); if( !tip ) { assert(0); return; } UIMAN->HideTip(); // Á¤º¸ ¼¼ÆÃ sQuestList temp[MAX_KEEPQUEST]; ::memset( temp, 0, sizeof(temp) ); sQuestList* data = mQuest; sQuestList* p = temp; for( unsigned int i = 0; i < mTotalKeepCount; ++i, ++data, ++p ) { *p = *data; } if( mTotalKeepCount > 1 ) { ::qsort( (void*)temp, mTotalKeepCount, sizeof(sQuestList), SortQuest ); } /// ¿Ï·á°¡´É bool completeQuest = false; for( unsigned int i = 0; i < mTotalKeepCount; ++i ) { cQuestDefine* define = GetQuestDefine( temp[i].questIdx ); if( define && define->mTakeNpcIndex == npcclassIndex ) { if( temp[i].status == eQUEST_COMPLETE || (temp[i].status == eQUEST_PLAYING && temp[i].check == define->mComplete) ) { if( completeQuest == false ) { tip->AddQuestInfo( UIMAN->GetUIText( 231 ), COLOR_WHITE, true ); completeQuest = true; } LPCTSTR title = GAMERESOURCEMAN->GetQuestTitle( define->mTitleIndex ); unsigned long textColor = COLOR_GREEN; cStringT str; str.Format( GAMERESOURCEMAN->GetGameText( 474 ), define->mLevel, title ); // if( define->mRepeatType == eQUEST_REPEAT ) // str.Append( GAMERESOURCEMAN->GetGameText( 472 ) ); /// Àú ·¹º§ Äù½ºÆ® üũ short lowLevel = TRIGGERMAN->GetLowLevel( temp[i].questIdx ); if( lowLevel != 0 && lowLevel <= (HERO->GetLevel() - LOW_LEVEL_QUEST_GAP) ) { str.Append( GAMERESOURCEMAN->GetGameText( 476 ) ); textColor = COLOR_LOW_LEVEL_QUEST; } tip->AddQuestInfo( (LPCTSTR)str.Cstr(), textColor ); } } } //// ½Å±Ô »ðÀÔ typedef tHashSet cQuestSet; typedef tList cTempQuestList; cTempQuestList tempQuestList; bool newQuest = false; sNpcQuestList* list = GetNpcQuestMap( npcclassIndex ); if( list != NULL ) { if( mNewEventQuestSet.IsEmpty() == false ) { cQuestSet::cIterator s = list->mQuestSet.Begin(); cQuestSet::cIterator send = list->mQuestSet.End(); for( ; s != send; ++s ) { unsigned long newIndex = (unsigned long)(*s); // ½Å±Ô Äù½ºÆ® ¸ñ·ÏÁß ÇØ´ç npc°¡ Á¦°øÇÏ´Â Äù½ºÆ®°¡ ÀÖÀ¸¸é if( mNewEventQuestSet.Find( newIndex ) != mNewEventQuestSet.End() ) { tempQuestList.PushBack( newIndex ); } } } if( mNewQuestSet.IsEmpty() == false ) { cQuestSet::cIterator s = list->mQuestSet.Begin(); cQuestSet::cIterator send = list->mQuestSet.End(); for( ; s != send; ++s ) { unsigned long newIndex = (unsigned long)(*s); // ½Å±Ô Äù½ºÆ® ¸ñ·ÏÁß ÇØ´ç npc°¡ Á¦°øÇÏ´Â Äù½ºÆ®°¡ ÀÖÀ¸¸é if( mNewQuestSet.Find( newIndex ) != mNewQuestSet.End() ) { tempQuestList.PushBack( newIndex ); } } } } cTempQuestList lowLevelQuestList; unsigned int size = tempQuestList.GetSize(); if( size > 0 ) { if( size > 1 ) tempQuestList.Sort( QuestLevelSort ); cTempQuestList::cIterator i = tempQuestList.Begin(); cTempQuestList::cIterator end = tempQuestList.End(); for( ; i != end; ++i ) { unsigned long questIdx = (*i); cQuestDefine* define = GetQuestDefine( questIdx ); if( define ) { unsigned long questColor = COLOR_GREEN; short lowLevel = TRIGGERMAN->GetLowLevel( questIdx ); if( lowLevel != 0 && lowLevel <= (HERO->GetLevel() - LOW_LEVEL_QUEST_GAP) ) questColor = COLOR_LOW_LEVEL_QUEST; if( newQuest == false ) { tip->AddQuestInfo( UIMAN->GetUIText( 229 ), COLOR_WHITE, true ); newQuest = true; } LPCTSTR title = GAMERESOURCEMAN->GetQuestTitle( define->mTitleIndex ); cStringT str; str.Format( GAMERESOURCEMAN->GetGameText( 474 ), define->mLevel, title ); // if( define->mRepeatType == eQUEST_REPEAT ) // str.Append( GAMERESOURCEMAN->GetGameText( 472 ) ); if( questColor == COLOR_LOW_LEVEL_QUEST ) str.Append( GAMERESOURCEMAN->GetGameText( 476 ) ); tip->AddQuestInfo( (LPCTSTR)str.Cstr(), questColor ); } } } // ÁøÇàÁß »ðÀÔ bool progressQuest = false; for( unsigned int i = 0; i < mTotalKeepCount; ++i ) { cQuestDefine* define = GetQuestDefine( temp[i].questIdx ); if( define && define->mTakeNpcIndex == npcclassIndex ) { if( temp[i].status == eQUEST_PLAYING && temp[i].check < define->mComplete ) { if( progressQuest == false ) { tip->AddQuestInfo( UIMAN->GetUIText( 230 ), COLOR_WHITE, true ); progressQuest = true; } LPCTSTR title = GAMERESOURCEMAN->GetQuestTitle( define->mTitleIndex ); unsigned long textColor = COLOR_GREEN; cStringT str; str.Format( GAMERESOURCEMAN->GetGameText( 474 ), define->mLevel, title ); // if( define->mRepeatType == eQUEST_REPEAT ) // str.Append( GAMERESOURCEMAN->GetGameText( 472 ) ); /// Àú ·¹º§ Äù½ºÆ® üũ short lowLevel = TRIGGERMAN->GetLowLevel( temp[i].questIdx ); if( lowLevel != 0 && lowLevel <= (HERO->GetLevel() - LOW_LEVEL_QUEST_GAP) ) { str.Append( GAMERESOURCEMAN->GetGameText( 476 ) ); textColor = COLOR_LOW_LEVEL_QUEST; } tip->AddQuestInfo( (LPCTSTR)str.Cstr(), textColor ); } } } if( completeQuest == true || progressQuest == true || newQuest == true ) { // ÆÁº¸±â UIMAN->ShowQuestTip( tip, cUIPos(MOUSE->GetMouseX(), MOUSE->GetMouseY()) ); } } /// Äù½ºÆ® ½Å±Ô Ãß°¡ bool cQuestManager::QuestAddByNpc( unsigned long questIdx, unsigned long npcIndex ) { if( IsNetLock() ) return false; if( npcIndex == 0 ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 447 ), GAMERESOURCEMAN->GetGameText( 301 ) ); assert(0); return false; } /// À¯È¿¼º °Ë»ç cQuestDefine* define = GetQuestDefine( questIdx ); if( !define ) { assert(0); return false; } /// ÀÌ¹Ì º¸À¯ÁßÀÎ Äù½ºÆ®ÀÎÁö °Ë»ç int arrIdx = GetQuestArrIdx( questIdx ); if( arrIdx != -1 ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 402 ), GAMERESOURCEMAN->GetGameText( 301 ) ); return false; } MSG_REQ_QUEST_ADD msg; ::memset( &msg, 0, sizeof( msg ) ); msg.Category = NM_NPC; msg.Protocol = NM_NPC_QUEST_ADD_REQ; msg.questIndex = questIdx; msg.npcIndex = npcIndex; NETWORK->SendNetworkMsg( (char*)&msg, sizeof(msg) ); /// ¶ô°É±â NetLock( eLOCK_QUESTADD ); return true; } bool cQuestManager::QuestAddByItem( unsigned short number ) { if( IsNetLock() ) { CHATMANAGER->AddSystemMsg( eSYSTEM_QUEST, GAMERESOURCEMAN->GetGameText( 223 ) ); return false; } cItem* item = ITEMMAN->GetItem( number ); if( !item ) { assert(0); return false; } cItemDefine* itemDefine = ITEMMAN->GetItemDefine( item->GetIndex() ); if( !itemDefine ) { assert(0); return false; } cItemAbility* itemAbil = itemDefine->GetAbililty(); if( !itemAbil ) { assert(0); return false; } long questIndex = itemAbil->GetInfluenceIndex(); if( questIndex <= 0 ) { assert(0); return false; } /// cQuestDefine* define = GetQuestDefine( questIndex ); if( !define ) { assert(0); return false; } /// ÀÌ¹Ì º¸À¯ÁßÀÎ Äù½ºÆ®ÀÎÁö °Ë»ç int arrIdx = GetQuestArrIdx( questIndex ); if( arrIdx != -1 ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 402 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); return false; } /// ÀÇ·Ú¾ÆÀÌÅÛÀ» ÀÌ¿ëÇÑ Äù½ºÆ® ºÎ¿© MSG_REQ_QUEST_ADDBYITEM msg; ::memset( &msg, 0, sizeof(msg) ); msg.Category = NM_QUEST; msg.Protocol = NM_QUEST_ADDBYITEM_REQ; msg.number = (unsigned short)number; NETWORK->SendNetworkMsg( (char*)&msg, sizeof(msg) ); /// Äù½ºÆ® ¶ô NetLock( eLOCK_QUESTADDBYITEM, number ); return true; } /// Äù½ºÆ® Æ÷±â - Äù½ºÆ® ui¿¡¼­ ½ÇÇàÇÔ void cQuestManager::QuestDelete( unsigned int arrIdx ) { if( IsNetLock() ) return; if( mTotalKeepCount == 0 ) return; /// ¹è¿­º¸´Ù Å©¸é ¿¡·¯ if( arrIdx >= mTotalKeepCount ) { assert(0); return; } /// ¼ÒÀ¯ÇÑ Äù½ºÆ®°¡ ¾Æ´Ô if( mQuest[arrIdx].questIdx == 0 ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 407 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, GAMEUI->GetQuestWindow() ); return; } cQuestDefine* define = GetQuestDefine( mQuest[arrIdx].questIdx ); if( !define ) { assert(0); return; } if( define->mType == eQUEST_TYPE_TUTORIAL ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 430 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, GAMEUI->GetQuestWindow() ); return; } MSG_REQ_QUEST_DEL msg; ::memset( &msg, 0, sizeof( msg ) ); msg.Category = NM_QUEST; msg.Protocol = NM_QUEST_DEL_REQ; msg.arrayIdx = arrIdx; msg.questIndex = mQuest[arrIdx].questIdx; NETWORK->SendNetworkMsg( (char*)&msg, sizeof(msg) ); /// ÀúÀå mCheckQuestIndex = mQuest[arrIdx].questIdx; NetLock( eLOCK_QUESTDELETE ); } void cQuestManager::QuestDeleteAuto( unsigned int arrIdx ) { if( mLockTry == eLOCK_QUESTDELETEAUTO ) return; if( mTotalKeepCount == 0 ) return; /// ¹è¿­º¸´Ù Å©¸é ¿¡·¯ if( arrIdx >= mTotalKeepCount ) { assert(0); return; } /// ¼ÒÀ¯ÇÑ Äù½ºÆ®°¡ ¾Æ´Ô if( mQuest[arrIdx].questIdx == 0 ) { assert(0); DeleteQuestTime( mQuest[arrIdx].questIdx ); return; } MSG_REQ_QUEST_DELAUTO msg; ::memset( &msg, 0, sizeof( msg ) ); msg.Category = NM_QUEST; msg.Protocol = NM_QUEST_DELAUTO_REQ; msg.arrayIdx = arrIdx; msg.questIndex = mQuest[arrIdx].questIdx; NETWORK->SendNetworkMsg( (char*)&msg, sizeof(msg) ); /// ÀúÀå mCheckQuestIndex = mQuest[arrIdx].questIdx; NetLock( eLOCK_QUESTDELETEAUTO ); } /// Äù½ºÆ® ¿Ï·á¿äû bool cQuestManager::QuestComplete( unsigned long questIdx, unsigned long npcIndex ) { if( IsNetLock() ) return false; if( npcIndex == 0 ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 447 ), GAMERESOURCEMAN->GetGameText( 301 ) ); assert(0); return false; } cQuestDefine* define = GetQuestDefine( questIdx ); if( !define ) { assert(0); return false; } /// ¼ÒÀ¯ÁßÀÎ Äù½ºÆ®ÀÎÁö °Ë»ç int arrIdx = GetQuestArrIdx( questIdx ); if( arrIdx == -1 ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 407 ), GAMERESOURCEMAN->GetGameText( 301 ) ); return false; } /// ÁøÇà¿Ï·á°¡´É »óÅÂÀÎÁö °Ë»ç if( mQuest[arrIdx].status != eQUEST_PLAYING ) { /// ÀÌ¹Ì ÁøÇà¿Ï·áÇÑ Äù½ºÆ® if( mQuest[arrIdx].status == eQUEST_COMPLETE ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 428 ), GAMERESOURCEMAN->GetGameText( 301 ) ); } /// ±× ¿ÜÀÇ À߸øµÈ »óÅ else { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 426 ), GAMERESOURCEMAN->GetGameText( 301 ) ); } return false; } /// cQuestReward* reward = define->mDefaultReward; if( reward ) { TCHAR temp[256]={0,}; /// ÀüÁ÷ ÄùÀÎÁö °Ë»ç if( reward->mChangeJobIndex > 0 ) { LPCTSTR jobStr = GAMERESOURCEMAN->GetJobName( reward->mChangeJobIndex ); ::_stprintf_s( temp, GAMERESOURCEMAN->GetGameText( 435 ), jobStr ); mTempQuestIndex = questIdx; mTempNpcIndex = npcIndex; mTempArrIndex = arrIdx; UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_QUEST_REWARDJOB, eSKIN_YESNO, temp, GAMERESOURCEMAN->GetGameText( 301 ) ); return true; } /// ¼¼·Â ÄùÀÎÁö °Ë»ç else if( reward->mForceType != eFORCETYPE_NONE ) { int textIdx = 0; switch( reward->mForceType ) { case eFORCETYPE_NONE: textIdx = 119; break; case eFORCETYPE_FIRE: textIdx = 120; break; case eFORCETYPE_WATER: textIdx = 121; break; case eFORCETYPE_WIND: textIdx = 122; break; case eFORCETYPE_EARTH: textIdx = 123; break; default: assert(0); return false; } LPCTSTR forceStr = UIMAN->GetUIText( textIdx ); ::_stprintf_s( temp, GAMERESOURCEMAN->GetGameText( 436 ), forceStr ); mTempQuestIndex = questIdx; mTempNpcIndex = npcIndex; mTempArrIndex = arrIdx; UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_QUEST_REWARDJOB, eSKIN_YESNO, temp, GAMERESOURCEMAN->GetGameText( 301 ) ); return true; } } /// º¸³»±â MSG_REQ_NPC_QUEST_COMPLETE msg; ::memset( &msg, 0, sizeof( msg ) ); msg.Category = NM_NPC; msg.Protocol = NM_NPC_QUEST_COMPLETE_REQ; msg.arrayIdx = arrIdx; msg.questIndex = questIdx; msg.npcIndex = npcIndex; NETWORK->SendNetworkMsg( (char*)&msg, sizeof(msg) ); /// ÀúÀå mCheckQuestIndex = questIdx; NetLock( eLOCK_QUESTCOMPLETE ); return true; } bool cQuestManager::QuestComplete() { if( !(mTempQuestIndex > 0 && mTempNpcIndex > 0) ) { assert(0); return false; } /// º¸³»±â MSG_REQ_NPC_QUEST_COMPLETE msg; ::memset( &msg, 0, sizeof( msg ) ); msg.Category = NM_NPC; msg.Protocol = NM_NPC_QUEST_COMPLETE_REQ; msg.arrayIdx = mTempArrIndex; msg.questIndex = mTempQuestIndex; msg.npcIndex = mTempNpcIndex; NETWORK->SendNetworkMsg( (char*)&msg, sizeof(msg) ); /// ÀúÀå mCheckQuestIndex = mTempQuestIndex; mTempQuestIndex = 0; mTempNpcIndex = 0; mTempArrIndex = 0; NetLock( eLOCK_QUESTCOMPLETE ); return true; } bool cQuestManager::QuestReward( unsigned long questIdx, unsigned long npcIndex ) { if( IsNetLock() ) return false; if( npcIndex == 0 ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 447 ), GAMERESOURCEMAN->GetGameText( 301 ) ); assert(0); return false; } cQuestDefine* define = GetQuestDefine( questIdx ); if( !define ) { assert(0); return false; } /// ¼ÒÀ¯ÁßÀÎ Äù½ºÆ®ÀÎÁö °Ë»ç int arrIdx = GetQuestArrIdx( questIdx ); if( arrIdx == -1 ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 407 ), GAMERESOURCEMAN->GetGameText( 301 ) ); return false; } /// ÁøÇà¿Ï·á¸¦ °ÅÄ£ Äù½ºÆ®ÀÎÁö °Ë»ç if( mQuest[arrIdx].status != eQUEST_COMPLETE ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 427 ), GAMERESOURCEMAN->GetGameText( 301 ) ); return false; } cNpcRewardWindow* pReward = GAMEUI->GetNpcRewardWindow(); if( !pReward ) { assert(0); return false; } /// º¸»ó °¹¼ö °Ë»ç if( define->mSelectCount != pReward->GetSelectCount() ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 413 ), GAMERESOURCEMAN->GetGameText( 301 ) ); return false; } /// ½½·Ô °Ë»ç¿ë sItemData itemData[10]; ::memset( itemData, 0, sizeof(itemData) ); unsigned int needCnt = 0; unsigned int totalWeight = 0; cQuestReward* defaultReward = define->mDefaultReward; if( defaultReward ) { for( int i = 0; i < 5; ++i, ++needCnt ) { if( defaultReward->mRewardItem[i].itemIndex == 0 ) break; itemData[needCnt].itemDefineIndex = defaultReward->mRewardItem[i].itemIndex; itemData[needCnt].count = (unsigned short)defaultReward->mRewardItem[i].count; /// º¸»ó ¾ÆÀÌÅÛ ¹«°Ô ±¸Çϱâ. cItemDefine* pItemDefine = ITEMMAN->GetItemDefine( itemData[needCnt].itemDefineIndex ); if( pItemDefine ) totalWeight += pItemDefine->GetWeight() * itemData[needCnt].count; else { assert( 0 && "bad item" ); return false; } } } /// ¼±Åà º¸»óÀÎ °æ¿ì sRewardData selectData[5]; ::memset( selectData, 0, sizeof(selectData) ); unsigned int rowCount = 0; if( define->mSelectCount > 0 ) { /// ¼±Åà º¸»óÀÎ °æ¿ì sRewardIcon* data = pReward->GetSelectData(); for( unsigned int i = 0; i < 5; ++i, ++data ) { cIcon* icon = data->icon; if( icon && data->select == true ) { selectData[rowCount].type = ( icon->GetIconType() == eICON_ITEM )? eREWARD_ITEM : eREWARD_SKILL; selectData[rowCount].index = data->index; itemData[needCnt].itemDefineIndex = data->index; itemData[needCnt].count = (unsigned short)icon->GetNumber(); /// º¸»ó ¾ÆÀÌÅÛ ¹«°Ô ±¸Çϱâ. if( selectData[rowCount].type == eREWARD_ITEM ) { cItemDefine* pItemDefine = ITEMMAN->GetItemDefine( itemData[needCnt].itemDefineIndex ); if( pItemDefine ) totalWeight += pItemDefine->GetWeight() * itemData[needCnt].count; else { assert( 0 && "bad item" ); return false; } } // needCnt++; if( rowCount < define->mSelectCount ) rowCount++; } } } // º¸»ó°ü·Ã ¾ÆÀÌÅÛÀÌ ÀÖÀ»¶§¸¸ °Ë»çÇϱâ if( totalWeight > 0 ) { // ¹«°Ô°Ë»ç if( HERO->GetMaxWeight() < ITEMMAN->GetWeight() + totalWeight ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 208 ), GAMERESOURCEMAN->GetGameText( 301 ) ); return false; } /// ºó½½·Ô °Ë»ç unsigned int emptySlotCnt = 0; for( unsigned short slot = INVENTORY_BAG0_BEGIN; slot <= HERO->GetBagEndSlot(); ++slot ) { /// ºó½½·Ô °Ë»ç cItem* item = ITEMMAN->GetItem( slot ); if( item && item->GetIndex() == 0 ) { emptySlotCnt++; /// ºó½½·ÔÀÌ ´õ ¸¹À¸¸é Åë°ú if( emptySlotCnt >= needCnt ) break; } } /// ½½·ÔÀÌ ºÎÁ·ÇÒ¶§ °ãÄ¡±â °Ë»çµµ ÇÑ´Ù if( emptySlotCnt < needCnt ) { for( unsigned int i = 0; i < needCnt; ++i ) { unsigned long itemIndex = itemData[i].itemDefineIndex; unsigned int count = itemData[i].count; cItemDefine* define = ITEMMAN->GetItemDefine( itemIndex ); if( !define ) { assert(0); continue; } for( unsigned short slot = INVENTORY_BAG0_BEGIN; slot <= HERO->GetBagEndSlot(); ++slot ) { /// °ãÄ¡´Â ½½·Ô cItem* item = ITEMMAN->GetItem( slot ); if( item && item->GetIndex() == itemIndex ) { int remainCnt = define->GetCapacity() - item->GetCount(); count -= remainCnt; if( count <= 0 ) break; } } /// ´Ù ¸øÃ£À¸¸é ºó½½·Ô »ç¿ëÇϱâ if( count > 0 ) { emptySlotCnt--; if( emptySlotCnt < 0 ) { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 202 ), GAMERESOURCEMAN->GetGameText( 301 ) ); return false; } } } } } /// º¸³»±â MSG_REQ_NPC_QUEST_REWARD msg; ::memset( &msg, 0, sizeof( msg ) ); msg.Category = NM_NPC; msg.Protocol = NM_NPC_QUEST_REWARD_REQ; msg.arrayIdx = arrIdx; msg.questIndex = questIdx; msg.npcIndex = npcIndex; msg.rowCount = pReward->GetSelectCount(); if( define->mSelectCount > 0 ) { for( unsigned int i = 0; i < rowCount; ++i ) { msg.table[i].type = selectData[i].type; msg.table[i].index = selectData[i].index; } } NETWORK->SendNetworkMsg( (char*)&msg, sizeof(MSG_REQ_NPC_QUEST_REWARD) ); /// ÀúÀå mCheckQuestIndex = questIdx; NetLock( eLOCK_QUESTREWARD ); return true; } /// ½Å±Ô Äù½ºÆ® ½ÂÀÎ °á°ú void cQuestManager::ResQuestAdd( MSG_RES_QUEST_ADD* pmsg ) { switch( pmsg->ErrorCode ) { case ERROR_QUEST_ADD_SUCCESS: { sQuestList* table = &pmsg->table; sQuestList* quest = mQuest + mTotalKeepCount; /// ÀúÀå (*quest) = (*table); mTotalKeepCount++; /// UI ¾÷µ¥ÀÌÆ® UpdateUI(); /// °¢ ¸Ê¿¡ Æ÷ÇÔµÈ Äù½ºÆ® °¹¼ö °»½Å CheckCountMap(); /// »õ·Î Ãß°¡µÈ Äù½ºÆ®¸¦ ±âº»¼±Åà ó¸® AddQuestSelect( quest->questIdx, true ); // mChaseQuestIndex = quest->questIdx; UpdateChaseQuest( mChaseQuestIndex ); /// cQuestDefine* define = GetQuestDefine( quest->questIdx ); if( define ) { sNPCList* npcInfo = NPCSCRIPT->GetNPCList( define->mGiveNpcIndex ); if( npcInfo ) { if( npcInfo->mType == eNPCTYPE_NORMAL ) { /// NPC Àå¸éÀ©µµ¿ì °»½Å cNpcWindow* npcWin = GAMEUI->GetNpcWindow(); if( npcWin ) npcWin->UpdateDialog(); } else if( npcInfo->mType == eNPCTYPE_TUTORIALBOOK ) { cNpcTutorialWindow* win = GAMEUI->GetNpcTutorialWindow(); if( win ) win->UpdateDialog(); } } // LPCTSTR title = GAMERESOURCEMAN->GetQuestTitle( define->mTitleIndex ); cStringT str; str.Format( GAMERESOURCEMAN->GetGameText( 400 ), title ); CHATMANAGER->AddSystemMsg( eSYSTEM_QUEST, (LPCTSTR)str.Cstr() ); } /// ½Ã°£Á¤º¸ ÀúÀå if( quest->status == eQUEST_PLAYING ) AddQuestTime( quest->questIdx, quest->restTime ); if( mChaseQuestIndex == quest->questIdx ) mChaseQuestIndex = 0; } break; case ERROR_QUEST_ADD_FAIL: // ½ÇÆÐ - ¾Ë¼ö ¾ø´Â ¿À·ù UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 401 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_ADD_NOTYET: // ½ÇÆÐ - DB »ç¿ëÁß UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 401 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_ADD_EXIST: // ½ÇÆÐ - ÀÌ¹Ì ÇØ´ç Äù½ºÆ®¸¦ °¡Áö°íÀÖÀ½ UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 402 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_ADD_COMPLETE: // ½ÇÆÐ - ÀÌ¹Ì ¿Ï·áÇÑ Äù½ºÆ® UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 403 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_ADD_TRIGGER: // ½ÇÆÐ - Äù½ºÆ® ¹ÞÀ» Á¶°ÇÀÌ ¾ÈµÊ UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 404 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_ADD_MAX: // ½ÇÆÐ - Äù½ºÆ® ¸ñ·ÏÀÌ FULL UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 405 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_ADD_ITEM: /// ½ÇÆÐ - Àκ¥ ºÎÁ· UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 409 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_ADD_NPC: UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 420 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_ADD_TIME: UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 437 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_ADD_MONEY: UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 438 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_ADD_POINT: UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 439 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_ADD_MAX_ITEM: UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 220 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; default: assert(0); break; } NetUnLock( eLOCK_QUESTADD ); } /// Äù½ºÆ® ÁøÇà¿Ï·á ¿äû °á°ú void cQuestManager::ResQuestComplete( MSG_RES_NPC_QUEST_COMPLETE* pmsg ) { switch( pmsg->ErrorCode ) { case ERROR_QUEST_COMPLETE_SUCCESS: // ¼º°ø - ÁøÇà ¿Ï·á ¿äû ¼º°ø { /// »óÅ Á¤º¸ °»½Å sQuestList* quest = mQuest + pmsg->arrayIdx; if( quest->questIdx > 0 ) { quest->status = pmsg->status; /// ÁøÇà¿Ï·á CHATMANAGER->AddSystemMsg( eSYSTEM_QUEST, GAMERESOURCEMAN->GetGameText( 406 ) ); cQuestDefine* define = GetQuestDefine( quest->questIdx ); if( define ) { sNPCList* npcInfo = NPCSCRIPT->GetNPCList( define->mTakeNpcIndex ); if( npcInfo ) { if( npcInfo->mType == eNPCTYPE_NORMAL ) { /// NPC Àå¸éÀ©µµ¿ì °»½Å cNpcWindow* npcWin = GAMEUI->GetNpcWindow(); if( npcWin ) npcWin->UpdateDialog(); } else if( npcInfo->mType == eNPCTYPE_TUTORIALBOOK ) { cNpcTutorialWindow* win = GAMEUI->GetNpcTutorialWindow(); if( win ) win->UpdateDialog(); } } } if( OPTIONMAN->IsAutoSendTwitterMsg() == true ) { cQuestReward* reward = define->mDefaultReward; if( reward ) { if( reward->mChangeJobIndex > 0 ) { cTwitterWindow* pTwitWin = GAMEUI->GetTwitterWindow(); if( pTwitWin ) { if( pTwitWin->IsLogin() == true ) { sTwitterEvent tEvent; tEvent.mEvent = eTWITEVENT_QUEST; tEvent.mExData = (void*)reward->mChangeJobIndex; pTwitWin->AddEvent( tEvent ); } } else { assert(0); } } } } /// Äù½ºÆ® ¿Ï·á È¿°ú NiTransform trans; trans.MakeIdentity(); trans.m_Translate = NiPoint3( 0.0f, 0.0f, 50.0f ); HERO->SetLinkdEffect( eLINK_HEAD2, "./Data/Effect/eff_pc_get_05.nif",&trans, false, true ); SOUNDSYS->Play2DSound( 2012 ); if( mChaseQuestIndex == quest->questIdx ) mChaseQuestIndex = 0; } } break; case ERROR_QUEST_COMPLETE_NOTYET: // ½ÇÆÐ - DB »ç¿ëÁß case ERROR_QUEST_COMPLETE_FAIL: // ½ÇÆÐ - ¿À·ù UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 424 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_COMPLETE_POSSIBLE: // ½ÇÆÐ - ¿Ï·áÁ¶°Ç ¾Æ´Ô UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 421 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_COMPLETE_TAKE: // ½ÇÆÐ - ¾ÆÀÌÅÛ È¸¼ö ½ÇÆÐ UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 423 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_COMPLETE_NPC: // ½ÇÆÐ - NPC ÀÎÁõ UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 420 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_COMPLETE_TIME: // ½ÇÆÐ - ½Ã°£Á¦ÇÑ ¿À¹ö UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 425 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_COMPLETE_ALREADY: // ½ÇÆÐ - ÀÌ¹Ì ¿Ï·áÇÑ Äù½ºÆ® UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 424 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; case ERROR_QUEST_COMPLETE_TUTORIALMODE: UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 417 ), GAMERESOURCEMAN->GetGameText( 301 ) ); break; } NetUnLock( eLOCK_QUESTCOMPLETE ); /// ÃʱâÈ­ mCheckQuestIndex = ULONG_MAX; } /// Äù½ºÆ® º¸»ó ¿äû °á°ú void cQuestManager::ResQuestReward( MSG_RES_NPC_QUEST_REWARD* pmsg ) { switch( pmsg->ErrorCode ) { case ERROR_QUEST_REWARD_SUCCESS: // ¼º°ø - ¿Ï·á ¿äû ¼º°ø { cQuestDefine* define = GetQuestDefine( mCheckQuestIndex ); if( define ) { sNPCList* npcInfo = NPCSCRIPT->GetNPCList( define->mTakeNpcIndex ); if( npcInfo ) { if( npcInfo->mType == eNPCTYPE_NORMAL ) { /// NPC Àå¸éÀ©µµ¿ì °»½Å cNpcWindow* npcWin = GAMEUI->GetNpcWindow(); if( npcWin ) npcWin->UpdateDialog(); } else if( npcInfo->mType == eNPCTYPE_TUTORIALBOOK ) { cNpcTutorialWindow* win = GAMEUI->GetNpcTutorialWindow(); if( win ) win->UpdateDialog(); } } } CHATMANAGER->AddSystemMsg( eSYSTEM_QUEST, GAMERESOURCEMAN->GetGameText( 429 ) ); } break; case ERROR_QUEST_REWARD_NOTYET: // ½ÇÆÐ - DB »ç¿ëÁß case ERROR_QUEST_REWARD_FAIL: // ½ÇÆÐ - ¿À·ù { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 424 ), GAMERESOURCEMAN->GetGameText( 301 ) ); } break; case ERROR_QUEST_REWARD_ITEM: // ½ÇÆÐ - ¾ÆÀÌÅÛ º¸»ó Áö±Þ ½ÇÆÐ { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 422 ), GAMERESOURCEMAN->GetGameText( 301 ) ); } break; case ERROR_QUEST_REWARD_MAX_ITEM: // ½ÇÆÐ - ¿À·ù { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 220 ), GAMERESOURCEMAN->GetGameText( 301 ) ); } break; case ERROR_QUEST_REWARD_MONEY: // ½ÇÆÐ - º¸»ó ±Ý¾× Áö±Þ ½ÇÆÐ { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 414 ), GAMERESOURCEMAN->GetGameText( 301 ) ); } break; case ERROR_QUEST_REWARD_COUNT: // ½ÇÆÐ - ¼±Åð¹¼ö ÀûÀ½ { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 413 ), GAMERESOURCEMAN->GetGameText( 301 ) ); } break; case ERROR_QUEST_REWARD_NPC: // ½ÇÆÐ - NPC ÀÎÁõ { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 420 ), GAMERESOURCEMAN->GetGameText( 301 ) ); } break; case ERROR_QUEST_REWARD_COMPLETE: // ½ÇÆÐ - ÁøÇà¿Ï·á»óÅ ¾Æ´Ô { UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 427 ), GAMERESOURCEMAN->GetGameText( 301 ) ); } break; default: assert(0); break; } NetUnLock( eLOCK_QUESTREWARD ); /// ÃʱâÈ­ mCheckQuestIndex = ULONG_MAX; } /// Load, MapChange ½Ã¿¡ ¿À´Â ¸Þ¼¼Áö ó¸® void cQuestManager::NetworkMsgParserLoad( char* msg ) { MSGROOT* tempMsg = (MSGROOT*)msg; if( tempMsg->Protocol == NM_QUEST_LIST_RES ) { MSG_RES_QUEST_LIST* pmsg = (MSG_RES_QUEST_LIST*)msg; /// ÃʱâÈ­ memset( mQuest, 0, sizeof(mQuest) ); ClearQuestTime(); mTotalKeepCount = 0; mCompleteCount = 0; mProgressCount = 0; if( pmsg->rowCount > 0 ) { /// ÀӽûðÀÔ sQuestList* quest = mQuest; sQuestList* table = pmsg->table; for( unsigned char i = 0; i < pmsg->rowCount; i++, table++, quest++ ) { (*quest) = (*table); /// ½Ã°£¸Ê¿¡ ÀúÀå if( quest->status == eQUEST_PLAYING ) AddQuestTime( quest->questIdx, quest->restTime ); } mTotalKeepCount = pmsg->rowCount; /// °¢ ¸Ê¿¡ Æ÷ÇÔµÈ Äù½ºÆ® °¹¼ö °»½Å CheckCountMap(); } } } /// void cQuestManager::NetworkMsgParser( char* msg ) { MSGROOT* tempMsg = (MSGROOT*)msg; switch( tempMsg->Protocol ) { case NM_QUEST_LIST_RES: /// Äù½ºÆ®¸®½ºÆ®, Äù½ºÆ®»èÁ¦½Ã »õ·Î ¿Â´Ù { MSG_RES_QUEST_LIST* pmsg = (MSG_RES_QUEST_LIST*)msg; /// ÃʱâÈ­ memset( mQuest, 0, sizeof(mQuest) ); mTotalKeepCount = 0; if( pmsg->rowCount > 0 ) { /// ÀӽûðÀÔ sQuestList* quest = mQuest; sQuestList* table = pmsg->table; for( unsigned char i = 0; i < pmsg->rowCount; i++, table++ ) { (*quest) = (*table); quest++; } mTotalKeepCount = pmsg->rowCount; } /// °¢ ¸Ê¿¡ Æ÷ÇÔµÈ Äù½ºÆ® °¹¼ö °»½Å CheckCountMap(); /// UI ¾÷µ¥ÀÌÆ® UpdateUIAll(); } break; case NM_QUEST_UPDATE_SYN: { /// Äù½ºÆ® ÁøÇàÁ¤º¸ ¾÷µ¥ÀÌÆ® ¹ÞÀ½ MSG_RES_QUEST_UPDATE* pmsg = (MSG_RES_QUEST_UPDATE*)msg; cQuestWindow* window = GAMEUI->GetQuestWindow(); sQuestList* table = pmsg->table; for( unsigned char i = 0; i < pmsg->rowCount; i++, table++ ) { sQuestList* quest = mQuest + pmsg->table[i].arrIdx; /// ¾÷µ¥ÀÌÆ® µÈ ³»¿ë Ãâ·Â ActiveQuestText( quest, table ); /// ¾÷µ¥ÀÌÆ® (*quest) = (*table); /// UI °»½Å cQuestDefine* define = GetQuestDefine( quest->questIdx ); if( window && define ) { window->UpdateQuestInfo(); /// ¿Ï·áµÈ Äù½ºÆ®À̸é Äù½ºÆ®À©µµ¿ìÀÇ ¸®½ºÆ®µµ °»½Å if( quest->check == define->mComplete ) window->SetCompleteQuest( quest->arrIdx, quest->questIdx ); } } /// °¹¼ö °»½Å CheckQuestCount(); if( pmsg->rowCount > 0 ) { UpdateNpcStatus(); } } break; case NM_QUEST_DEL_RES: { /// Äù½ºÆ® »èÁ¦ ¿äû¿¡ ´ëÇÑ °á°ú MSG_RES_QUEST_DEL* pmsg = (MSG_RES_QUEST_DEL*)msg; switch( pmsg->ErrorCode ) { case ERROR_QUEST_DEL_SUCCESS: if( mCheckQuestIndex != ULONG_MAX ) { cQuestDefine* define = GetQuestDefine( mCheckQuestIndex ); if( define ) { cStringT str; str.Format( GAMERESOURCEMAN->GetGameText( 410 ), GAMERESOURCEMAN->GetQuestTitle( define->mTitleIndex )); CHATMANAGER->AddSystemMsg( eSYSTEM_QUEST, (LPCTSTR)str.Cstr() ); } else assert(0); if( mChaseQuestIndex == mCheckQuestIndex ) mChaseQuestIndex = 0; /// ½Ã°£Á¤º¸ »èÁ¦ DeleteQuestTime( mCheckQuestIndex ); } else assert(0); break; case ERROR_QUEST_DEL_NOTYET: // ½ÇÆÐ - DB »ç¿ëÁß UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 411 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, GAMEUI->GetQuestWindow() ); break; case ERROR_QUEST_DEL_FAIL: // ½ÇÆÐ - ¿À·ù UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 411 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, GAMEUI->GetQuestWindow() ); break; case ERROR_QUEST_DEL_QUEST: // ½ÇÆÐ - À߸øµÈ Äù½ºÆ® UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 412 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, GAMEUI->GetQuestWindow() ); break; default: assert(0); break; } NetUnLock( eLOCK_QUESTDELETE ); /// ÃʱâÈ­ mCheckQuestIndex = ULONG_MAX; } break; case NM_QUEST_DELAUTO_RES: /// ³²Àº½Ã°£ ¾øÀ»¶§ ÀÚµ¿»èÁ¦ { /// Äù½ºÆ® »èÁ¦ ¿äû¿¡ ´ëÇÑ °á°ú MSG_RES_QUEST_DEL* pmsg = (MSG_RES_QUEST_DEL*)msg; /// ÀÚµ¿ »èÁ¦ °á°ú ¾Ë¸² if( pmsg->ErrorCode == ERROR_QUEST_DELAUTO_SUCCESS ) { /// ½Ã°£Á¤º¸ »èÁ¦ if( mCheckQuestIndex != ULONG_MAX ) { DeleteQuestTime( mCheckQuestIndex ); cQuestDefine* define = GetQuestDefine( mCheckQuestIndex ); if( define ) { cStringT str; str.Format( GAMERESOURCEMAN->GetGameText( 415 ), GAMERESOURCEMAN->GetQuestTitle( define->mTitleIndex )); CHATMANAGER->AddSystemMsg( eSYSTEM_QUEST, (LPCTSTR)str.Cstr() ); UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, (LPCTSTR)str.Cstr(), GAMERESOURCEMAN->GetGameText( 301 ) ); } else assert(0); if( mChaseQuestIndex == mCheckQuestIndex ) mChaseQuestIndex = 0; } else assert(0); cNpcWindow* npcWin = GAMEUI->GetNpcWindow(); if( npcWin && npcWin->IsVisible() == true ) npcWin->Hide(); /// Äù½ºÆ® ½ÇÆÐ È¿°ú HERO->SetLinkdEffect( eLINK_FOOT, "./Data/Effect/Eff_Mon_Regen_01.nif", 0 ); } else { assert(0); } NetUnLock( eLOCK_QUESTDELETEAUTO ); /// ÃʱâÈ­ mCheckQuestIndex = ULONG_MAX; } break; case NM_QUEST_ADDBYITEM_RES: { /// ÀÇ·Ú¾ÆÀÌÅÛÀ¸·Î Äù½ºÆ® ºÎ¿© MSG_RES_QUEST_ADDBYITEM* pmsg = (MSG_RES_QUEST_ADDBYITEM*)msg; switch( pmsg->ErrorCode ) { case ERROR_QUEST_ADD_SUCCESS: // ¼º°ø - ÀÇ·Ú¾ÆÀÌÅÛ »ç¿ë { sQuestList* table = &pmsg->table; sQuestList* quest = mQuest + mTotalKeepCount; /// ÀúÀå (*quest) = (*table); mTotalKeepCount++; UpdateUI(); /// °¢ ¸Ê¿¡ Æ÷ÇÔµÈ Äù½ºÆ® °¹¼ö °»½Å CheckCountMap(); /// »õ·Î Ãß°¡µÈ Äù½ºÆ®¸¦ ±âº»¼±Åà ó¸® AddQuestSelect( table->questIdx, true ); // mChaseQuestIndex = table->questIdx; UpdateChaseQuest( mChaseQuestIndex ); cQuestDefine* define = GetQuestDefine( quest->questIdx ); if( define ) { LPCTSTR title = GAMERESOURCEMAN->GetQuestTitle( define->mTitleIndex ); cStringT str; str.Format( GAMERESOURCEMAN->GetGameText( 400 ), title ); CHATMANAGER->AddSystemMsg( eSYSTEM_QUEST, (LPCTSTR)str.Cstr() ); } /// ½Ã°£Á¤º¸ ÀúÀå if( quest->status == eQUEST_PLAYING ) AddQuestTime( quest->questIdx, quest->restTime ); // â ¿­±â cUIWindow* win = (cUIWindow*)GAMEUI->GetQuestWindow(); if( win && win->IsVisible() == false ) win->Show(); } break; case ERROR_QUEST_ADD_FAIL: // ½ÇÆÐ - Äù½ºÆ® UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 401 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; case ERROR_QUEST_ADD_NOTYET: // ½ÇÆÐ - DB »ç¿ëÁß UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 401 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; case ERROR_QUEST_ADD_EXIST: // ½ÇÆÐ - ÀÌ¹Ì ÇØ´ç Äù½ºÆ®¸¦ °¡Áö°íÀÖÀ½ UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 402 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; case ERROR_QUEST_ADD_COMPLETE: // ½ÇÆÐ - ÀÌ¹Ì ¿Ï·áÇÑ Äù½ºÆ® UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 403 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; case ERROR_QUEST_ADD_TRIGGER: // ½ÇÆÐ - Äù½ºÆ® ¹ÞÀ» Á¶°ÇÀÌ ¾ÈµÊ UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 404 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; case ERROR_QUEST_ADD_MAX: // ½ÇÆÐ - Äù½ºÆ® ¸ñ·ÏÀÌ FULL UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 405 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; case ERROR_QUEST_ADD_ITEM: // ½ÇÆÐ - Äù½ºÆ® Á¦°ø¾ÆÀÌÅÛ ¹ÞÀ»¼ö ¾øÀ½ UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 409 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; case ERROR_QUEST_ADD_TIME: UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 437 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; case ERROR_QUEST_ADD_MONEY: UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 438 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; case ERROR_QUEST_ADD_POINT: UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 439 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; case ERROR_QUEST_ADD_ITEMFAIL: // ½ÇÆÐ - ¾ÆÀÌÅÛ UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 225 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; case ERROR_QUEST_ADD_COOLTIME: // ½ÇÆÐ - ¾ÆÀÌÅÛ ÄðŸÀÓ UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 226 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; case ERROR_QUEST_ADD_TUTORIALMODE: UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODAL, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 417 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; case ERROR_QUEST_ADD_MAX_ITEM: UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 220 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; case ERROR_QUEST_ADD_LICENSE: UIMAN->CreateMsgBox( eStage_Game, eMSGBOX_MODALLESS, eMBEVENT_NONE, eSKIN_OK, GAMERESOURCEMAN->GetGameText( 293 ), GAMERESOURCEMAN->GetGameText( 301 ), 0, (cUIWindow*)GAMEUI->GetInventoryWindow() ); break; default: assert(0); break; } /// Äù½ºÆ® ¾ð¶ô NetUnLock( eLOCK_QUESTADDBYITEM ); } break; case NM_QUEST_NEWLIST_SYN: { // ½Å±Ô Äù½ºÆ® ¸ñ·Ï MSG_SYN_NEWQUESTLIST* pmsg = (MSG_SYN_NEWQUESTLIST*)msg; // ÃʱâÈ­ mNewQuestSet.Clear(); mNewEventQuestSet.Clear(); // ½Å±Ô Äù½ºÆ® ¸ñ·Ï ÀúÀå // - À̺¥Æ®¿ë°ú ¾Æ´Ñ°ÍÀ» ±¸ºÐÇÑ´Ù if( pmsg->rowCount > 0 ) { for( unsigned short i = 0; i < pmsg->rowCount; ++i ) { unsigned long questIndex = pmsg->questIdxList[i]; cQuestDefine* define = GetQuestDefine( questIndex ); if( define ) { // ÀÏ¹Ý if( define->mEventType == eQUEST_MAX ) { mNewQuestSet.Insert( questIndex ); } // À̺¥Æ®¿ë else { mNewEventQuestSet.Insert( questIndex ); } } else assert(0); } } // npcµéÀÇ »óŸ¦ °»½ÅÇÑ´Ù UpdateNpcStatus(); // Äù½ºÆ® °ü·Ã UI °»½Å if( HERO->GetNpcFunc() == NPC_FUNC_BOARD ) { SetBoardQuestList(); } } break; case NM_QUEST_NEWLISTEVENT_SYN: { // À̺¥Æ®¿ë ½Å±Ô Äù½ºÆ® ¸ñ·Ï MSG_SYN_NEWQUESTLIST* pmsg = (MSG_SYN_NEWQUESTLIST*)msg; // ÃʱâÈ­ mNewEventQuestSet.Clear(); // ½Å±Ô À̺¥Æ® Äù½ºÆ® ¸ñ·Ï ÀúÀå if( pmsg->rowCount > 0 ) { for( unsigned short i = 0; i < pmsg->rowCount; ++i ) { unsigned long questIndex = pmsg->questIdxList[i]; cQuestDefine* define = GetQuestDefine( questIndex ); if( define ) { // À̺¥Æ®¿ë if( define->mEventType != eQUEST_MAX ) { mNewEventQuestSet.Insert( questIndex ); } else assert(0); } else assert(0); } } // npcµéÀÇ »óŸ¦ °»½ÅÇÑ´Ù UpdateNpcStatus(); // Äù½ºÆ® °ü·Ã UI °»½Å if( HERO->GetNpcFunc() == NPC_FUNC_BOARD ) { SetBoardQuestList(); } } break; case NM_QUEST_NEXT_LEVEL_NEWLIST_SYN: case NM_QUEST_NEXT_LEVEL_NEWLISTEVENT_SYN: { // °í·¹º§ Äù½ºÆ® ¸ñ·Ï MSG_SYN_NEXT_LEVEL_NEWQUESTLIST* pmsg = (MSG_SYN_NEXT_LEVEL_NEWQUESTLIST*)msg; typedef tHashSet cQuestSet; cQuestSet tempQuestSet; // °í·¹º§ Äù½ºÆ® ¸ñ·Ï ÀúÀå for( unsigned short i = 0; i < pmsg->rowCount; ++i ) { unsigned long questIndex = pmsg->questIdxList[i]; cQuestDefine* define = GetQuestDefine( questIndex ); if( define ) { tempQuestSet.Insert( questIndex ); } else assert(0); } /// °¢ npc »óÅ Á¤º¸ °»½Å cNpcStatusMap::cIterator i = mNpcStatusMap.Begin(); cNpcStatusMap::cIterator end = mNpcStatusMap.End(); for( ; i != end; ++i ) { unsigned long npcIndex = (unsigned long)(i->mFirst); sNpcStausData* p = (sNpcStausData*)(i->mSecond); if( p ) { // ÀÏ¹Ý npc À϶§¸¸ Äù½ºÆ® »óÅ ó¸® sNPCList* npcInfo = NPCSCRIPT->GetNPCList( p->npcClassIndex ); if( npcInfo && npcInfo->mType <= eNPCTYPE_TUTORIALBOOK ) { sNpcQuestList* list = GetNpcQuestMap( p->npcClassIndex ); if( !list ) continue; /// npc »óŰ¡ ¾ø°Å³ª Àú·¹º§ Äù½ºÆ® »óÅÂÀ϶§¸¸ °í·¹º§ Äù½ºÆ® ÀÌÆåÆ® Ç¥½Ã°¡ °¡´ÉÇÏ´Ù(´Ù¸¥ »óÅ¿¡¼­´Â ¿ì¼±¼øÀ§¿¡¼­ ¹Ð¸²) if( p->effectType == eNPCQUEST_EFFECT_NONE || p->effectType == eNPCQUEST_EFFECT_LOW_LEVEL_NEW ) { cQuestSet::cIterator s = list->mQuestSet.Begin(); cQuestSet::cIterator send = list->mQuestSet.End(); for( ; s != send; ++s ) { unsigned long newIndex = (unsigned long)(*s); // °í·¹º§ Äù½ºÆ® ¸ñ·Ï Áß ÇØ´ç npc°¡ Á¦°øÇÏ´Â Äù½ºÆ®°¡ ÀÖÀ¸¸é if( tempQuestSet.Find( newIndex ) != tempQuestSet.End() ) { p->effectType = eNPCQUEST_EFFECT_NEXT_LEVEL_NEW; /// NPC °»½Å cNpc* pNpc = OBJECTMANAGER->GetNpc( npcIndex ); if( pNpc ) { pNpc->SetQuestEffect( eNPCQUEST_EFFECT_NEXT_LEVEL_NEW ); } /// ¹Ì´Ï¸Ê °»½Å cSmallMiniMapWindow* smini = GAMEUI->GetSmallMinimapWindow(); cMiniMapWindow* mini = GAMEUI->GetMinimapWindow(); if( smini && mini ) { smini->UpdateNpcEffect( npcIndex, eNPCQUEST_EFFECT_NEXT_LEVEL_NEW ); mini->UpdateNpcEffect( npcIndex, eNPCQUEST_EFFECT_NEXT_LEVEL_NEW ); } } } } else continue; } } else assert(0); } } break; default: assert(0); break; } } /// °»½Å void cQuestManager::ActiveQuestText( sQuestList* oldQuest, sQuestList* newQuest ) { if( !oldQuest || !newQuest ) { assert(0); return; } if( oldQuest->questIdx != newQuest->questIdx ) { assert(0); return; } /// Äù½ºÆ® Á¤º¸ cQuestDefine* define = GetQuestDefine( oldQuest->questIdx ); if( !define ) { assert(0); return; } cQuestDuty* duty = define->mQuestDuty; if( !duty ) return; /// ´Þ¶óÁø ³»¿ëÀ» Ãâ·ÂÇÑ´Ù if( oldQuest->check == newQuest->check ) return; __int64 changedata = newQuest->check - oldQuest->check; __int64 end = 0xFF; cStringT str; /// ¹Ù²ïµ¥ÀÌÅÍÀÇ ¹Ù²ï ºÎºÐÀ» Ãâ·ÂÇÑ´Ù 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; /// °»½ÅÀÌ µÈ ³»¿ë¸¸ Ãâ·Â if( (changedata & end) > 0 ) { switch( type ) { case eDUTY_HUNT: { LPCTSTR monName = GAMERESOURCEMAN->GetMonsterName( targetIdx ); str.Format( GAMERESOURCEMAN->GetGameText( 451 ), monName, count ); /// ¿Ï·á if( (newQuest->check & end) == (define->mComplete & end) ) { str.Append( GAMERESOURCEMAN->GetGameText( 445 ) ); } /// ÁøÇàÁß else { __int64 cnt = (newQuest->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; } HERO->ActiveQuestText( (LPCTSTR)str.Cstr(), COLOR_WHITE ); } break; case eDUTY_COLLECT: { LPCTSTR itemName = ITEMMAN->GetItemName( targetIdx ); str.Format( GAMERESOURCEMAN->GetGameText( 453 ), itemName, count ); /// ¿Ï·á if( (newQuest->check & end) == (define->mComplete & end) ) str.Append( GAMERESOURCEMAN->GetGameText( 445 ) ); /// ÁøÇàÁß else { __int64 cnt = (newQuest->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; } HERO->ActiveQuestText( (LPCTSTR)str.Cstr(), COLOR_WHITE ); } break; case eDUTY_ACTIVESKILL: { LPCTSTR skillName = GAMERESOURCEMAN->GetSkillNameText( skillIndex ); LPCTSTR monName = GAMERESOURCEMAN->GetMonsterName( targetIdx ); str.Format( GAMERESOURCEMAN->GetGameText( 456 ), skillName, monName ); /// ¿Ï·á if( (newQuest->check & end) == (define->mComplete & end) ) { str.Append( GAMERESOURCEMAN->GetGameText( 445 ) ); } HERO->ActiveQuestText( (LPCTSTR)str.Cstr(), COLOR_WHITE ); } break; case eDUTY_ENHANCE: { str.Format( GAMERESOURCEMAN->GetGameText( 457 ) ); /// ¿Ï·á if( (newQuest->check & end) == (define->mComplete & end) ) { str.Append( GAMERESOURCEMAN->GetGameText( 445 ) ); } HERO->ActiveQuestText( (LPCTSTR)str.Cstr(), COLOR_WHITE ); } break; case eDUTY_PUTCARD: { str.Format( GAMERESOURCEMAN->GetGameText( 458 ) ); /// ¿Ï·á if( (newQuest->check & end) == (define->mComplete & end) ) { str.Append( GAMERESOURCEMAN->GetGameText( 445 ) ); } HERO->ActiveQuestText( (LPCTSTR)str.Cstr(), COLOR_WHITE ); } 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( (newQuest->check & end) == (define->mComplete & end) ) { str.Append( GAMERESOURCEMAN->GetGameText( 445 ) ); } /// ÁøÇàÁß else { __int64 cnt = (newQuest->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; } HERO->ActiveQuestText( (LPCTSTR)str.Cstr(), COLOR_WHITE ); } break; } } /// ¿Ï·á üũ¿ë end = end << 8; } } /// ³²Àº½Ã°£ ȹµæ long cQuestManager::GetQuestRestTime( unsigned long questIdx ) { sQuestTime* p = (sQuestTime*)mTimeMap.GetAt( questIdx ); return ( p ) ? p->restTime : 0; } /// Äù½ºÆ® ³²Àº½Ã°£ÀúÀå void cQuestManager::AddQuestTime( unsigned long questIdx, unsigned long restTime ) { cQuestDefine* define = GetQuestDefine( questIdx ); if( !define ) return; /// ½Ã°£Ã¼Å©¿ë Äù½ºÆ®¸¸ ÀúÀå cQuestLimit* limit = define->mQuestLimit; if( limit && limit->mTimeType != eTIME_NONE ) { sQuestTime* p = new sQuestTime; p->restTime = restTime; p->startTime = THEAPP->GetWorldAccumTime(); /// ½Ã°£¸Ê¿¡ ÀúÀå if( mTimeMap.Insert( questIdx, p ) == false ) { assert(0); return; } } } /// »èÁ¦ void cQuestManager::DeleteQuestTime( unsigned long questIdx ) { sQuestTime* p = (sQuestTime*)mTimeMap.GetAt( questIdx ); if( p ) { mTimeMap.Erase( questIdx ); SAFE_DELETE( p ); } } void cQuestManager::Process( unsigned long accumTime ) { if( mTimeMap.GetSize() == 0 ) return; /// ½Ã°£ üũ cTimeMap::cIterator i = mTimeMap.Begin(); cTimeMap::cIterator end = mTimeMap.End(); for( ; i != end; ) { sQuestTime* p = (sQuestTime*)(i->mSecond); unsigned long questIdx = (unsigned long)(i->mFirst); if( !p ) continue; ++i; long elasedTime = accumTime - p->startTime; /// µ¥ÀÌÅÍ °»½Å p->restTime -= elasedTime; p->startTime = accumTime; if( p->restTime < 0 ) p->restTime = 0; /// Çѹø¸¸ ½îµµ·Ï Á¶Àý if( p->restTime <= 0 && STAGEMAN->GetCurrentStage() == eStage_Game ) { int arrIdx = GetQuestArrIdx( questIdx ); if( arrIdx > -1 ) QuestDeleteAuto( arrIdx ); } } } bool cQuestManager::IsSelectQuest( unsigned long questIdx ) { cSelectSet::cIterator i = mSelectSet.Find( questIdx ); return ( i == mSelectSet.End() ) ? false : true; } bool cQuestManager::IsCompleteGathering( unsigned long questIndex ) { cQuestDefine* define = GetQuestDefine( questIndex ); if( !define ) { assert(0); return true; } cQuestDuty* duty = define->mQuestDuty; if( !duty ) { assert(0); return true; } int arrIdx = GetQuestArrIdx( questIndex ); if( arrIdx == -1 ) return true; /// Äù½ºÆ® ÀÚü°¡ ¿Ï·áµÇ¾úÀ¸¸é ¸®ÅÏ if( mQuest[arrIdx].check == define->mComplete ) return true; /// äÁý °ü·ÃºÎºÐ ¿Ï·áµÇ¾ú´ÂÁö °Ë»ç __int64 mask = 0x00; for( unsigned int i = 0; i < MAX_DUTY; ++i ) { eDutyType type = duty->mDuty[i].dutyType; /// Àǹ«°¡ ¾ø´Â°Ô ³ª¿À¸é µÚ¿¡µµ ¾øÀ¸¹Ç·Î ³¡ if( type == eDUTY_NONE ) break; if( type == eDUTY_COLLECT ) { __int64 bit = 0xFF << ( i * 8 ); mask = mask | bit; } } /// ¸ðµç äÁý Á¶°ÇÀ» ¿Ï·áÇÏ¿´À¸¸é if( (mQuest[arrIdx].check & mask) == (define->mComplete & mask) ) return true; return false; } void cQuestManager::AddQuestSelect( unsigned long questIndex, bool setQuestWindow ) { int arrIdx = GetQuestArrIdx( questIndex ); if( arrIdx == -1 ) return; mSelectSet.Insert( questIndex ); /// UI ¼¼ÆÃ cQuestSimpleWindow* simple = GAMEUI->GetQuestSimpleWindow(); if( simple ) simple->AddQuestInfo( questIndex, &mQuest[arrIdx].check ); /// üũ ¼¼ÆÃ if( setQuestWindow == true ) { cQuestWindow* win = GAMEUI->GetQuestWindow(); if( win ) win->SetCheck( arrIdx, questIndex, true ); } } void cQuestManager::DeleteQuestSelect( unsigned long questIndex, bool setQuestWindow ) { int arrIdx = GetQuestArrIdx( questIndex ); if( arrIdx == -1 ) return; mSelectSet.Erase( questIndex ); /// UI ¼¼ÆÃ cQuestSimpleWindow* simple = GAMEUI->GetQuestSimpleWindow(); if( simple ) simple->DeleteQuestInfo( questIndex ); /// üũ Ç®±â if( setQuestWindow == true ) { cQuestWindow* win = GAMEUI->GetQuestWindow(); if( win ) win->SetCheck( arrIdx, questIndex, false ); } } /// °¢ ¸Êº°·Î Äù½ºÆ® ÃÑ °¹¼ö °Ë»ç void cQuestManager::CheckCountMap() { mCountMap.Clear(); for( unsigned int i = 0; i < mTotalKeepCount; ++i ) { cQuestDefine* define = GetQuestDefine( mQuest[i].questIdx ); if( !define ) { assert(0); continue; } /// ÀÌ¹Ì °¹¼ö¸¦ ¼¼¾î³õ¾ÒÀ¸¸é ´õÇϱâ cCountMap::cIterator b = mCountMap.Find( define->mTakeMapIndex ); if( b != mCountMap.End() ) { /// ÀÖÀ¸¸é ´õÇϱâ unsigned int& total = (unsigned int)(b->mSecond); total += 1; } else { /// ¾øÀ¸¸é »õ·Î»ðÀÔ if( mCountMap.Insert( define->mTakeMapIndex, 1 ) == false ) assert(0 && "error to insert quest count"); } } } void cQuestManager::UpdateChaseQuest( unsigned long questIndex ) { if( questIndex == 0 ) return; cQuestDefine* define = GetQuestDefine( questIndex ); if( !define ) { assert(0); return; } mChaseQuestIndex = questIndex; // UI °»½Å cQuestSimpleWindow* simple = GAMEUI->GetQuestSimpleWindow(); if( simple ) { simple->UpdateSelect(); } cQuestWindow* questWin = GAMEUI->GetQuestWindow(); if( questWin ) { questWin->UpdateSelect(); } cMiniMapWindow* minimap = GAMEUI->GetMinimapWindow(); if( minimap ) { minimap->UpdateQuestChase(); } } void cQuestManager::ClearChaseQuest() { mChaseQuestIndex = 0; // UI °»½Å cQuestSimpleWindow* simple = GAMEUI->GetQuestSimpleWindow(); if( simple ) { simple->UpdateSelect(); } cQuestWindow* questWin = GAMEUI->GetQuestWindow(); if( questWin ) { questWin->UpdateSelect(); } cMiniMapWindow* minimap = GAMEUI->GetMinimapWindow(); if( minimap ) { minimap->UpdateQuestChase(); } } unsigned int cQuestManager::GetCount( unsigned short mapIdx ) { cCountMap::cIterator i = mCountMap.Find( mapIdx ); return ( i == mCountMap.End() ) ? 0 : (unsigned int)(i->mSecond); } void cQuestManager::NetLock( int lockTry, unsigned short slotIndex0 ) { switch( lockTry ) { case eLOCK_QUESTADD: { cNpcWindow* npcWin = GAMEUI->GetNpcWindow(); if( npcWin ) npcWin->NetLock( eLOCK_QUESTADD ); cBoardWindow* boardWin = GAMEUI->GetBoardWindow(); if( boardWin ) boardWin->NetLock( eLOCK_QUESTADD ); ITEMMAN->LockItemTry( ITEM_TRY_QUEST_REWARDTAKE ); } break; case eLOCK_QUESTADDBYITEM: { cNpcWindow* npcWin = GAMEUI->GetNpcWindow(); if( npcWin ) npcWin->NetLock( eLOCK_QUESTADDBYITEM ); ITEMMAN->LockItemTry( ITEM_TRY_QUEST_ADDBYITEM, slotIndex0 ); } break; case eLOCK_QUESTCOMPLETE: { cNpcWindow* npcWin = GAMEUI->GetNpcWindow(); if( npcWin ) npcWin->NetLock( eLOCK_QUESTCOMPLETE ); ITEMMAN->LockItemTry( ITEM_TRY_QUEST_REWARDTAKE ); } break; case eLOCK_QUESTREWARD: { cNpcWindow* npcWin = GAMEUI->GetNpcWindow(); if( npcWin ) npcWin->NetLock( eLOCK_QUESTREWARD ); ITEMMAN->LockItemTry( ITEM_TRY_QUEST_REWARDTAKE ); } break; case eLOCK_QUESTDELETE: { cQuestWindow* questWin = GAMEUI->GetQuestWindow(); if( questWin ) questWin->NetLock( eLOCK_QUESTDELETE ); ITEMMAN->LockItemTry( ITEM_TRY_QUEST_TAKE ); } break; case eLOCK_QUESTDELETEAUTO: /// ¸Ê·Îµù Áß¿¡ ¿äûÀÌ µé¾î¿Ã¼ö ÀÖÀ¸¹Ç·Î if( STAGEMAN->GetCurrentStage() == eStage_Game ) { cQuestWindow* questWin = GAMEUI->GetQuestWindow(); if( questWin ) questWin->NetLock( eLOCK_QUESTDELETEAUTO ); ITEMMAN->LockItemTry( ITEM_TRY_QUEST_TAKE ); } break; default: assert(0); return; } mNetLock = true; mLockTry = lockTry; } void cQuestManager::NetUnLock( int lockTry ) { if( mNetLock == false ) return; if( mLockTry != lockTry ) { assert(0); return; } switch( lockTry ) { case eLOCK_QUESTADD: { cNpcWindow* npcWin = GAMEUI->GetNpcWindow(); if( npcWin ) npcWin->NetUnLock( eLOCK_QUESTADD ); cBoardWindow* boardWin = GAMEUI->GetBoardWindow(); if( boardWin ) boardWin->NetUnLock( eLOCK_QUESTADD ); ITEMMAN->UnlockItemTry( ITEM_TRY_QUEST_REWARDTAKE ); } break; case eLOCK_QUESTADDBYITEM: { cNpcWindow* npcWin = GAMEUI->GetNpcWindow(); if( npcWin ) npcWin->NetUnLock( eLOCK_QUESTADDBYITEM ); ITEMMAN->UnlockItemTry( ITEM_TRY_QUEST_ADDBYITEM ); } break; case eLOCK_QUESTCOMPLETE: { cNpcWindow* npcWin = GAMEUI->GetNpcWindow(); if( npcWin ) npcWin->NetUnLock( eLOCK_QUESTCOMPLETE ); ITEMMAN->UnlockItemTry( ITEM_TRY_QUEST_REWARDTAKE ); } break; case eLOCK_QUESTREWARD: { cNpcWindow* npcWin = GAMEUI->GetNpcWindow(); if( npcWin ) npcWin->NetUnLock( eLOCK_QUESTREWARD ); ITEMMAN->UnlockItemTry( ITEM_TRY_QUEST_REWARDTAKE ); } break; case eLOCK_QUESTDELETE: { cQuestWindow* questWin = GAMEUI->GetQuestWindow(); if( questWin ) questWin->NetUnLock( eLOCK_QUESTDELETE ); ITEMMAN->UnlockItemTry( ITEM_TRY_QUEST_TAKE ); } break; case eLOCK_QUESTDELETEAUTO: /// ¸Ê·Îµù Áß¿¡ ¿äûÀÌ µé¾î¿Ã¼ö ÀÖÀ¸¹Ç·Î if( STAGEMAN->GetCurrentStage() == eStage_Game ) { cQuestWindow* questWin = GAMEUI->GetQuestWindow(); if( questWin ) questWin->NetUnLock( eLOCK_QUESTDELETEAUTO ); ITEMMAN->UnlockItemTry( ITEM_TRY_QUEST_TAKE ); } break; default: assert(0); return; } mLockTry = eLOCK_QUESTNONE; mNetLock = false; }