/* ========================================================================== * ÆÄ ÀÏ : QuestManager.h * ¸ñ Àû : * ÀÛ ¼º ÀÚ : ±è°¡¶÷ * ÀÛ ¼º ÀÏ : 2008-01-18 * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "Lexer.h" #include "BaseStage.h" #include "QuestDefine.h" /// Äù½ºÆ® ÆÁº¸±â 0.5ÃÊ °£°Ý const unsigned long QUESTTIP_SHOWTIME = 500; /// Äù½ºÆ® ¸Å´ÏÀú class cParser; class cQuestDefine; class cUIFuncText; class cUIFuncTextNode; class cTrigger; class cNpcWindow; /// ³×Æ®¿öÅ© ¶ô enum { eLOCK_QUESTNONE, eLOCK_QUESTADD, eLOCK_QUESTADDBYITEM, eLOCK_QUESTCOMPLETE, eLOCK_QUESTREWARD, eLOCK_QUESTDELETE, eLOCK_QUESTDELETEAUTO, }; /// Äù½ºÆ® ³²Àº½Ã°£ struct sQuestTime { long restTime; long startTime; sQuestTime() { restTime = 0; startTime = 0; } }; // struct sNpcStausData { // npc Á¾·ù À妽º unsigned long npcClassIndex; // ÀÌÆåÆ® »óÅ ÀúÀå eNpcQuestEffect effectType; }; const int LOW_LEVEL_QUEST_GAP = 10; struct MSG_RES_NPC_QUEST_REWARD; struct MSG_RES_NPC_QUEST_COMPLETE; struct MSG_RES_NPC_QUEST_FAIL; class cQuestManager { public: static cQuestManager* mpSingleton; public: cQuestManager(); ~cQuestManager(); bool Init(); void Close(); /// ¸ÊüÀÎÁö void OpenLoad(); /// °¢ ½ºÅ×ÀÌÁö¿¡¼­ÀÇ ¿ÀÇ void OpenMapChange(); void Process( unsigned long accumTime ); // void SetQuestTip( unsigned long npcclassIndex ); // Äù½ºÆ® ÅøÆÁ ¼¼ÆÃ // npc°¡ Á¦°øÇÒ ½Å±Ô Äù½ºÆ® ¸ñ·Ï Àӽà ÀúÀå¼Ò void SetNpcQuestList( cNpcWindow* win, unsigned long npcIndex, unsigned long npcClassIndex ); /// NPC¿¡ Äù½ºÆ® ¸®½ºÆ® ¼¼ÆÃ bool SetBoardQuestList(); /// °Ô½ÃÆÇ¿ë Äù½ºÆ® ¸®½ºÆ® ¼¼ÆÃ void AddQuestSelect( unsigned long questIndex, bool setQuestWindow = false ); void DeleteQuestSelect( unsigned long questIndex, bool setQuestWindow = false ); bool IsSelectQuest( unsigned long questIdx ); /// ÇØ´ç äÁý¾ÆÀÌÅÛ °ü·Ã Äù½ºÆ®°¡ ¿Ï·áµÇ¾ú´ÂÁö °Ë»ç bool IsCompleteGathering( unsigned long questIndex ); // npc Äù½ºÆ® »óÅ ÀúÀå void AddNpcStatus( unsigned long npcIndex, unsigned long npcClassIndex ); void UpdateNpcStatus(); eNpcQuestEffect GetNpcStatus( unsigned long npcIndex ); // ÃßÀûÁß Äù½ºÆ® ¼¼ÆÃ void UpdateChaseQuest( unsigned long questIndex ); unsigned long GetChangeQuestIndex() { return mChaseQuestIndex; } void ClearChaseQuest(); __int64& GetProgress( unsigned int arrIdx ); /// Äù½ºÆ® ÁøÇàÁ¤º¸ unsigned long GetQuestIndex( unsigned int arrIdx ); unsigned char GetQuestStatus( unsigned int arrIdx ); int GetQuestArrIdx( unsigned long questIdx ); cQuestDefine* GetQuestDefine( unsigned long questIdx ); long GetQuestRestTime( unsigned long questIdx ); unsigned int GetCount( unsigned short mapIdx ); /// ¸Ê¿¡ ¼ÒÀ¯ÇÑ Äù½ºÆ® ÃÑ °¹¼ö ¸®ÅÏ void NetUnLock( int lockTry ); /// Äù½ºÆ® ¼³¸í¿ë ÅØ½ºÆ® ȹµæ cUIFuncTextNode* GetNpcTextNode( unsigned int textid ); /// ³×Æ®¿öÅ© ¸Þ½ÃÁö void NetworkMsgParserLoad( char* msg ); /// Load, MapChange ½Ã ¿À´Â ÆÐŶ void NetworkMsgParser( char* msg ); void ResQuestAdd( MSG_RES_QUEST_ADD* pmsg ); void ResQuestComplete( MSG_RES_NPC_QUEST_COMPLETE* pmsg ); void ResQuestReward( MSG_RES_NPC_QUEST_REWARD* pmsg ); /// ÆÐŶ ½î±â bool QuestAddByNpc( unsigned long questIdx, unsigned long npcIndex ); /// Äù½ºÆ® Ãß°¡ (NPC¿¡ ÀÇÇÔ) bool QuestAddByItem( unsigned short number ); /// Äù½ºÆ® Ãß°¡ (¾ÆÀÌÅÛ¿¡ ÀÇÇÔ) bool QuestComplete( unsigned long questIdx, unsigned long npcIndex ); /// Äù½ºÆ® ÁøÇà ¿Ï·á bool QuestComplete(); bool QuestReward( unsigned long questIdx, unsigned long npcIndex ); /// Äù½ºÆ® º¸»ó void QuestDelete( unsigned int arrIdx ); /// Äù½ºÆ® Æ÷±â void QuestDeleteAuto( unsigned int arrIdx ); /// Äù½ºÆ® ÀÚµ¿ Æ÷±â tHashSet& GetSelectedSet() { return mSelectSet; } public: static cQuestManager* GetSingleton(); private: void UpdateUIAll(); /// Àüü Äù½ºÆ® ¸®½ºÆ® °»½Å void UpdateUI(); /// Äù½ºÆ® À©µµ¿ì¸¸ °»½Å /// º¸À¯, ¿Ï·á°¡´É °³¼ö °»½Å void CheckQuestCount(); /// void ActiveQuestText( sQuestList* oldQuest, sQuestList* newQuest ); /// void AddQuestTime( unsigned long questIdx, unsigned long restTime ); void DeleteQuestTime( unsigned long questIdx ); void ClearQuestTime(); /// °¢ ¸Êº°·Î ¼ÒÀ¯ÇÑ Äù½ºÆ® °¹¼ö ÀúÀå void CheckCountMap(); /// ¶ô°É±â void NetLock( int lockTry, unsigned short slotIndex0 = USHRT_MAX); bool IsNetLock(); private: bool Load( const cString& pathname ); bool LoadNpcQuest( const cString& pathname ); bool LoadQuests( const cString& pathname ); bool LoadQuestData( cParser& parser, cQuestDefine* p, cTrigger* trigger ); /// bool LoadTrigger( cParser& parser, cTrigger* trigger, unsigned char& type ); bool LoadInfo( cParser& parser, cQuestInfo* info ); bool LoadDuty( cParser& parser, cQuestDuty* duty, __int64& complete ); bool LoadLimit( cParser& parser, cQuestLimit* limit ); bool LoadEnd( cParser& parser, cQuestEnd* end ); bool LoadDefault( cParser& parser, cQuestReward* reward ); bool LoadSelect( cParser& parser, cQuestReward* select ); bool LoadFail( cParser& parser, cQuestFail* fail ); /// À¯È¿¼º °Ë»ç bool IsValid( cQuestDefine* define ); bool CheckAura( unsigned long influenceIndex ); sNpcQuestList* GetNpcQuestMap( unsigned long npcClassIdx ); /// ÇöÀç ¸Ê¿¡ Á¸ÀçÇÏ´Â NPCÀÇ ÀÌÆåÆ® »óÅ °»½ÅÇϱâ eNpcQuestEffect UpdateNpcEffect( unsigned long npcIndex, unsigned long npcClassIndex ); private: /// Äù½ºÆ® ½ºÅ©¸³Æ® Á¤º¸ ¸Ê typedef tPointerHashMap cQuestDefineMap; cQuestDefineMap mQuestDefine; /// NPC º¸À¯ ÀüüÄù½ºÆ® ¸Ê ( npc À妽º, sNpcQuestList ) typedef tPointerHashMap cNpcQuestMap; cNpcQuestMap mNpcQuestMap; /// Äù½ºÆ® ³²Àº ½Ã°£ ÀúÀå (ÀüºÎÀúÀå) typedef tPointerHashMap cTimeMap; cTimeMap mTimeMap; /// ½Å±Ô Äù½ºÆ® ¸®½ºÆ® typedef tHashSet cNewQuestSet; cNewQuestSet mNewQuestSet; /// ½Å±Ô À̺¥Æ® Äù½ºÆ® ¸®½ºÆ® typedef tHashSet cNewEventQuestSet; cNewEventQuestSet mNewEventQuestSet; /// Äù½ºÆ® Á¤º¸ ¹®ÀÚ¿­ cUIFuncText* mpQuestText; /// Äù½ºÆ® Á¤º¸ ÀúÀå sQuestList mQuest[MAX_KEEPQUEST]; unsigned int mTotalKeepCount; /// ¿Ï·á°¡´É¸ñ·Ï °¹¼ö unsigned int mCompleteCount; /// ÁøÇàÁß ¸ñ·Ï °¹¼ö unsigned int mProgressCount; /// »èÁ¦³ª ¿Ï·á·Î ÀÎÇØ, check »óÅ Ǯ¾î¾ßÇÏ´Â Äù½ºÆ® unsigned long mCheckQuestIndex; /// ÀÓ½ÃÀúÀå¼Ò unsigned long mTempQuestIndex; unsigned long mTempNpcIndex; unsigned int mTempArrIndex; /// ÃßÀûÁßÀÎ Äù½ºÆ® unsigned long mChaseQuestIndex; /// ³×Æ®¿öÅ© °ü·Ã ¶ô bool mNetLock; int mLockTry; /// ¼±ÅÃµÈ Äù½ºÆ® Á¤º¸ ÀúÀå typedef tHashSet cSelectSet; cSelectSet mSelectSet; typedef tHashSet cMapIndexSet; /// Quest Window¿¡¼­ Á¢ÇôÀú ÀÖ´Â ¸Ê À妽º ÀúÀå cMapIndexSet mClosedCategory; /// simple Quest Window¿¡¼­ Á¢ÇôÀú ÀÖ´Â ¸Ê À妽º ÀúÀå cMapIndexSet mClosedSimpleCategory; /// ¸Ê´ÜÀ§ Äù½ºÆ® °¹¼ö ÀúÀå ( ¸ÊÀ妽º, °¹¼ö ) typedef tHashMap cCountMap; cCountMap mCountMap; /// °¢ npc »óÅ ÀúÀå typedef tPointerHashMap cNpcStatusMap; cNpcStatusMap mNpcStatusMap; }; inline bool cQuestManager::IsNetLock() { if( mNetLock == true ) assert(0); return mNetLock; } inline __int64& cQuestManager::GetProgress( unsigned int arrIdx ) { return mQuest[arrIdx].check; } inline int cQuestManager::GetQuestArrIdx( unsigned long questIdx ) { for( unsigned int i = 0; i < mTotalKeepCount; ++i ) { if( mQuest[i].questIdx == questIdx ) return i; } return -1; } inline unsigned long cQuestManager::GetQuestIndex( unsigned int arrIdx ) { return mQuest[arrIdx].questIdx; } inline unsigned char cQuestManager::GetQuestStatus( unsigned int arrIdx ) { return mQuest[arrIdx].status; } inline cQuestManager* cQuestManager::GetSingleton() { return mpSingleton; } #define QUESTMAN cQuestManager::GetSingleton() ////////////////////////////////////////////////////////////////// // Äù½ºÆ® ½ºÅ©¸³Æ® ÅäÅ« enum { /// Äù½ºÆ® ¼±¾ð eTOKEN_QUESTDATA = 100, eTOKEN_TITLE, eTOKEN_TYPE, eTOKEN_DESC, eTOKEN_REPEAT, eTOKEN_GROUP, eTOKEN_SHARETYPE, eTOKEN_GIVENPC, eTOKEN_TAKENPC, eTOKEN_TAKEMAP, eTOKEN_GIVEITEM, eTOKEN_TAKEITEM, eTOKEN_SELECTCOUNT, eTOKEN_LEVEL, eTOKEN_CHALLEANGE, eTOKEN_REPETITION, eTOKEN_ALL, eTOKEN_ORDER, eTOKEN_INFO, eTOKEN_DUTY, eTOKEN_LIMIT, eTOKEN_END, eTOKEN_DEFAULTREWARD, eTOKEN_SELECTREWARD, eTOKEN_FAIL, eTOKEN_TALKNPC, eTOKEN_HUNT, eTOKEN_COLLECT, eTOKEN_PVP, eTOKEN_ACTIVESKILL, eTOKEN_ENHANCE, eTOKEN_PUTCARD, eTOKEN_INFOMAP, eTOKEN_BUFF, eTOKEN_DEBUFF, eTOKEN_EQUIPITEM, eTOKEN_TIMETYPE, eTOKEN_TIME, eTOKEN_MAPCHANGEPOS, eTOKEN_MONSTER, eTOKEN_MONSTERTIME, eTOKEN_TAKEMONEY, eTOKEN_TAKEFIRE, eTOKEN_TAKEWATER, eTOKEN_TAKEWIND, eTOKEN_TAKEEARTH, eTOKEN_TUTORIALMODE, eTOKEN_EXP, eTOKEN_SXP, eTOKEN_MONEY, eTOKEN_SKILLPOINT, eTOKEN_ITEM, eTOKEN_CHANGEJOB, eTOKEN_FORCETYPE, eTOKEN_GIVETITLE, /// Æ®¸®°Å À̺¥Æ® °ü·Ã eTOKEN_TRIGGER, eTOKEN_TE_LEVEL, eTOKEN_TE_RACE, eTOKEN_TE_JOB, eTOKEN_TE_GENDER, eTOKEN_TE_HAVEITEM, eTOKEN_TE_LINKQUEST, eTOKEN_TE_DAYEVENT, eTOKEN_TE_TIMEEVENT, eTOKEN_TE_TRANSMON, eTOKEN_TE_SETTITLE, eTOKEN_TE_SJOBSKILL, eTOKEN_HUMAN, eTOKEN_ELF, eTOKEN_BEAST, // ¿äÀÏ ÁöÁ¤ eTOKEN_NONE, eTOKEN_MON, eTOKEN_TUE, eTOKEN_WED, eTOKEN_THU, eTOKEN_FRI, eTOKEN_SAT, eTOKEN_SUN, eTOKEN_TRUE, eTOKEN_FALSE, }; /// Äù½ºÆ® ½ºÅ©¸³Æ® ¾îÈÖ ºÐ¼®±â class cQuestLexer : public cLexer { public: cQuestLexer( const char* buffer, unsigned int size ); };