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

📄 fraginfo.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//*********************************************************************************

#include <stdio.h>
#include "FragInfo.h"
#include "cpp_client_de.h"
#include "TeamMgr.h"
#include "BloodClientShell.h"

#define FRAG_NAME_PIXEL_WIDTH	145

//*********************************************************************************

CFragInfo::CFragInfo()
{
	m_pClients = DNULL;
	m_pClientDE = DNULL;

	m_pFont = DNULL;
	m_pCursor = DNULL;

	for (int i = 0; i < NUM_FRAG_PICS; i++)
	{
		m_hFragPics[i] = 0;
	}

	m_hFragBar = 0;
	m_hFragTable = 0;

	m_nFragTableX = 0;
	m_nFragTableY = 0;
	m_nFragTableHeight = 0;
	m_nFragTableMaxDisp = 0;

	m_nScreenWidth = 0;
	m_nScreenHeight = 0;

	m_hTransColor = 0;
}

//*********************************************************************************

CFragInfo::~CFragInfo()
{
	if (!m_pClientDE) return;

	CLIENT_INFO* ptr = DNULL;
	while (m_pClients)
	{
		ptr = m_pClients->pNext;
		m_pClientDE->FreeString (m_pClients->hstrName);
		delete m_pClients;
		m_pClients = ptr;
	}

	if (m_pFont) 
		delete m_pFont;

	if (m_pCursor)
		delete m_pCursor;

	for (int i = 0; i < NUM_FRAG_PICS; i++)
	{
		if(m_hFragPics[i]) { m_pClientDE->DeleteSurface(m_hFragPics[i]); m_hFragPics[i] = 0; }
	}

	if(m_hFragBar)			{ m_pClientDE->DeleteSurface(m_hFragBar); m_hFragBar = 0; }
	if(m_hFragTable)		{ m_pClientDE->DeleteSurface(m_hFragTable); m_hFragTable = 0; }
}

//*********************************************************************************

void CFragInfo::Init (CClientDE* pClientDE, CTeamMgr* pTeamMgr)
{
	// Sanity checks
	ASSERT(pClientDE);
	ASSERT(pTeamMgr);

	// Setup main pointers
	m_pClientDE = pClientDE;
	m_pTeamMgr  = pTeamMgr;

	// Setup surfaces
	m_hFragPics[0]	= m_pClientDE->CreateSurfaceFromBitmap("interface/fragbar/c_frag.pcx");
	m_hFragPics[1]	= m_pClientDE->CreateSurfaceFromBitmap("interface/fragbar/o_frag.pcx");
	m_hFragPics[2]	= m_pClientDE->CreateSurfaceFromBitmap("interface/fragbar/i_frag.pcx");
	m_hFragPics[3]	= m_pClientDE->CreateSurfaceFromBitmap("interface/fragbar/g_frag.pcx");

#ifdef _ADDON
	m_hFragPics[4]	= m_pClientDE->CreateSurfaceFromBitmap("interface_ao/fragbar/mc_frag.pcx");
	m_hFragPics[5]	= m_pClientDE->CreateSurfaceFromBitmap("interface_ao/fragbar/fc_frag.pcx");
	m_hFragPics[6]	= m_pClientDE->CreateSurfaceFromBitmap("interface_ao/fragbar/sd_frag.pcx");
	m_hFragPics[7]	= m_pClientDE->CreateSurfaceFromBitmap("interface_ao/fragbar/p_frag.pcx");
#endif

	m_hFragPics[FRAG_PIC_VOICE]   = m_pClientDE->CreateSurfaceFromBitmap("interface/fragbar/v_frag.pcx");
	m_hFragPics[FRAG_PIC_UNKNOWN] = m_pClientDE->CreateSurfaceFromBitmap("interface/fragbar/u_frag.pcx");

	m_hFragBar		= m_pClientDE->CreateSurfaceFromBitmap("interface/fragbar/fragbar.pcx");

	// Setup fonts
	m_pFont = new CoolFont();
	m_pFont->Init(m_pClientDE, "interface/fragbar/frag_font_1.pcx");
	m_pFont->LoadXWidths("interface/fragbar/frag_font_1.fnt");

	// Setup cursor
	m_pCursor = new CoolFontCursor();
	m_pCursor->SetFont(m_pFont);

	// Setup transparency color
	m_hTransColor = m_pClientDE->SetupColor1(1.0f, 0.0f, 1.0f, DFALSE);

	// Setup starting team id for single column drawing
	m_nTeamID = 0;
}

//*********************************************************************************

