⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 teammgr.h

📁 Blood 2全套源码
💻 H
字号:
/****************************************************************************
;
;	 MODULE:		TEAMMGR (.H)
;
;	PURPOSE:		Team Manager for multiplayer teams
;
;	HISTORY:		12/21/98 [blg] This file was created
;
;	COMMENT:		Copyright (c) 1998, Monolith Productions Inc.
;
****************************************************************************/


#ifndef _TEAMMGR_H_
#define _TEAMMGR_H_


// Includes...

#include "BareList.h"
#include "BaseDefs_de.h"


// Defines...

#define TM_MAX_NAME			128
#define TM_MAX_PLAYERS		256

#define TM_KEY_FRAGS		1
#define TM_KEY_DEATHS		2
#define TM_KEY_SCORE		3

#define TM_SORT_DESCENDING	1
#define TM_SORT_ASCENDING	2

#define TM_ID_NULL			0xFFFFFFFF


// Classes...

class CTeamPlayer : public CBareListItem
{
	// Member functions...

public:
	CTeamPlayer() { Clear(); }
	~CTeamPlayer() { Term(); }

	DBOOL					Init(DDWORD dwPlayerID, DDWORD dwFlags = 0);
	void					Term();
	void					Clear();

	DDWORD					GetID() { return(m_dwID); }
	int						GetFrags() { return(m_nFrags); }
	int						GetDeaths() { return(m_nDeaths); }
	DDWORD					GetFlags() { return(m_dwFlags); }
	CTeamPlayer* 			GetNext() { return((CTeamPlayer*)CBareListItem::Next()); }
	CTeamPlayer*			GetPrev() { return((CTeamPlayer*)CBareListItem::Prev()); }

	void					SetFrags(int nFrags) { m_nFrags = nFrags; }
	void					SetDeaths(int nDeaths) { m_nDeaths = nDeaths; }

	void					AddFrags(int nFrags) { m_nFrags += nFrags; }
	void					AddDeaths(int nDeaths) { m_nDeaths += nDeaths; }

	void					Reset();


	// Member variables...

private:
	DDWORD					m_dwID;
	int						m_nFrags;
	int						m_nDeaths;
	DDWORD					m_dwFlags;
};

class CTeamPlayerList : public CBareList
{
	// Member variabls...

public:
	CTeamPlayer*			GetFirst() { return((CTeamPlayer*)CBareList::GetFirst()); }
	CTeamPlayer*			GetLast() { return((CTeamPlayer*)CBareList::GetLast()); }
	void					DeleteAll();
};

class CTeam : public CBareListItem
{
	// Member functions...

public:
	CTeam() { Clear(); }
	~CTeam() { Term(); }

	DBOOL					Init(DDWORD dwTeamID, char* sTeamName = NULL, DDWORD dwFlags = 0);
	void					Term();
	void					Clear();

	char*					GetName() { return(m_sName); }
	DDWORD					GetID() { return(m_dwID); }
	DDWORD					GetFlags() { return(m_dwFlags); }
	CTeamPlayer*			GetPlayer(DDWORD dwPlayerID);
	CTeamPlayer*			GetFirstPlayer() { return(m_lsPlayers.GetFirst()); }
	CTeamPlayer*			GetNextPlayer(CTeamPlayer* pPlayer) { if (pPlayer) { return(pPlayer->GetNext()); } else return(NULL); }
	int						GetNumPlayers() { return(m_lsPlayers.GetNumItems()); }
	int						GetFrags() { return(m_nFrags); }
	int						GetDeaths() { return(m_nDeaths); }
	int						GetScore() { return(m_nScore); }
	CTeam* 					GetNext() { return((CTeam*)CBareListItem::Next()); }
	CTeam*					GetPrev() { return((CTeam*)CBareListItem::Prev()); }

	DBOOL					SetScore(int nScore);

	CTeamPlayer*			AddPlayer(DDWORD dwPlayerID, DDWORD dwFlags = 0);
	DBOOL					AddPlayer(CTeamPlayer* pPlayer);

	DBOOL					AddScore(int nScore);
	DBOOL					AddFrags(DDWORD dwPlayerID, int nFrags);
	DBOOL					AddDeaths(DDWORD dwPlayerID, int nDeaths);

	void					Reset();

