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

📄 teammgr.cpp

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

// Includes...

#include "TeamMgr.h"


// Functions...

// *********************************************************************** //
// CTeamPlayer

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeamPlayer::Init
//
//	PURPOSE:	Initialization
//
// ----------------------------------------------------------------------- //

DBOOL CTeamPlayer::Init(DDWORD dwPlayerID, DDWORD dwFlags)
{
	// Set simple members...

	m_dwID    = dwPlayerID;
	m_dwFlags = dwFlags;


	// All done...

	return(DTRUE);
}


// *********************************************************************** //
// CTeam

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeam::Init
//
//	PURPOSE:	Initialization
//
// ----------------------------------------------------------------------- //

DBOOL CTeam::Init(DDWORD dwTeamID, char* sTeamName, DDWORD dwFlags)
{
	// Clear simple members...

	Clear();


	// Set simple members...

	m_dwID    = dwTeamID;
	m_dwFlags = dwFlags;

	strncpy(m_sName, sTeamName, TM_MAX_NAME);


	// All done...

	return(DTRUE);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeam::Term
//
//	PURPOSE:	Termination
//
// ----------------------------------------------------------------------- //

void CTeam::Term()
{
	// Delete all of the players...

	DeleteAllPlayers();


	// Clear simple members...

	Clear();
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeam::Reset
//
//	PURPOSE:	Resets our values and all of the players in the list
//
// ----------------------------------------------------------------------- //

void CTeam::Reset()
{
	// Reset our score values...

	m_nScore  = 0;
	m_nFrags  = 0;
	m_nDeaths = 0;


	// Reset all of the players...

	ResetAllPlayers();
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeam::AddPlayer
//
//	PURPOSE:	Adds the given player to the team
//
// ----------------------------------------------------------------------- //

CTeamPlayer* CTeam::AddPlayer(DDWORD dwPlayerID, DDWORD dwFlags)
{
	// Make sure this player doesn't already exist...

	if (GetPlayer(dwPlayerID))
	{
		return(NULL);
	}


	// Create and init a new player...

	CTeamPlayer* pPlayer = new CTeamPlayer;
	if (!pPlayer) return(NULL);

	if (!pPlayer->Init(dwPlayerID, dwFlags))
	{
		delete pPlayer;
		return(DFALSE);
	}


	// Add the new player to our list...

	if (!AddPlayer(pPlayer))
	{
		return(DFALSE);
	}


	// All done...

	return(pPlayer);
}

DBOOL CTeam::AddPlayer(CTeamPlayer* pPlayer)
{
	// Sanity checks...

	if (!pPlayer) return(DFALSE);


	// Add the player to our list...

	m_lsPlayers.InsertLast(pPlayer);


	// All done...

	return(DTRUE);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeam::RemovePlayer
//
//	PURPOSE:	Removes the given player from the team
//
// ----------------------------------------------------------------------- //

DBOOL CTeam::RemovePlayer(DDWORD dwPlayerID)
{
	// Get this player...

	CTeamPlayer* pPlayer = GetPlayer(dwPlayerID);
	if (!pPlayer) return(DFALSE);


	// Remove this player...

	return(RemovePlayer(pPlayer));
}

DBOOL CTeam::RemovePlayer(CTeamPlayer* pPlayer)
{
	// Sanity checks...

	if (!pPlayer) return(DFALSE);


	// Delete this player from the list...

	m_lsPlayers.Delete(pPlayer);


	// Delete the player object...

	delete pPlayer;


	// All done...

	return(DTRUE);
}

DBOOL CTeam::ChangePlayerTeam(DDWORD dwPlayerID, CTeam* pNewTeam, DBOOL bReset)
{
	// Sanity checks...

	if (!pNewTeam) return(DFALSE);


	// Get the player...

	CTeamPlayer* pPlayer = GetPlayer(dwPlayerID);
	if (!pPlayer) return(DFALSE);


	// Change the player's team...

	return(ChangePlayerTeam(pPlayer, pNewTeam, bReset));

}

DBOOL CTeam::ChangePlayerTeam(CTeamPlayer* pPlayer, CTeam* pNewTeam, DBOOL bReset)
{
	// Sanity checks...

	if (!pPlayer) return(DFALSE);
	if (!pNewTeam) return(DFALSE);


	// Delete this player from the list...

	m_lsPlayers.Delete(pPlayer);


	// Reset this player if requested...

	if (bReset)
	{
		pPlayer->Reset();
	}


	// Add this player to the new team...

	if (!pNewTeam->AddPlayer(pPlayer))
	{
		return(DFALSE);
	}


	// All done...

	return(DTRUE);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeam::GetPlayer
//
//	PURPOSE:	Gets the player with the given client handle
//
// ----------------------------------------------------------------------- //

CTeamPlayer* CTeam::GetPlayer(DDWORD dwPlayerID)
{
	// Look for this player...

	CTeamPlayer* pPlayer = GetFirstPlayer();

	while (pPlayer)
	{
		if (pPlayer->GetID() == dwPlayerID)
		{
			return(pPlayer);
		}

		pPlayer = GetNextPlayer(pPlayer);
	}


	// If we get here, this player is not in the team...

	return(NULL);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeam::SetScore
//
//	PURPOSE:	Sets the given score value
//
// ----------------------------------------------------------------------- //

DBOOL CTeam::SetScore(int nScore)
{
	// Set the given score value...

	m_nScore = nScore;

	
	// All done...

	return(DTRUE);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeam::AddScore
//
//	PURPOSE:	Adds the given score value to the team score
//
// ----------------------------------------------------------------------- //

DBOOL CTeam::AddScore(int nScore)
{
	// Add the given score value...

	m_nScore += nScore;

	
	// All done...

	return(DTRUE);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeam::AddFrags
//
//	PURPOSE:	Adds the given frags to the team score
//
// ----------------------------------------------------------------------- //

DBOOL CTeam::AddFrags(DDWORD dwPlayerID, int nFrags)
{
	// Find the player...

	CTeamPlayer* pPlayer = GetPlayer(dwPlayerID);
	if (!pPlayer) return(DFALSE);


	// Add the frags to the player and the team...

	pPlayer->AddFrags(nFrags);
	m_nFrags += nFrags;


	// All done...

	return(DTRUE);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeam::AddDeaths
//
//	PURPOSE:	Adds the given deaths to the team score
//
// ----------------------------------------------------------------------- //

DBOOL CTeam::AddDeaths(DDWORD dwPlayerID, int nDeaths)
{
	// Find the player...

	CTeamPlayer* pPlayer = GetPlayer(dwPlayerID);
	if (!pPlayer) return(DFALSE);


	// Add the frags to the player and the team...

	pPlayer->AddDeaths(nDeaths);
	m_nDeaths += nDeaths;


	// All done...

	return(DTRUE);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeam::ResetPlayers
//
//	PURPOSE:	Resets each player in the team
//
// ----------------------------------------------------------------------- //

void CTeam::ResetAllPlayers()
{
	CTeamPlayer* pPlayer = m_lsPlayers.GetFirst();

	while (pPlayer)
	{
		pPlayer->Reset();
		pPlayer = pPlayer->GetNext();
	}
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeamMgr::SortPlayers
//
//	PURPOSE:	Sorts the players using the given sort key
//
// ----------------------------------------------------------------------- //

void CTeam::SortPlayers(int nSortKey, int nDir)
{
	// Sanity checks...

	if (nSortKey == TM_KEY_SCORE) return;
	if (GetNumPlayers() <= 1) return;


	// Remove each player from our list, and insert it, sorted, into a temp list...

	CTeamPlayerList lsTemp;

	CTeamPlayer* pCurPlr = GetFirstPlayer();

	while (pCurPlr)
	{
		CTeamPlayer* pNextPlr = GetNextPlayer(pCurPlr);

		m_lsPlayers.Delete(pCurPlr);


		// Insert the player from our main list, sorted, into our temp list...

		CTeamPlayer* pTmpPlr = lsTemp.GetFirst();

		if (!pTmpPlr)
		{
			lsTemp.Insert(pCurPlr);
		}
		else
		{
			while (pTmpPlr)
			{
				if (nDir == TM_SORT_DESCENDING && IsGreater(pCurPlr, pTmpPlr, nSortKey))
				{
					lsTemp.InsertBefore(pTmpPlr, pCurPlr);
					pTmpPlr = NULL;
				}
				else if (nDir == TM_SORT_ASCENDING && IsLess(pCurPlr, pTmpPlr, nSortKey))
				{
					lsTemp.InsertBefore(pTmpPlr, pCurPlr);
					pTmpPlr = NULL;
				}
				else
				{
					pTmpPlr = pTmpPlr->GetNext();
					if (!pTmpPlr)
					{
						lsTemp.InsertLast(pCurPlr);
					}
				}
			}
		}

		pCurPlr = pNextPlr;
	}


	// Re-insert all items into our main list...

	CTeamPlayer* pPlr = lsTemp.GetFirst();

	while (pPlr)
	{
		CTeamPlayer* pNextPlr = pPlr->GetNext();
		m_lsPlayers.InsertLast(pPlr);
		pPlr = pNextPlr;
	}
}


// *********************************************************************** //
// CTeamMgr

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeamMgr::Init
//
//	PURPOSE:	Initialization
//
// ----------------------------------------------------------------------- //

DBOOL CTeamMgr::Init()
{
	// Clear all members...

	Clear();


	// All done...

	return(DTRUE);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeamMgr::Term
//
//	PURPOSE:	Termination
//
// ----------------------------------------------------------------------- //

void CTeamMgr::Term()
{
	// Delete all of the teams...

	DeleteAllTeams();


	// Clear all members...

	Clear();
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeamMgr::GetTeam
//
//	PURPOSE:	Gets the team with the given ID
//
// ----------------------------------------------------------------------- //

CTeam* CTeamMgr::GetTeam(DDWORD dwTeamID)
{
	// Look for a team with the given ID...

	CTeam* pTeam = GetFirstTeam();

	while (pTeam)
	{
		if (pTeam->GetID() == dwTeamID)
		{
			return(pTeam);
		}

		pTeam = GetNextTeam(pTeam);
	}


	// If we get here, we didn't find the team...

	return(NULL);
}

CTeam* CTeamMgr::GetTeam(const char* sName)
{
	// Sanity checks...

	if (!sName) return(NULL);
	if (sName[0] == '\0') return(NULL);


	// Look for a team with the given name...

	CTeam* pTeam = GetFirstTeam();

	while (pTeam)
	{
		if (strncmp(pTeam->GetName(), sName, TM_MAX_NAME) == 0)
		{
			return(pTeam);
		}

		pTeam = GetNextTeam(pTeam);
	}


	// If we get here, we didn't find the team...

	return(NULL);
}

CTeam* CTeamMgr::GetTeamFromPlayerID(DDWORD dwPlayerID)
{
	// Look for the player on each team...

	CTeam* pTeam = GetFirstTeam();

	while (pTeam)
	{
		CTeamPlayer* pPlayer = pTeam->GetFirstPlayer();

		while (pPlayer)
		{
			if (pPlayer->GetID() == dwPlayerID)
			{
				return(pTeam);
			}

			pPlayer = pTeam->GetNextPlayer(pPlayer);
		}

		pTeam = GetNextTeam(pTeam);
	}


	// If we get here, we didn't find the player's team...

	return(NULL);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeamMgr::AddTeam
//
//	PURPOSE:	Adds a new team with the given values
//
// ----------------------------------------------------------------------- //

CTeam* CTeamMgr::AddTeam(DDWORD dwTeamID, char* sTeamName, DDWORD dwFlags)
{
	// Make sure this team doesn't already exist...

	if (GetTeam(dwTeamID)) return(NULL);
	if (GetTeam(sTeamName)) return(NULL);


	// Create and init a new team...

	CTeam* pTeam = new CTeam();
	if (!pTeam) return(NULL);

	if (!pTeam->Init(dwTeamID, sTeamName, dwFlags))
	{
		delete pTeam;
		return(NULL);
	}


	// Add the new team to our list...

	m_lsTeams.InsertLast(pTeam);


	// All done...

	return(pTeam);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTeamMgr::AddPlayer
//
//	PURPOSE:	Adds a new player to the specified team
//
// ----------------------------------------------------------------------- //

CTeamPlayer* CTeamMgr::AddPlayer(DDWORD dwTeamID, DDWORD dwPlayerID, DDWORD dwFlags)
{
	// Get the team...

	CTeam* pTeam = GetTeam(dwTeamID);
	if (!pTeam) return(NULL);


	// Add the player to the team...

	return(AddPlayer(pTeam, dwPlayerID, dwFlags));
}

CTeamPlayer* CTeamMgr::AddPlayer(char* sTeamName, DDWORD dwPlayerID, DDWORD dwFlags)
{

⌨️ 快捷键说明

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