void CFragInfo::AddClient (HSTRING hstrName, DDWORD nID, int nFragCount, DBYTE byCharacter)
{
	if (!m_pClientDE) return;

	// if we already have this client in the list, just return

	CLIENT_INFO* pDup = m_pClients;
	while (pDup)
	{
		if (pDup->nID == nID) return;
		pDup = pDup->pNext;
	}

	// create the new object

	CLIENT_INFO* pNew = new CLIENT_INFO;
	if (!pNew) return;

	pNew->nID = nID;
	pNew->hstrName = m_pClientDE->CopyString(hstrName);
	pNew->nFrags = nFragCount;
	pNew->byCharacter = byCharacter;

	m_pClientDE->CPrint(m_pClientDE->GetStringData(hstrName));

	// if we don't have a list yet, set the list pointer to the new object

	if (!m_pClients)
	{
		m_pClients = pNew;
		return;
	}

	// we do have a list - add the new object at the end

	CLIENT_INFO* ptr = m_pClients;
	while (ptr->pNext)
	{
		ptr = ptr->pNext;
	}
	ptr->pNext = pNew;
	pNew->pPrev = ptr;

	// Add zero frags so that the player will get sorted properly...

	DDWORD dwLocalID = 0;
	m_pClientDE->GetLocalClientID(&dwLocalID);
	AddFrags(dwLocalID, nID, 0);
}

//*********************************************************************************

void CFragInfo::RemoveClient (DDWORD nID)
{
	if (!m_pClientDE || !m_pClients) return;

	// find the client

	CLIENT_INFO* ptr = m_pClients;
	while (ptr)
	{
		if (ptr->nID == nID) break;
		ptr = ptr->pNext;
	}
	if (!ptr) return;

	// remove the client from the list

	if (ptr->pNext) ptr->pNext->pPrev = ptr->pPrev;
	if (ptr->pPrev) ptr->pPrev->pNext = ptr->pNext;
	if (m_pClients == ptr) m_pClients = ptr->pNext;

	m_pClientDE->FreeString (ptr->hstrName);
	delete ptr;
}

//*********************************************************************************

CLIENT_INFO* CFragInfo::GetClientInfo(DDWORD dwID)
{
	// Sanity checks...

	if (!m_pClients) return(NULL);


	// Find the client...

	CLIENT_INFO* ptr = m_pClients;
	while (ptr)
	{
		if (ptr->nID == dwID) return(ptr);
		ptr = ptr->pNext;
	}


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

	return(NULL);
}

//*********************************************************************************

void CFragInfo::RemoveAllClients()
{
	if (!m_pClientDE) return;

	CLIENT_INFO* ptr = DNULL;
	while (m_pClients)
	{
		ptr = m_pClients->pNext;
		m_pClientDE->FreeString (m_pClients->hstrName);
		delete m_pClients;
		m_pClients = ptr;
	}
}

//*********************************************************************************

void CFragInfo::AddFrag (DDWORD nLocalID, DDWORD nID)
{
	if (!m_pClientDE || !m_pClients) return;

	// find the client

	CLIENT_INFO* ptr = m_pClients;
	while (ptr)
	{
		if (ptr->nID == nID)
		{
			// add to the frag count
			ptr->nFrags++;
			break;
		}
		ptr = ptr->pNext;
	}
	if (!ptr) return;

	// put this client in the correct position in the list (most frags to least frags)

	CLIENT_INFO* pCurrent = ptr;
	while (ptr->pPrev && pCurrent->nFrags > ptr->pPrev->nFrags)	ptr = ptr->pPrev;
	if (ptr == pCurrent) return;

	// we found a new position - remove current from the list

	pCurrent->pPrev->pNext = pCurrent->pNext;
	if (pCurrent->pNext) pCurrent->pNext->pPrev = pCurrent->pPrev;

	// put us back in in the correct position

	if (!ptr->pPrev)
	{
		m_pClients = pCurrent;
	}

	pCurrent->pPrev = ptr->pPrev;
	pCurrent->pNext = ptr;
	if (ptr->pPrev) ptr->pPrev->pNext = pCurrent;
	ptr->pPrev = pCurrent;
}

//*********************************************************************************

void CFragInfo::AddFrags (DDWORD nLocalID, DDWORD nID, int nFrags)
{
	if (!m_pClientDE || !m_pClients) return;

	// find the client

	CLIENT_INFO* ptr = m_pClients;
	while (ptr)
	{
		if (ptr->nID == nID)
		{
			// add to the frag count
			ptr->nFrags += nFrags;
			break;
		}
		ptr = ptr->pNext;
	}
	if (!ptr) return;

	// put this client in the correct position in the list (most frags to least frags)

	CLIENT_INFO* pCurrent = ptr;
	while (ptr->pPrev && pCurrent->nFrags > ptr->pPrev->nFrags)	ptr = ptr->pPrev;
	if (ptr == pCurrent) return;

	// we found a new position - remove current from the list

	pCurrent->pPrev->pNext = pCurrent->pNext;
	if (pCurrent->pNext) pCurrent->pNext->pPrev = pCurrent->pPrev;

	// put us back in in the correct position

	if (!ptr->pPrev)
	{
		m_pClients = pCurrent;
	}

	pCurrent->pPrev = ptr->pPrev;
	pCurrent->pNext = ptr;
	if (ptr->pPrev) ptr->pPrev->pNext = pCurrent;
	ptr->pPrev = pCurrent;
}

//*********************************************************************************

void CFragInfo::RemoveFrag (DDWORD nLocalID, DDWORD nID)
{
	if (!m_pClientDE || !m_pClients) return;

	// find the client

	CLIENT_INFO* ptr = m_pClients;
	while (ptr)
	{
		if (ptr->nID == nID)
		{
			// remove from the frag count
			ptr->nFrags--;
			break;
		}
		ptr = ptr->pNext;
	}
	if (!ptr) return;

	// put this client in the correct position in the list (most frags to least frags)

	CLIENT_INFO* pCurrent = ptr;
	while (ptr->pNext && pCurrent->nFrags < ptr->pNext->nFrags)	ptr = ptr->pNext;
	if (ptr == pCurrent) return;

	// we found a new position - remove current from the list

	pCurrent->pNext->pPrev = pCurrent->pPrev;
	if (pCurrent->pPrev) pCurrent->pPrev->pNext = pCurrent->pNext;
	if (m_pClients == pCurrent) m_pClients = pCurrent->pNext;

	// put us back in in the correct position

	pCurrent->pPrev = ptr;
	pCurrent->pNext = ptr->pNext;
	if (ptr->pNext) ptr->pNext->pPrev = pCurrent;
	ptr->pNext = pCurrent;
}

//*********************************************************************************

DDWORD CFragInfo::GetNumClients()
{
	if (!m_pClientDE) return 0;

	CLIENT_INFO* ptr = m_pClients;

	DDWORD nCount = 0;
	while (ptr)
	{
		nCount++;
		ptr = ptr->pNext;
	}

	return nCount;
}

//*********************************************************************************

char* CFragInfo::GetPlayerName (DDWORD nID)
{
	if (!m_pClientDE) return DNULL;

	CLIENT_INFO* ptr = m_pClients;
	while (ptr)
	{
		if (ptr->nID == nID) return m_pClientDE->GetStringData (ptr->hstrName);
		ptr = ptr->pNext;
	}

	return DNULL;
}

//*********************************************************************************

DBYTE CFragInfo::GetPlayerCharacter (DDWORD nID)
{
	if (!m_pClientDE) return DNULL;

	CLIENT_INFO* ptr = m_pClients;
	while (ptr)
	{
		if (ptr->nID == nID) return ptr->byCharacter;
		ptr = ptr->pNext;
	}

	return 0;
}

//*********************************************************************************

void CFragInfo::Draw (DBOOL bDrawSingleFragCount, DBOOL bDrawAllFragCounts)
{
	if (!m_pClientDE) return;// || (!bDrawSingleFragCount && !bDrawAllFragCounts)) return;

	// make sure we're in a network game
	int nGameMode = 0;
	m_pClientDE->GetGameMode(&nGameMode);
	if (nGameMode == STARTGAME_NORMAL || nGameMode == GAMEMODE_NONE) return;

	// Update resolution stuff
	AdjustRes();

	// Draw the team or normal frag table as necessary
	if (g_pBloodClientShell->IsMultiplayerTeamBasedGame())	
	{
		DrawTeams();
	}
	else
	{
		UpdateFragTable();
		HSURFACE	hScreen = m_pClientDE->GetScreenSurface();
		m_pClientDE->DrawSurfaceToSurfaceTransparent(hScreen, m_hFragTable, DNULL, m_nFragTableX, m_nFragTableY, m_hTransColor);
	}
}

//*********************************************************************************

void CFragInfo::Draw (DBOOL bDrawSingleFragCount, DBOOL bDrawAllFragCounts, HSURFACE hSurf)
{
	if (!m_pClientDE) return;// || (!bDrawSingleFragCount && !bDrawAllFragCounts)) return;

	// make sure we're in a network game
	int nGameMode = 0;
	m_pClientDE->GetGameMode(&nGameMode);
	if (nGameMode == STARTGAME_NORMAL || nGameMode == GAMEMODE_NONE) return;

	// Update resolution stuff
	AdjustRes();

	// Draw the team or normal frag table as necessary
	if (g_pBloodClientShell->IsMultiplayerTeamBasedGame())	
	{
		DrawTeams();
	}
	else
	{
		UpdateFragTable();

⌨️ 快捷键说明

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