	DBOOL					RemovePlayer(DDWORD dwPlayerID);
	DBOOL					RemovePlayer(CTeamPlayer* pPlayer);

	DBOOL					ChangePlayerTeam(DDWORD dwPlayerID, CTeam* pNewTeam, DBOOL bReset);
	DBOOL					ChangePlayerTeam(CTeamPlayer* pPlayer, CTeam* pNewTeam, DBOOL bReset);

	void					ResetAllPlayers();
	void					DeleteAllPlayers();

	void					SortPlayersByScore(int nDir = TM_SORT_DESCENDING) { SortPlayers(TM_KEY_FRAGS, nDir); }
	void					SortPlayersByFrags(int nDir = TM_SORT_DESCENDING) { SortPlayers(TM_KEY_FRAGS, nDir); }
	void					SortPlayersByDeaths(int nDir = TM_SORT_DESCENDING) { SortPlayers(TM_KEY_DEATHS, nDir); }
	void					SortPlayers(int nSortKey, int nDir);

private:
	DBOOL					IsGreater(CTeamPlayer* pPlr1, CTeamPlayer* pPlr2, int nSortKey);
	DBOOL					IsLess(CTeamPlayer* pPlr1, CTeamPlayer* pPlr2, int nSortKey);
	DBOOL					IsEqual(CTeamPlayer* pPlr1, CTeamPlayer* pPlr2, int nSortKey);

	// Member variables...

private:
	char					m_sName[TM_MAX_NAME];
	DDWORD					m_dwID;
	DDWORD					m_dwFlags;
	CTeamPlayerList			m_lsPlayers;
	int						m_nFrags;
	int						m_nDeaths;
	int						m_nScore;
};

class CTeamList : public CBareList
{
	// Member variabls...

public:
	CTeam* 					GetFirst() { return((CTeam*)CBareList::GetFirst()); }
	CTeam*					GetLast() { return((CTeam*)CBareList::GetLast()); }
	void					DeleteAll();
};

class CTeamMgr
{
	// Member functions...

public:
	CTeamMgr() { Clear(); ClearTeamTransIDs(); }
	~CTeamMgr() { Term(); }

	DBOOL					Init();
	void					Term();
	void					Clear();

	int						GetNumTeams() { return(m_lsTeams.GetNumItems()); }
	CTeam*					GetTeam(DDWORD dwTeamID);
	CTeam*					GetTeam(const char* sTeamName);
	CTeam*					GetTeamFromPlayerID(DDWORD dwPlayerID);
	CTeam*					GetTeamWithMostPlayers(DBOOL bRandomizeTies);
	CTeam*					GetTeamWithLeastPlayers(DBOOL bRandomizeTies);
	CTeam*					GetFirstTeam() { return(m_lsTeams.GetFirst()); }
	CTeam*					GetNextTeam(CTeam* pTeam) { if (pTeam) { return(pTeam->GetNext()); } else return(NULL); }

	DBOOL					SetTeamScore(DDWORD dwTeamID, int nScore);
	DBOOL					SetTeamScore(char* sTeamName, int nScore);
	DBOOL					SetTeamScore(CTeam* pTeam, int nScore);

	CTeam*					AddTeam(DDWORD dwTeamID, char* sTeamName = NULL, DDWORD dwFlags = 0);

	CTeamPlayer*			AddPlayer(DDWORD dwTeamID, DDWORD dwPlayerID, DDWORD dwFlags = 0);
	CTeamPlayer*			AddPlayer(char* sTeamName, DDWORD dwPlayerID, DDWORD dwFlags = 0);
	CTeamPlayer*			AddPlayer(CTeam* pTeam, DDWORD dwPlayerID, DDWORD dwFlags = 0);

	DBOOL					AddTeamScore(DDWORD dwTeamID, int nScore);
	DBOOL					AddTeamScore(char* sTeamName, int nScore);
	DBOOL					AddTeamScore(CTeam* pTeam, int nScore);

	DBOOL					AddPlayerFrags(DDWORD dwPlayerID, int nFrags);
	DBOOL					AddPlayerFrags(DDWORD dwTeamID, DDWORD dwPlayerID, int nFrags);
	DBOOL					AddPlayerFrags(char* sTeamName, DDWORD dwPlayerID, int nFrags);
	DBOOL					AddPlayerFrags(CTeam* pTeam, DDWORD dwPlayerID, int nFrags);

