/* ========================================================================== * ÆÄ ÀÏ : QuestManager.h * ¸ñ Àû : * ÀÛ ¼º ÀÚ : ±è°¡¶÷ * ÀÛ ¼º ÀÏ : 2008-03-07 * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "Lexer.h" #include "Quest_Common.h" #include "QuestDefine.h" const DWORD QUEST_SAVETIME = 900000; const DWORD QUEST_TIMEEVENT = 60 * 60 * 1000; /// 1½Ã°£ struct sQuestMonster { /// ¸ó½ºÅÍ ¿ÀºêÁ§Æ® À妽º tArray mMonsterArr; }; /// Ç÷¹À̾ ¼ÒȯÇÑ ¸ó½ºÅÍ Á¤º¸ struct sQuestMonsterInfo { /// Äù½ºÆ®À妽º, sQuestMonster* tPointerHashMap mQuestMonInfoMap; }; /// Äù½ºÆ® ŸÀÔ¿¡ µû¸¥ °ü¸®±¸Á¶ struct sQuestTypeArr { /// Äù½ºÆ® À妽º tArray mTypeArr; }; /// Äù½ºÆ® ¸Å´ÏÀú class cParser; class cQuestDefine; class cTrigger; class cPlayer; class cQuestManager { public: static cQuestManager* mpSingleton; public: cQuestManager(); ~cQuestManager(); bool Init(); void Clear(); void Process( long elasedTime, long accumTime ); /// À¯È¿¼º °Ë»ç bool IsValid( cQuestDefine* define ); /// ¿Ï·á °¡´ÉÇÑÁö °Ë»ç ( Ç÷¹À̾î, Äù½ºÆ® ¹è¿­À妽º ) bool IsPossibleComplete( unsigned long playerIdx, int arrIdx ); /// ¼±Åú¸»ó¿¡ ÀÖ´Â ¾ÆÀÌÅÛÀÎÁö °Ë»ç unsigned int IsSelectRewardItem( unsigned long questIdx, unsigned long ItemIdx ); /// °³¼ö ¸®ÅÏ /// ¼±Åú¸»ó¿¡ ÀÖ´Â ¹öÇÁÀÎÁö °Ë»ç bool IsSelectRewardBuff( unsigned long questIdx, unsigned long buffIdx ); /// °³¼ö ¸®ÅÏ /// ÇØ´ç Äù½ºÆ®¸¦ ½ÇÁ¦·Î npc°¡ ¼ÒÀ¯Çß´ÂÁö °Ë»ç bool IsHaveQuest( unsigned long questIdx, unsigned long npcClassIdx ); /// ¸ó½ºÅÍ ¼ÒȯÁ¤º¸ ±â·Ï bool AddQuestMonster( unsigned long playerIdx, unsigned long questIdx, unsigned long monsterIdx ); void DeleteQuestMonster( unsigned long playerIdx, unsigned long questIdx ); void DeleteAllQuestMonster( unsigned long playerIdx ); cQuestDefine* GetQuestDefine( unsigned long questIdx ); cQuestReward* GetDefaultReward( unsigned long questIdx ); /// tPointerHashMap* GetQuestDefineMap() { return &mQuestDefine; } sNpcQuestList* GetNpcQuestMap( unsigned long npcClassIdx ); /// tArray* GetQuestTypeArr( int type ); public: static cQuestManager* GetSingleton(); protected: 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 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 CheckAura( unsigned long influenceIndex ); private: /// Äù½ºÆ® ½ºÅ©¸³Æ® Á¤º¸ ¸Ê typedef tPointerHashMap cQuestDefineMap; cQuestDefineMap mQuestDefine; /// NPC º¸À¯ ÀüüÄù½ºÆ® ¸Ê ( npc À妽º, sNpcQuestList ) typedef tPointerHashMap cNpcQuestMap; cNpcQuestMap mNpcQuestMap; /// PLYAER º° ¸ó½ºÅÍ ¼Òȯ Á¤º¸ ( player À妽º, sQuestMonsterInfo ) typedef tPointerHashMap cQuestMonsterMap; cQuestMonsterMap mQuestMonsterMap; /// »óȲº° Äù½ºÆ® ¸®½ºÆ® ( °Ë»öÀ» À§ÇÑ °ü¸®±¸Á¶ ) sQuestTypeArr mQuestType[eQUEST_MAX]; long mAccumTime; long mElapsedTime; }; inline tArray* cQuestManager::GetQuestTypeArr( int type ) { if( type >= eQUEST_MAX ) { assert(0); return 0; } return &mQuestType[type].mTypeArr; } inline cQuestManager* cQuestManager::GetSingleton() { return mpSingleton; } #define QUESTMAN cQuestManager::GetSingleton() ////////////////////////////////////////////////////////////////// // Äù½ºÆ® ½ºÅ©¸³Æ® ÅäÅ« enum { /// Äù½ºÆ® ¼±¾ð eTOKEN_QUEST = 100, eTOKEN_TITLE, eTOKEN_TYPE, eTOKEN_DESC, eTOKEN_REPEAT, eTOKEN_GROUP, 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_DEFAULT, eTOKEN_SELECT, 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_CHANGEJOB, eTOKEN_FORCETYPE, eTOKEN_GIVETITLE, eTOKEN_EXP, eTOKEN_SXP, eTOKEN_MONEY, eTOKEN_SKILLPOINT, eTOKEN_ITEM, /// Æ®¸®°Å À̺¥Æ® °ü·Ã eTOKEN_TRIGGER, eTOKEN_TE_LEVEL, eTOKEN_TE_RACE, eTOKEN_TE_GENDER, eTOKEN_TE_JOB, 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_TRUE, eTOKEN_FALSE, // ¿äÀÏ ÁöÁ¤ eTOKEN_NONE, eTOKEN_MON, eTOKEN_TUE, eTOKEN_WED, eTOKEN_THU, eTOKEN_FRI, eTOKEN_SAT, eTOKEN_SUN, /// NPC Äù½ºÆ® ¸®½ºÆ® ½ºÅ©¸³Æ®¿ë eTOKEN_NPC, }; /// Äù½ºÆ® ½ºÅ©¸³Æ® ¾îÈÖ ºÐ¼®±â class cQuestLexer : public cLexer { public: cQuestLexer( const char* buffer, unsigned int size ); };