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

📄 newstatusbar.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//*************************************************************************
//*************************************************************************
//***** MODULE  : StatusBar.cpp
//***** PURPOSE : Blood 2 Status Bar
//***** CREATED : 11/4/97
//***** MODIFIED: 3/30/98
//*************************************************************************
//*************************************************************************

#include "ClientRes.h"
#include "NewStatusBar.h"
#include "VKDefs.h"
#include "SharedDefs.h"
#include "ClientUtilities.h"
#include <stdio.h>
#include <mbstring.h>
#include "SoundTypes.h"
#include "BloodClientShell.h"

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

static float	g_ObjScaleUpX[OBJTAB_SCALE_LEVELS + 1] =
					{2.0f, 1.75f, 1.55f, 1.4f, 1.25f, 1.1f, 1.0f, 0.9f, 0.85f, 0.9f, 1.0f};
static float	g_ObjScaleUpY[OBJTAB_SCALE_LEVELS + 1] =
					{0.0f, 0.01f, 0.04f, 0.09f, 0.16f, 0.25f, 0.36f, 0.49f, 0.64f, 0.81f, 1.0f};
static float	g_ObjScaleDownX[OBJTAB_SCALE_LEVELS + 1] =
					{1.0f, 0.81f, 0.64f, 0.49f, 0.36f, 0.25f, 0.16f, 0.09f, 0.04f, 0.01f, 0.0f};
static float	g_ObjScaleDownY[OBJTAB_SCALE_LEVELS + 1] =
					{1.0f, 0.9f, 0.85f, 0.9f, 1.0f, 1.1f, 1.25f, 1.4f, 1.55f, 1.75f, 2.0f};
//					{1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f};

//*************************************************************************
//*****	Function:	CNewStatusBar()
//*****	Details:	Constructor
//*************************************************************************

CNewStatusBar::CNewStatusBar()
{
	m_pClientDE = 0;

	// Surfaces
	m_hMask = 0;
	m_hItemName = 0;
	m_hObjectives = 0;
	m_hObjectivesIcon = 0;
	m_hPowerBar = 0;
	m_hHealthBar = 0;
	m_hThrowBar = 0;
	m_hFlagIcon = 0;
	m_hTeamIcon = 0;

	// Fonts and cursors
	m_pStatCursor = 0;
	m_pStatFont1 = 0;
	m_pStatNumbers1 = 0;
	m_pStatNumbers2 = 0;
	m_pObjectivesFont1 = 0;

	m_nStatLevel = STATTAB_HIGH;
	m_nOldStatLevel = STATTAB_HIGH;
	m_nInvLevel = INVTAB_INVISIBLE;
	m_nWeapLevel = WEAPTAB_INVISIBLE;
	m_nObjLevel = OBJTAB_INVISIBLE;
	m_nObjIcon = OBJICON_INVISIBLE;
	m_nPowerBar = BARTAB_NONE;
	m_nFlagLevel = MULTIFLAG_NONE;

	// Old values
	m_nOldHealth = -1;
	m_nOldArmor = -1;
	m_nOldAmmo = -1;
	m_nOldAltAmmo = -1;

	// Inventory
	m_nItemNameX = 0;
	m_nItemNameY = 0;

	m_fInvUpdateTime = 0.0f;
	m_fInvScrollRatio = 0.0f;

	// Weapons
	m_fWeapUpdateTime = 0.0f;
	m_fWeapScrollRatio = 0.0f;

	for(int i = 0; i < 10; i++)
	{
		m_pWeapPics[i] = 0;
		m_pWeapPicsH[i] = 0;
	}

	m_nCurrentWeapon = 0;

	// Objectives
	m_fObjUpdateTime = 0.0f;
	m_fObjScaleRatio = 0.0f;

	m_rObjectives.top = 0;
	m_rObjectives.left = 0;
	m_rObjectives.bottom = 0;
	m_rObjectives.right = 0;

	m_nObjectivesX = 100;
	m_nObjectivesY = 75;

	// Power bars
	m_fPowerBarUpdate = 0.0f;

	m_nPowerBarX = 0;
	m_nPowerBarY = 0;

	// General
	m_nScreenWidth = 0;
	m_nScreenHeight = 0;
	m_bHighGraphics = DTRUE;

	m_hTransColor = 0;
	m_hMaskColor = 0;
	m_hThrowColor = 0;
	m_hAirColor = 0;
	m_hBossColor = 0;

	m_fTime = 0.0f;

	m_nTeamIconHeight = 0;
	m_nTeamID         = -1;
}

//*************************************************************************
//*****	Function:	~CNewStatusBar()
//*****	Details:	Destructor
//*************************************************************************

CNewStatusBar::~CNewStatusBar()
{
	for(int i = 0; i < 10; i++)
	{
		if( m_pWeapPics[i] )
			g_pClientDE->FreeString( m_pWeapPics[i] );
		if( m_pWeapPicsH[i] )
			g_pClientDE->FreeString( m_pWeapPicsH[i] );
	}
}

//*************************************************************************
//*****	Function:	Init(CClientDE* pClientDE)
//*****	Details:	Initializes the status screens
//*************************************************************************

DBOOL CNewStatusBar::Init(CClientDE* pClientDE)
{
	if (!pClientDE) return DFALSE;
	Term();

	m_pClientDE = pClientDE;

	// Initialize the graphic surfaces
	m_hMask			= m_pClientDE->CreateSurfaceFromBitmap("interface/pixelmasks/mask25.pcx");
	m_hItemName		= m_pClientDE->CreateSurface(100, 14);
	m_hObjectives	= m_pClientDE->CreateSurfaceFromBitmap("interface/objectives/objectives.pcx");
	m_hObjectivesIcon = m_pClientDE->CreateSurfaceFromBitmap("interface/objectives/skull.pcx");
	m_hPowerBar		= m_pClientDE->CreateSurface(150, 16);
	m_hHealthBar	= m_pClientDE->CreateSurfaceFromBitmap("interface/statusbar/bar_health.pcx");
	m_hThrowBar		= m_pClientDE->CreateSurfaceFromBitmap("interface/statusbar/bar_throw.pcx");

	// Create a font cursor
	m_pStatCursor = new CoolFontCursor();

	// Setup fonts
	m_pStatFont1 = new CoolFont();
	m_pStatFont1->Init(m_pClientDE, "interface/statusbar/fonts/stat_font_1.pcx");
	m_pStatFont1->LoadXWidths("interface/statusbar/fonts/stat_font_1.fnt");

	m_pStatNumbers1 = new CoolFont();
	m_pStatNumbers1->Init(m_pClientDE, "interface/statusbar/fonts/big_numbers.pcx");
	m_pStatNumbers1->LoadXWidths("interface/statusbar/fonts/big_numbers.fnt");

	m_pStatNumbers2 = new CoolFont();
	m_pStatNumbers2->Init(m_pClientDE, "interface/statusbar/fonts/small_numbers.pcx");
	m_pStatNumbers2->LoadXWidths("interface/statusbar/fonts/small_numbers.fnt");

	m_pObjectivesFont1 = new CoolFont();
	m_pObjectivesFont1->Init(m_pClientDE, "interface/objectives/obj_font_1.pcx");
	m_pObjectivesFont1->LoadXWidths("interface/objectives/obj_font_1.fnt");

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

	// Init tabs
	InitStatTabs();
	InitInvTabs();
	InitWeaponTabs();
	InitObjectivesTab();

	// Init tab locations
	AdjustRes();

	return DTRUE;
}

//*************************************************************************
//*****	Function:	AdjustRes()
//*****	Details:	Sets new locations for status tabs if the game resolution changes
//*************************************************************************

void CNewStatusBar::AdjustRes()
{
	if (!m_pClientDE) return;

	// Check to see if the screen resolution has changed... if not then return
	DDWORD	width, height;
	HSURFACE hScreen = m_pClientDE->GetScreenSurface();

	m_pClientDE->GetSurfaceDims(hScreen, &width, &height);
	if((m_nScreenWidth == width) && (m_nScreenHeight == height))	return;

	// Set the screen width and height variables to the new resolution
	m_nScreenWidth = width;
	m_nScreenHeight = height;

	// If we are lower than the prefered res, default to LOW stat mode
	if((m_nScreenWidth < STATTAB_LOW_WIDTH) || (m_nScreenHeight < STATTAB_LOW_HEIGHT))
	{
		m_bHighGraphics = DFALSE;
		m_nStatLevel = STATTAB_LOW;
		m_nInvLevel = INVTAB_INVISIBLE;
		m_nWeapLevel = WEAPTAB_INVISIBLE;
	}
	else
	{
		m_bHighGraphics = DTRUE;
		m_nStatLevel = STATTAB_HIGH;
	}

	// Adjust the stat tab locations to the new resolution
	m_stHealth.locX		= 0;
	m_stHealth.locY		= m_nScreenHeight - m_stHealth.sizeY;

	if(m_nStatLevel == STATTAB_HIGH)	m_stArmor.locX		= m_stHealth.sizeX;
		else							m_stArmor.locX		= m_stHealth.sizeX / 2;
	m_stArmor.locY		= m_nScreenHeight - m_stArmor.sizeY;

	m_stAmmo.locX		= m_nScreenWidth - m_stAmmo.sizeX;
	m_stAmmo.locY		= m_nScreenHeight - m_stAmmo.sizeY;

	m_stAltAmmo.locX	= m_stAmmo.locX + (m_stAmmo.sizeX / 2) - (m_stAltAmmo.sizeX / 2);
	m_stAltAmmo.locY	= m_stAmmo.locY - m_stAltAmmo.sizeY - 3;

	// Adjust the inventory items tabs
	m_stItems[1].locX	= 0;
	m_stItems[1].locY	= (m_nScreenHeight / 2) - (m_stItems[1].sizeY / 2);
	m_stItems[0].locX	= -15;
	m_stItems[0].locY	= m_stItems[1].locY - m_stItems[1].sizeY;
	m_stItems[2].locX	= -15;
	m_stItems[2].locY	= m_stItems[1].locY + m_stItems[1].sizeY;

	// Adjust the current item tab locations to the new resolution
	m_stCurrentItem.locX= 20;
	m_stCurrentItem.locY= m_nScreenHeight - m_stHealth.sizeY - m_stCurrentItem.sizeY;

	if(m_bHighGraphics)
	{
		m_nItemNameX		= m_stItems[1].sizeX + 10;
		m_nItemNameY		= (m_nScreenHeight / 2) - (m_pStatFont1->height / 2);
	}
	else
	{
		m_nItemNameX		= m_stCurrentItem.locX + m_stCurrentItem.sizeX + 10;
		m_nItemNameY		= m_stCurrentItem.locY + (m_stCurrentItem.sizeY / 2) - (m_pStatFont1->height / 2);
	}

	// Adjust the weapon tab locations
	DDWORD	offset		= (m_nScreenHeight / 2) - (m_stWeapons[0].sizeY * 5);

	for(int i = 0; i < 10; i++)
	{
		m_stWeapons[i].locX		= m_nScreenWidth - m_stWeapons[i].sizeX;
		m_stWeapons[i].locY		= offset;
		offset += m_stWeapons[i].sizeY;
	}

	// Adjust the power bar location
	m_pClientDE->GetSurfaceDims(m_hPowerBar, &width, &height);
	m_nPowerBarX = (m_nScreenWidth - width) / 2;
	m_nPowerBarY = m_stAmmo.locY - height - height;
}

//*************************************************************************
//*****	Function:	Term()
//*****	Details:	Terminates the status screens
//*************************************************************************

void CNewStatusBar::Term()
{
	if(m_pClientDE)
	{
		if(m_hMask)			{ m_pClientDE->DeleteSurface(m_hMask); m_hMask = 0; }
		if(m_hItemName)		{ m_pClientDE->DeleteSurface(m_hItemName); m_hItemName = 0; }
		if(m_hObjectives)	{ m_pClientDE->DeleteSurface(m_hObjectives); m_hObjectives = 0; }
		if(m_hPowerBar)		{ m_pClientDE->DeleteSurface(m_hPowerBar); m_hPowerBar = 0; }
		if(m_hHealthBar)	{ m_pClientDE->DeleteSurface(m_hHealthBar); m_hHealthBar = 0; }
		if(m_hThrowBar)		{ m_pClientDE->DeleteSurface(m_hThrowBar); m_hThrowBar = 0; }
		if(m_hTeamIcon)		{ m_pClientDE->DeleteSurface(m_hTeamIcon); m_hTeamIcon = 0; }

		if(m_pStatCursor)	{ delete m_pStatCursor; m_pStatCursor = 0; }
		if(m_pStatFont1)	{ m_pStatFont1->Free(); delete m_pStatFont1; m_pStatFont1 = 0; }
		if(m_pStatNumbers1)	{ m_pStatNumbers1->Free(); delete m_pStatNumbers1; m_pStatNumbers1 = 0; }
		if(m_pStatNumbers2)	{ m_pStatNumbers2->Free(); delete m_pStatNumbers2; m_pStatNumbers2 = 0; }
		if(m_pObjectivesFont1) { m_pObjectivesFont1->Free(); delete m_pObjectivesFont1; m_pObjectivesFont1 = 0; }

		TermStatTabs();
		TermInvTabs();
		TermWeaponTabs();

		m_pClientDE = 0;
	}
}