	DBOOL					AddPlayerDeaths(DDWORD dwPlayerID, int nDeaths);
	DBOOL					AddPlayerDeaths(DDWORD dwTeamID, DDWORD dwPlayerID, int nFrags);
	DBOOL					AddPlayerDeaths(char* sTeamName, DDWORD dwPlayerID, int nFrags);
	DBOOL					AddPlayerDeaths(CTeam* pTeam, DDWORD dwPlayerID, int nDeaths);

	DBOOL					RemoveTeam(DDWORD dwTeamID);
	DBOOL					RemoveTeam(char* sTeamName);
	DBOOL					RemoveTeam(CTeam* pTeam);

	DBOOL					RemovePlayer(DDWORD dwPlayerID);

	DBOOL					ChangePlayerTeam(DDWORD dwPlayerID, DDWORD dwNewTeamID, DBOOL bReset);
	DBOOL					ChangePlayerTeam(DDWORD dwPlayerID, char* sNewTeamName, DBOOL bReset);
	DBOOL					ChangePlayerTeam(DDWORD dwPlayerID, CTeam* pNewTeam, DBOOL bReset);

	void					ResetAllTeams();
	void					DeleteAllTeams();

	void					SortTeamsByScore(int nDir = TM_SORT_DESCENDING) { SortTeams(TM_KEY_SCORE, nDir); }
	void					SortTeamsByFrags(int nDir = TM_SORT_DESCENDING) { SortTeams(TM_KEY_FRAGS, nDir); }
	void					SortTeamsByDeaths(int nDir = TM_SORT_DESCENDING) { SortTeams(TM_KEY_DEATHS, nDir); }
	void					SortTeams(int nSortKey, int nDir);

	void					SortPlayersByScore(int nDir = TM_SORT_DESCENDING) { SortPlayers(TM_KEY_FRAGS, nDir); }
	void					SortPlayersByFrags(int nDir = TM_SORT_DESCENDING) { SortPlayers(TM_KEY_FRAGS, nDir); }
	void					SortPlayersByDeaths(int nDir = TM_SORT_DESCENDING) { SortPlayers(TM_KEY_DEATHS, nDir); }
	void					SortPlayers(int nSortKey, int nDir);

	DBOOL					IsOnSameTeam(DDWORD dwPlayerID1, DDWORD dwPlayerID2, CTeam** ppTeam = NULL);

	DBOOL					CreateTeamTransIDs();
	DDWORD					GetTeamTransID(DDWORD dwPlayerID);
	void					RemoveTeamTransID(DDWORD dwPlayerID);
	void					ClearTeamTransIDs();

private:
	DBOOL					IsGreater(CTeam* pTeam1, CTeam* pTeam2, int nSortKey);
	DBOOL					IsLess(CTeam* pTeam1, CTeam* pTeam2, int nSortKey);
	DBOOL					IsEqual(CTeam* pTeam1, CTeam* pTeam2, int nSortKey);


	// Member variables...

private:
	CTeamList				m_lsTeams;
	DDWORD					m_aTeamTransIDs[TM_MAX_PLAYERS];
};


// Inlines...

inline void CTeamPlayer::Clear()
{
	m_dwID    = TM_ID_NULL;
	m_nFrags  = 0;
	m_nDeaths = 0;
	m_dwFlags = 0;
}

inline void CTeamPlayer::Term()
{
	Clear();
}

inline void CTeamPlayer::Reset()
{
	m_nFrags  = 0;
	m_nDeaths = 0;
}

inline void CTeamPlayerList::DeleteAll()
{
	CTeamPlayer* pPlayer = GetFirst();

	while (pPlayer)
	{
		CTeamPlayer* pTemp = pPlayer;
		pPlayer = pTemp->GetNext();
		Delete(pTemp);
		delete pTemp;
	}
}

inline void CTeam::Clear()
{
	m_sName[0] = '\0';
	m_dwID     = TM_ID_NULL;
	m_nScore   = 0;
	m_nFrags   = 0;
	m_nDeaths  = 0;
	m_dwFlags  = 0;
}

inline void CTeam::DeleteAllPlayers()
{
	m_lsPlayers.DeleteAll();
}

