#pragma once //======================================================================================================================= /// QuestManager class /** @author Kim Min Wook < taiyo@webzen.com > @since 2006. 3. 25 @remarks - QuestManager¿¡¼­´Â ÁøÇàÁßÀÎ Äù½ºÆ®ÀÇ ¸®½ºÆ®¸¦ °ü¸® 1.Äù½ºÆ® ¼ö¶ô ÈÄ Ãß°¡ ȤÀº DB·ÎºÎÅÍ Serialize(Äù½ºÆ®»ý¼º), 2.Äù½ºÆ® ÁøÇà,¿Ï·á Á¶°Ç üũ, 3.Äù½ºÆ® º¸»ó, 4.Äù½ºÆ® Æ÷±â(Äù½ºÆ® ÆÄ±«) @history - 2006.3.27 : QuestManager¸¦ »ó¼ÓÇÏ´Â ±¸Á¶º¯°æ, Äù½ºÆ® »óÅ À̺¥Æ®¸¦ ¾Ë·ÁÁÖ±â À§ÇØ - 2006.3.28 : Quest Handler°¡ ÀÖ¾î¾ß ÇÏ´Â ÀÌÀ¯°¡ ºÎÁ·ÇÏ´Ù. QuestManager¿¡ ÇÕħ - 2006.4.14(Â¥Àå¸éÀdz¯) : Complete QuestÀÇ arrayÀÇ 0 index »ç¿ëÇÏÁö ¾Ê°Ô º¯°æ @caution - DoComplete()¿Í DoReward()ÀÇ Â÷ÀÌ ÁÖÀÇ - ¿¬ÇÕÄù½ºÆ®ÀÇ ÀÚ½ÄÄù½ºÆ®´Â º¸»óÀÌ ¾ø¾î¾ß Çϰí, ºÎ¿©¾ÆÀÌÅÛÀÌ Á¦°øµÇÁö ¾Ê¾Æ¾ß ÇÑ´Ù. - 2006.6.29 : DBÀÇ complete StreamÀÇ 0¹øÂ° À§Ä¡ÀÇ Á¤º¸´Â »ç¿ëÇÏÁö ¾Ê´Â´Ù. °ÔÀÓ¿¡¼­µµ 0¹øÂ° À§Ä¡ÀÇ Á¤º¸´Â »ç¿ëÇÏÁö ¾Ê´Â´Ù. - m_ProgressTimeQCodeÀÇ ÇÒ´çÀº AddQuest½Ã À̸ç, ÇØÁ¦´Â RemoveQuest ¿Í Äù½ºÆ®ÀÇ ½ÇÆÐ,Æ÷±â½ÃÀÌ´Ù. @desc 1.¿¬ÇÕ Äù½ºÆ® »ç·Ê + ºÎ¸ð¸¦ ±âÁØÀ¸·Î - ¼ö¶ô½Ã(ACCEPT) ó¸® : ºÎ¸ð(O)-> ÀÚ½Ä(O) - ¿Ï·á½Ã(COMPLETE) ó¸® : ºÎ¸ð(O)-> ÀÚ½Ä(X:À̹̿ϷáµÊ) - Æ÷±â½Ã(ABANDON) »èÁ¦ ó¸® : ºÎ¸ð(O)-> ÀÚ½Ä(O) - º¸»ó½Ã(REWARD) ó¸® : ºÎ¸ð(O)-> ÀÚ½Ä(X:º¸»ó¹ÞÀ»°Ô¾øÀ½) - º¸»ó ¿Ï·á½Ã(DESTROY) »èÁ¦ ó¸® : ºÎ¸ð(O)-> ÀÚ½Ä(O) + ÀÚ½ÄÀ» ±âÁØÀ¸·Î - ¼ö¶ô½Ã(ACCEPT) ó¸® : ÀÚ½Ä(X:ÀڽĸÕÀú¼ö¶ôºÒ°¡) - ¿Ï·á½Ã(COMPLETE) ó¸® : ÀÚ½Ä(O) - Æ÷±â½Ã(ABANDON) »èÁ¦ ó¸® : ÀÚ½Ä(X:ÀڽĸÕÀúÆ÷±âºÒ°¡) - º¸»ó½Ã(REWARD) ó¸® : ÀÚ½Ä(X:º¸»ó¹ÞÀ»°Ô¾øÀ½) - º¸»ó ¿Ï·á½Ã(DESTROY) »èÁ¦ ó¸® : ÀÚ½Ä(X:ÀڽĸÕÀú»èÁ¦ºÒ°¡) // Á¦ÇÑ Á¶°Ç : ÀÚ½Ä Äù½ºÆ®´Â ºÎ¿© ¾ÆÀÌÅÛÀÌ Á¸ÀçÇÏ¸é ¾ÈµÈ´Ù. // ÀÌÀ¯ : ºÎ¸ðÄù½ºÆ® Æ÷±â½Ã ÀÚ½ÄÄù½ºÆ®ÀÇ ºÎ¿© ¾ÆÀÌÅÛ »èÁ¦°¡ ºÒºÐ¸íÇÏ´Ù. */ //======================================================================================================================= #include "QuestDefine.h" #include "QuestStruct.h" #include "Quest.h" #include "ResultCode.h" class QuestCondition; class QuestAction; class QuestConditionInfo; class QuestActionInfo; class QuestInfoManager; class QuestManager { friend class Quest; public: QuestManager(QuestInfoManager * pmgr); virtual ~QuestManager(void); void Update(); void Event( eQUEST_EVENT evt, QUEST_MSG * pMsg ); BOOL Event( QCODE QCode, eQUEST_EVENT evt, QUEST_MSG * pMsg ); RC::eQUEST_RESULT CanAccept( QCODE qCode, void * pvParam ); RC::eQUEST_RESULT CanComplete( QCODE qCode, void * pvParam ); RC::eQUEST_RESULT CanDoAccept( QCODE qCode, void * pvParam ); RC::eQUEST_RESULT CanDoComplete( QCODE qCode, void * pvParam ); BOOL GmAccept( QCODE qCode, void * pvParam ); BOOL GmComplete( QCODE QCode, void * pvParam ); BOOL GmReset( QCODE QCode, void * pvParam ); void DoReward( QCODE QCode/*ÁøÇàÁßÀÎÄù½ºÆ®ÄÚµå*/, void * pvParam ); //{__NA001282_20090206_MODIFY_QUEST_TIME void DoFailed( QCODE QCode ); void DoAbandon( QCODE QCode ); //} inline Quest * FindQuest( QCODE QCode ) { return m_QuestHash.GetData( QCode ); } Quest * CreateQuest( QCODE QuestCode ); // ¹ÝȯÇÒ¶§ ÁÖÀÇ : À¯È¿ÇÑ Æ÷ÀÎÅÍÀÎÁö!, ÀçÆÄ±«ÇÏ´Â °Ç ¾Æ´ÑÁö! void DestroyQuest( QCODE QuestCode ); void DestroyAll(); //< ¸ðµç ÁøÇàÁßÀÎ Äù½ºÆ®¿Í ¿Ï·áµÈ Äù½ºÆ® Á¤º¸ ÃʱâÈ­ inline int QuestNum() { return m_QuestHash.GetDataNum(); } inline BOOL IsQuestMax() { return QuestNum() >= QUESTPART_PROGR::MAX_QUEST_PROGR_NUM; } DWORD GetChildQuestNum(QCODE qCode); inline QUESTPART_COMPL * FindComplQuest( QCODE QCode ) { #ifdef _NA_004157_20120409_QUEST_BANDWITH_INCREASING COMPLETED_QUEST_MAP::iterator it = m_pCompletedQuest.find(QCode); if(it == m_pCompletedQuest.end()) return NULL; return &it->second; #else if(QCodeIsTimeQuest() ) m_ProgressTimeQCode = QCode; } inline void RemoveQuest( QCODE QCode ) { m_QuestHash.Remove( QCode ); if( m_ProgressTimeQCode == QCode ) m_ProgressTimeQCode = 0; } template void ForeachProgressQuest(Operator& opr); void DestroyQuest( Quest * pQuest ); // ÇÏÀ§ Ŭ·¡½º¿¡¼­ ±¸ÇöÀ» ÇØ¾ß ÇÏ´Â ºÎºÐ virtual QuestCondition * CreateQuestCondition( QuestConditionInfo * pInfo ) { return NULL; } virtual QuestAction * CreateQuestAction( QuestActionInfo * pInfo ) { return NULL; } virtual void DestroyQuestCondition( QuestCondition * pCondition ) { } virtual void DestroyQuestAction( QuestAction * pAction ) { } // Äù½ºÆ® ¿Ï·á, ½ÇÆÐ¿¡ µû¸¥ À̺¥Æ® ¾Ë¸² virtual void OnEvent( eQUEST_EVENT evt, QUEST_MSG * pMsg, Quest * pQuest ) { } QuestInfoManager * GetQuestInfoManager() { return m_pQuestInfoManager; } private: QuestInfoManager * m_pQuestInfoManager; QUEST_HASH m_QuestHash; #ifdef _NA_004157_20120409_QUEST_BANDWITH_INCREASING typedef STLX_MAP COMPLETED_QUEST_MAP; COMPLETED_QUEST_MAP m_pCompletedQuest; #else QUESTPART_COMPL m_pCompletedQuest[QUESTPART_COMPL::MAX_QUEST_COMPL_NUM]; #endif //_NA_004157_20120409_QUEST_BANDWITH_INCREASING #ifdef _NA_003027_20111013_HONOR_SYSTEM struct { WORD daily_quest; WORD normal_quest; } completed_quest_count; typedef STLX_HASH_MAP DAILY_QUEST_MAP; DAILY_QUEST_MAP daily_quest_data_; #endif//_NA_003027_20111013_HONOR_SYSTEM //static util::CMemoryPoolFactory s_QuestPool; QCODE m_ProgressTimeQCode; // ÇöÀç ÁøÇàÁß Å¸ÀÓ Äù½ºÆ® (¾øÀ¸¸é : 0) }; template void QuestManager::ForeachProgressQuest(Operator& opr) { m_QuestHash.SetFirst(); while(Quest* pQuest = m_QuestHash.GetNext()) opr(pQuest); }