#ifndef __TOOL_QUEST_LIST_H__ #define __TOOL_QUEST_LIST_H__ #include #include #include #define TRIGGER_START 0 #define TRIGGER_PUTON 1 #define TRIGGER_GETON 2 #define TRIGGER_TALK 3 #define TRIGGER_KILL 4 #define TRIGGER_PICK 5 #define TRIGGER_FAME 6 #define TRIGGER_LEVEL_TALK 7 #define TRIGGER_FAME_TALK 8 #define TRIGGER_ABILITY_TALK 9 #define EVENT_DISAPPEAR 0 #define EVENT_GET 1 #define EVENT_SPAWN 2 #define EVENT_MONSTERDROP 3 #define EVENT_END 4 #define EVENT_AWARD 5 #define EVENT_MSGBOX 6 #define EVENT_PHASE 7 #define EVENT_ADDQUEST 8 #define EVENT_AWARDITEM 9 #define EVENT_AWARDITEMID 10 // À̺¥Æ® : Àåºñ º¸»ó #define EVENT_AWARDITEMCLASS 11 // À̺¥Æ® : Àåºñ º¸»ó #define EVENT_MOVE 12 // À̺¥Æ® : Á¸ À̵¿ #define EVENT_THEATERMODE 13 // À̺¥Æ® : ¾¾¾îÅÍ ¸ðµå #define EVENT_ALARMBOX 14 // À̺¥Æ® : ¾Ë¶÷ ¸Þ¼¼Áö ¹Ú½º Ãâ·Â #define NPC_QUEST 0 // NPC °¡ ÁÖ´Â Äù½ºÆ® #define ITEM_QUEST 1 // ¾ÆÀÌÅÛ »ç¿ëÀ» ÅëÇÑ Äù½ºÆ® #define AREA_QUEST 2 // À§Ä¡ Æ®¸®°Å Äù½ºÆ® #define PARTY_QUEST_BIT 0xF000 // ÆÄƼ Äù½ºÆ® ºñÆ® using namespace std; typedef struct EventNode { unsigned long m_dwEventKind; unsigned long m_dwEventNumber; unsigned long m_dwEventAmount; unsigned long m_dwEventAmount2; unsigned long m_dwEventAmount3; float m_fPosX; float m_fPosY; float m_fPosZ; char *m_strWord; } EventNode, *LPEventNode; typedef struct TriggerNode { unsigned long m_dwTriggerKind; unsigned long m_dwTriggerID; unsigned long m_dwZoneID; unsigned long m_dwMaxCount; unsigned long m_dwLevel; float m_fPosX; float m_fPosY; float m_fPosZ; float m_fDistance; std::string m_strElseMsg; // LevelTalk ¿¡¼­ LevelÀÌ ¸ÂÁö ¾ÊÀ»¶§ Ãâ·ÂµÉ ¸Þ¼¼Áö vector m_lstEvent; vector m_lstFalseEvent; vector m_lstMsgBox; vector m_lstFalseMsgBox; } TriggerNode, *LPTriggerNode; typedef struct TargetPos { int m_iType; unsigned long m_dwPosX; unsigned long m_dwPosY; } TargetPos; typedef struct PhaseNode { unsigned long m_dwZoneID; unsigned long m_dwPhaseNumber; char *m_strPhaseDesc; vector m_lstTrigger; vector m_lstTargetPos; LPTriggerNode GetTrigger(unsigned long dwTriggerKind, unsigned long dwStartPos, unsigned long *dwTriggerPos) { vector::iterator it; *dwTriggerPos = 0; dwStartPos++; for(it = m_lstTrigger.begin(); it != m_lstTrigger.end(); it++, *dwTriggerPos++) { if(dwStartPos <= *dwTriggerPos) { if((*it)->m_dwTriggerKind == dwTriggerKind) return (*it); } } return NULL; } } PhaseNode, *LPPhaseNode; typedef struct QuestNode { enum eCheckResult { RES_SUCCESS = 0, // ¼º°ø RES_MISMATCH_CLASS = 1, // Ŭ·¡½º°¡ ¸ÂÁö ¾ÊÀ½ RES_ALREADY_TAKEN = 2, // ÀÌ¹Ì ¹ÞÀº Äù½ºÆ® RES_NOT_COMPLETE_PRIOR_QUEST = 3, // ¼±°á Äù½ºÆ®¸¦ ¿Ï·áÇÏÁö ¾Ê¾ÒÀ½ RES_HIGH_THAN_MAX_LEVEL = 4, // ¼öÇàÇÒ ¼ö ÀÖ´Â ÃÖ°í ·¹º§º¸´Ù ³ô´Ù. RES_10_LOW_THAN_MIN_LEVEL = 5, // ¼öÇàÇÒ ¼ö ÀÖ´Â ÃÖÀú ·¹º§º¸´Ù 10 ·¹º§ ³·´Ù. RES_LOW_LEVEL = 6, // ¼öÇàÇÒ ¼ö ÀÖ´Â ·¹º§º¸´Ù Á¶±Ý ³·´Ù. RES_MISMATCH_NATION = 7, // ¼öÇàÇÒ ¼ö ¾ø´Â ±¹ÀûÀÔ´Ï´Ù. RES_LOW_FAME = 8, // ¼öÇàÇÒ ¼ö ÀÖ´Â ¸í¼ºº¸´Ù Á¶±Ý ³·´Ù. RES_HIGH_THAN_MAX_FAME = 9, // ¼öÇàÇÒ ¼ö ÀÖ´Â ÃÖ°í ¸í¼º º¸´Ù ³ô´Ù. }; enum eCheckNation { NATION_ALL = 0, // ¸ðµç ±¹°¡( Ä«¸£Å×¶õÆ® + ¸Þ¸£Ä«µð¾Æ + ½ÅÀÇÇØÀû´Ü ) NATION_KARTERANT = 1, // Ä«¸£Å×¶õÆ® NATION_MERKADIA = 2, // ¸Þ¸£Ä«µð¾Æ NATION_ALMIGHTY_PIRATE = 3, // ½ÅÀÇÇØÀû´Ü // »ç¿ë ¿¹ // 12 : Ä«¸£Å×¶õÆ® + ¸Þ¸£Ä«µð¾Æ // 13 : Ä«¸£Å×¶õÆ® + ½ÅÀÇÇØÀû´Ü // 23 : ¸Þ¸£Ä«µð¾Æ + ½ÅÀÇÇØÀû´Ü // 123 : Ä«¸£Å×¶õÆ® + ¸Þ¸£Ä«µð¾Æ + ½ÅÀÇÇØÀû´Ü = 0 (¸ðµç ±¹°¡) }; unsigned short m_wQuestID; unsigned short m_wQuestType; unsigned short m_wMaxPhase; unsigned short m_wMinLevel; unsigned short m_wMaxLevel; unsigned long m_dwMinFame; unsigned long m_dwMaxFame; unsigned long m_dwClass; unsigned short m_usNation; // Äù½ºÆ® ¼öÇà °¡´É ±¹°¡ BOOL m_bNationDependent; // Äù½ºÆ®°¡ ±¹°¡ Á¾¼Ó¼ºÀÌ¶ó¼­ ±¹ÀûÀÌ ¹Ù²î¸é Áö¿öÁö´Â°¡? unsigned short m_usBonusSkillPoint; // Äù½ºÆ® ¼öÇà ÈÄ ¹Þ´Â º¸³Ê½º ½ºÅ³ Æ÷ÀÎÆ® unsigned short m_usBonusAbilityPoint; // Äù½ºÆ® ¼öÇà ÈÄ ¹Þ´Â º¸³Ê½º ½ºÅ³ Æ÷ÀÎÆ® unsigned long m_dwCompletedQuest; char *m_strQuestTitle; char *m_strQuestDesc; char *m_strQuestShortDesc; char *m_strQuestLevel; char *m_strQuestAward; char m_strIconTexture[32]; unsigned short m_wPosX1, m_wPosY1; unsigned short m_wPosX2, m_wPosY2; BOOL m_bSave; BOOL m_bInvisible; // pop up ¸Þ´º¿¡¼­ ¾Èº¸ÀÌ´ÂÁö ¿©ºÎ float m_fPosX; // À§Ä¡ Äù½ºÆ®ÀÇ ¿µ¿ª Á᫐ À§Ä¡ float m_fPosY; float m_fPosZ; float m_fDistance; // Á᫐ À§Ä¡¿¡¼­ÀÇ °Å¸® unsigned long m_dwZoneID; // À§Ä¡ Äù½ºÆ®¸¦ ¹Þ´Â Á¸ vector m_lstPhase; LPPhaseNode GetPhase(unsigned long dwPhase) { vector::iterator it; for(it = m_lstPhase.begin(); it != m_lstPhase.end(); it++) { if((*it)->m_dwPhaseNumber == dwPhase) return (*it); } return NULL; } unsigned short GetQuestType() { return (m_wQuestType & ~PARTY_QUEST_BIT); } bool IsPartyQuest() { return (0 != (m_wQuestType & PARTY_QUEST_BIT)); } unsigned long CheckQuest(unsigned long dwLevel, unsigned long dwFame, unsigned long dwClass, unsigned long dwNation, unsigned short *lstCompleted, unsigned short wNumCompleted, unsigned short *lstQuestList); } QuestNode, *LPQuestNode; typedef struct QuestInstanceNode { unsigned short m_wQuestID; LPQuestNode m_lpQuest; } QuestInstanceNode, *LPQuestInstanceNode; class CQuestList { public: LPQuestNode m_lpQuestNode; LPPhaseNode m_lpPhaseNode; LPTriggerNode m_lpTriggerNode; vector m_lstQuestNode; CQuestList(); ~CQuestList(); BOOL Load(const char *strQuestScriptFile); LPQuestNode GetQuest(unsigned short wQuestID); protected: void DestroyQuestList(); }; extern CQuestList g_QuestList; #endif // __TOOL_QUEST_LIST_H__