#ifndef _SQuestMark_h_ #define _SQuestMark_h_ #include //#include #include #include "QuestBase.h" class SQuestMgr; /* */ struct sQuestMark { sQuestMark(SQuestMgr* questMgr) : m_questMgr(questMgr) {} virtual ~sQuestMark() { m_list.clear(); } bool existAnotherQuest(int id); virtual void insertFromId(int id, QuestBase::QuestCode code) {}; virtual void insertFromCode(QuestBase* quest) {} virtual void removeFromCode(QuestBase* quest) {} virtual void removeFromId(int id, QuestBase::QuestCode code) {} virtual bool is(int id, bool checkQuestInProgress = false); void clear() { m_list.clear(); } protected: virtual bool existAnotherQuest(int id, bool isAuto) { return false; } bool checkOverCount(int& count); void addList(int id, QuestBase::QuestCode code); void delList(int id, QuestBase::QuestCode code); struct sQuestCode { sQuestCode() {} sQuestCode(int code) { add(code); } ~sQuestCode() { m_list.clear(); } void add(QuestBase::QuestCode code) { std::vector::iterator it = std::find(m_list.begin(), m_list.end(), code); if (it != m_list.end()) return ; m_list.push_back(code); } void del(QuestBase::QuestCode code) { std::vector::iterator it = std::find(m_list.begin(), m_list.end(), code); if (it == m_list.end()) return ; m_list.erase(it); } bool empty() const { return m_list.empty(); } std::vector m_list; }; typedef std::map map_data; typedef map_data::iterator it_data; private: /// std::map<값(몹 id, item id 등등), 퀘스트 코드> m_list, 같은 값에 퀘스트 코드가 여러개 들어 올 수 있기 때문에 sQuestCode를 사용함 std::map m_list; protected: SQuestMgr* m_questMgr; }; /* */ struct sQuestMarkProp : public sQuestMark { sQuestMarkProp(SQuestMgr* questMgr) : sQuestMark(questMgr) {} virtual void insertFromId(int id, QuestBase::QuestCode code); virtual void insertFromCode(QuestBase* quest); virtual void removeFromCode(QuestBase* quest); virtual void removeFromId(int id, QuestBase::QuestCode code); protected: virtual bool existAnotherQuest(int id, bool isAuto); }; /* */ struct sQuestMarkMob : public sQuestMark { sQuestMarkMob(SQuestMgr* questMgr) : sQuestMark(questMgr) {} virtual void insertFromId(int id, QuestBase::QuestCode code); virtual void insertFromCode(QuestBase* quest); virtual void removeFromCode(QuestBase* quest); virtual void removeFromId(int id, QuestBase::QuestCode code); protected: virtual bool existAnotherQuest(int id, bool isAuto); }; /* */ struct sQuestMarkNpc : public sQuestMark { sQuestMarkNpc(SQuestMgr* questMgr) : sQuestMark(questMgr) {} virtual void insertFromId(int id, QuestBase::QuestCode code); virtual void insertFromCode(QuestBase* quest); virtual void removeFromCode(QuestBase* quest); virtual void removeFromId(int id, QuestBase::QuestCode code); protected: virtual bool existAnotherQuest(int id, bool isAuto); }; /* */ struct sQuestMarkDropItem : public sQuestMark { sQuestMarkDropItem(SQuestMgr* questMgr) : sQuestMark(questMgr) {} virtual void insertFromCode(QuestBase* quest); virtual void removeFromCode(QuestBase* quest); protected: void removeFromCodeFinding(QuestBase* quest, int dropItemId, bool isAuto); }; #endif