forked from metin2/server
178 lines
3.7 KiB
C++
178 lines
3.7 KiB
C++
#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<DWORD> 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<CWarMapManager>
|
|
{
|
|
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 <typename Func> 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<int, TWarMapInfo *> m_map_kWarMapInfo;
|
|
std::map<int, CWarMap *> m_mapWarMap;
|
|
};
|
|
|
|
template <typename Func> 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
|