inline DBOOL CTeam::IsGreater(CTeamPlayer* pPlr1, CTeamPlayer* pPlr2, int nSortKey)
{
	if (!pPlr1 || !pPlr2) return(DFALSE);

	switch (nSortKey)
	{
		case TM_KEY_FRAGS:  return(pPlr1->GetFrags() > pPlr2->GetFrags());
		case TM_KEY_DEATHS: return(pPlr1->GetDeaths() > pPlr2->GetDeaths());
	}

	return(DFALSE);
}

inline DBOOL CTeam::IsLess(CTeamPlayer* pPlr1, CTeamPlayer* pPlr2, int nSortKey)
{
	if (!pPlr1 || !pPlr2) return(DFALSE);

	switch (nSortKey)
	{
		case TM_KEY_FRAGS:  return(pPlr1->GetFrags() < pPlr2->GetFrags());
		case TM_KEY_DEATHS: return(pPlr1->GetDeaths() < pPlr2->GetDeaths());
	}

	return(DFALSE);
}

inline DBOOL CTeam::IsEqual(CTeamPlayer* pPlr1, CTeamPlayer* pPlr2, int nSortKey)
{
	if (!pPlr1 || !pPlr2) return(DFALSE);

	switch (nSortKey)
	{
		case TM_KEY_FRAGS:  return(pPlr1->GetFrags() == pPlr2->GetFrags());
		case TM_KEY_DEATHS: return(pPlr1->GetDeaths() == pPlr2->GetDeaths());
	}

	return(DFALSE);
}

inline void CTeamList::DeleteAll()
{
	CTeam* pTeam = GetFirst();

	while (pTeam)
	{
		CTeam* pTemp = pTeam;
		pTeam = pTemp->GetNext();
		Delete(pTemp);
		delete pTemp;
	}
}

inline void CTeamMgr::Clear()
{

}

inline void CTeamMgr::ClearTeamTransIDs()
{
	for (int i = 0; i < TM_MAX_PLAYERS; i++)
	{
		m_aTeamTransIDs[i] = TM_ID_NULL;
	}
}

inline void CTeamMgr::DeleteAllTeams()
{
	m_lsTeams.DeleteAll();
}

inline DBOOL CTeamMgr::IsGreater(CTeam* pTeam1, CTeam* pTeam2, int nSortKey)
{
	if (!pTeam1 || !pTeam2) return(DFALSE);

	switch (nSortKey)
	{
		case TM_KEY_SCORE:  return(pTeam1->GetScore() > pTeam2->GetScore());
		case TM_KEY_FRAGS:  return(pTeam1->GetFrags() > pTeam2->GetFrags());
		case TM_KEY_DEATHS: return(pTeam1->GetDeaths() > pTeam2->GetDeaths());
	}

	return(DFALSE);
}

inline DBOOL CTeamMgr::IsLess(CTeam* pTeam1, CTeam* pTeam2, int nSortKey)
{
	if (!pTeam1 || !pTeam2) return(DFALSE);

	switch (nSortKey)
	{
		case TM_KEY_SCORE:  return(pTeam1->GetScore() < pTeam2->GetScore());
		case TM_KEY_FRAGS:  return(pTeam1->GetFrags() < pTeam2->GetFrags());
		case TM_KEY_DEATHS: return(pTeam1->GetDeaths() < pTeam2->GetDeaths());
	}

	return(DFALSE);
}

inline DBOOL CTeamMgr::IsEqual(CTeam* pTeam1, CTeam* pTeam2, int nSortKey)
{
	if (!pTeam1 || !pTeam2) return(DFALSE);

	switch (nSortKey)
	{
		case TM_KEY_SCORE:  return(pTeam1->GetScore() == pTeam2->GetScore());
		case TM_KEY_FRAGS:  return(pTeam1->GetFrags() == pTeam2->GetFrags());
		case TM_KEY_DEATHS: return(pTeam1->GetDeaths() == pTeam2->GetDeaths());
	}

	return(DFALSE);
}

inline DBOOL CTeamMgr::IsOnSameTeam(DDWORD dwPlayerID1, DDWORD dwPlayerID2, CTeam** ppTeam)
{
	CTeam* pTeam1 = GetTeamFromPlayerID(dwPlayerID1);
	if (!pTeam1) return(DFALSE);

	return (pTeam1->GetPlayer(dwPlayerID2) != NULL);
}


// EOF

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -