#ifndef __GUILD_WAR_MAP_MANAGER_H #define __GUILD_WAR_MAP_MANAGER_H #include "constants.h" #include "guild.h" enum EWarMapTypes { WAR_MAP_TYPE_NORMAL, WAR_MAP_TYPE_FLAG, }; typedef struct SWarMapInfo { BYTE bType; int lMapIndex; PIXEL_POSITION posStart[3]; } TWarMapInfo; namespace warmap { enum { WAR_FLAG_VNUM_START = 20035, WAR_FLAG_VNUM_END = 20037, WAR_FLAG_VNUM0 = 20035, WAR_FLAG_VNUM1 = 20036, WAR_FLAG_VNUM2 = 20037, WAR_FLAG_BASE_VNUM = 20038 }; inline bool IsWarFlag(DWORD dwVnum) { if (dwVnum >= WAR_FLAG_VNUM_START && dwVnum <= WAR_FLAG_VNUM_END) return true; return false; } inline bool IsWarFlagBase(DWORD dwVnum) { return dwVnum == WAR_FLAG_BASE_VNUM ? true : false; } }; class CWarMap { public: friend class CGuild; CWarMap(int lMapIndex, const TGuildWarInfo & r_info, TWarMapInfo * pkWarMapInfo, DWORD dwGuildID1, DWORD dwGuildID2); ~CWarMap(); bool GetTeamIndex(DWORD dwGuild, BYTE & bIdx); void IncMember(LPCHARACTER ch); void DecMember(LPCHARACTER ch); CGuild * GetGuild(BYTE bIdx); DWORD GetGuildID(BYTE bIdx); BYTE GetType(); int GetMapIndex(); DWORD GetGuildOpponent(LPCHARACTER ch); DWORD GetWinnerGuild(); void UsePotion(LPCHARACTER ch, LPITEM item); void Draw(); // °­Á¦ ¹«½ÂºÎ ó¸® void Timeout(); void CheckWarEnd(); bool SetEnded(); void ExitAll(); void SetBeginEvent(LPEVENT pkEv); void SetTimeoutEvent(LPEVENT pkEv); void SetEndEvent(LPEVENT pkEv); void SetResetFlagEvent(LPEVENT pkEv); void UpdateScore(DWORD g1, int score1, DWORD g2, int score2); bool CheckScore(); int GetRewardGold(BYTE bWinnerIdx); bool GetGuildIndex(DWORD dwGuild, int& iIndex); void Packet(const void * pv, int size); void Notice(const char * psz); void SendWarPacket(LPDESC d); void SendScorePacket(BYTE bIdx, LPDESC d = NULL); void OnKill(LPCHARACTER killer, LPCHARACTER ch); void AddFlag(BYTE bIdx, DWORD x=0, DWORD y=0); void AddFlagBase(BYTE bIdx, DWORD x=0, DWORD y=0); void RemoveFlag(BYTE bIdx); bool IsFlagOnBase(BYTE bIdx); void ResetFlag(); private: void UpdateUserCount(); private: TWarMapInfo m_kMapInfo; bool m_bEnded; LPEVENT m_pkBeginEvent; LPEVENT m_pkTimeoutEvent; LPEVENT m_pkEndEvent; LPEVENT m_pkResetFlagEvent; typedef struct STeamData { DWORD dwID; CGuild * pkGuild; int iMemberCount; int iUsePotionPrice; int iScore; LPCHARACTER pkChrFlag; LPCHARACTER pkChrFlagBase; std::set set_pidJoiner; void Initialize(); int GetAccumulatedJoinerCount(); // ´©ÀûµÈ Âü°¡ÀÚ ¼ö int GetCurJointerCount(); // ÇöÀç Âü°¡ÀÚ ¼ö void AppendMember(LPCHARACTER ch); void RemoveMember(LPCHARACTER ch); } TeamData; TeamData m_TeamData[2]; int m_iObserverCount; DWORD m_dwStartTime; BYTE m_bTimeout; TGuildWarInfo m_WarInfo; CHARACTER_SET m_set_pkChr; }; class CWarMapManager : public singleton { public: CWarMapManager(); virtual ~CWarMapManager(); bool LoadWarMapInfo(const char * c_pszFileName); bool IsWarMap(int lMapIndex); TWarMapInfo * GetWarMapInfo(int lMapIndex); bool GetStartPosition(int lMapIndex, BYTE bIdx, PIXEL_POSITION & pos); template Func for_each(Func f); int CreateWarMap(const TGuildWarInfo & r_WarInfo, DWORD dwGuildID1, DWORD dwGuildID2); void DestroyWarMap(CWarMap* pMap); CWarMap * Find(int lMapIndex); int CountWarMap() { return m_mapWarMap.size(); } void OnShutdown(); private: std::map m_map_kWarMapInfo; std::map m_mapWarMap; }; template Func CWarMapManager::for_each(Func f) { for (itertype(m_mapWarMap) it = m_mapWarMap.begin(); it != m_mapWarMap.end(); ++it) f(it->second); return f; } #endif