//*************************************************************************
//*****	Function:	InitStatTabs()
//*****	Details:	Initializes the status tabs
//*************************************************************************

DBOOL CNewStatusBar::InitStatTabs()
{
	// Health status tab
	m_stHealth.sizeX	= 185;
	m_stHealth.sizeY	= 55;

	m_stHealth.hTab		= m_pClientDE->CreateSurface(m_stHealth.sizeX, m_stHealth.sizeY);
	m_stHealth.hBorder	= m_pClientDE->CreateSurfaceFromBitmap("interface/statusbar/border_health.pcx");
	m_stHealth.hIcon	= m_pClientDE->CreateSurfaceFromBitmap("interface/statusbar/icon_health.pcx");
	m_stHealth.hBar		= m_pClientDE->CreateSurfaceFromBitmap("interface/statusbar/status_ticker.pcx");

	m_stHealth.borderX	= 10;
	m_stHealth.borderY	= 2;
	m_stHealth.borderJ	= STATTAB_JUST_NW;

	m_stHealth.iconX	= 32;
	m_stHealth.iconY	= 7;
	m_stHealth.iconJ	= STATTAB_JUST_NW;

	m_stHealth.barX		= 115;
	m_stHealth.barY		= 5;
	m_stHealth.barJ		= STATTAB_JUST_NW;

	m_stHealth.valueX	= 80;
	m_stHealth.valueY	= 10;
	m_stHealth.valueJ	= CF_JUSTIFY_CENTER;
	m_stHealth.digits	= 3;

	// Armor status tab
	m_stArmor.sizeX		= 200;
	m_stArmor.sizeY		= 55;

	m_stArmor.hTab		= m_pClientDE->CreateSurface(m_stArmor.sizeX, m_stArmor.sizeY);
	m_stArmor.hBorder	= m_pClientDE->CreateSurfaceFromBitmap("interface/statusbar/border_armor.pcx");
	m_stArmor.hIcon		= m_pClientDE->CreateSurfaceFromBitmap("interface/statusbar/icon_armor.pcx");
	m_stArmor.hBar		= m_pClientDE->CreateSurfaceFromBitmap("interface/statusbar/status_ticker.pcx");

	m_stArmor.borderX	= 0;
	m_stArmor.borderY	= 1;
	m_stArmor.borderJ	= STATTAB_JUST_NW;

	m_stArmor.iconX		= 45;
	m_stArmor.iconY		= 7;
	m_stArmor.iconJ		= STATTAB_JUST_NW;

	m_stArmor.barX		= 125;
	m_stArmor.barY		= 5;
	m_stArmor.barJ		= STATTAB_JUST_NW;

	m_stArmor.valueX	= 90;
	m_stArmor.valueY	= 10;
	m_stArmor.valueJ	= CF_JUSTIFY_CENTER;
	m_stArmor.digits	= 3;

	// Ammo status tab
	m_stAmmo.sizeX		= 135;
	m_stAmmo.sizeY		= 75;

	m_stAmmo.hTab		= m_pClientDE->CreateSurface(m_stAmmo.sizeX, m_stAmmo.sizeY);
	m_stAmmo.hBorder	= m_pClientDE->CreateSurfaceFromBitmap("interface/statusbar/border_ammo.pcx");
	m_stAmmo.hIcon		= 0;
	m_stAmmo.hBar		= 0;

	m_stAmmo.borderX	= 8;
	m_stAmmo.borderY	= 24;

⌨️ 快捷键说明

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