📄 newstatusbar.cpp
字号:
//*************************************************************************
//*************************************************************************
//***** 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 + -