mirror of
https://github.com/nillerusr/source-engine.git
synced 2025-06-08 08:18:13 +00:00
307 lines
7.6 KiB
C++
307 lines
7.6 KiB
C++
#include "cbase.h"
|
|
#include "hud.h"
|
|
#include "hud_macros.h"
|
|
#include "view.h"
|
|
|
|
#include "iclientmode.h"
|
|
|
|
#include <KeyValues.h>
|
|
#include <vgui/ISurface.h>
|
|
#include <vgui/ISystem.h>
|
|
#include <vgui_controls/AnimationController.h>
|
|
|
|
#include <vgui/ILocalize.h>
|
|
|
|
using namespace vgui;
|
|
|
|
#include "c_asw_player.h"
|
|
#include "c_asw_marine.h"
|
|
#include "asw_marine_profile.h"
|
|
#include "c_asw_marine_resource.h"
|
|
#include "c_asw_game_resource.h"
|
|
#include "asw_gamerules.h"
|
|
#include "asw_hud_marine_portrait.h"
|
|
|
|
#include "vguimatsurface/imatsystemsurface.h"
|
|
|
|
#include "ConVar.h"
|
|
#include "tier0/vprof.h"
|
|
|
|
#include "asw_hud_portraits.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
#define INIT_HEALTH -1
|
|
|
|
extern ConVar asw_draw_hud;
|
|
ConVar asw_portraits_border("asw_portraits_border", "8", 0, "Black border around HUD portraits");
|
|
ConVar asw_portraits_border_shrink("asw_portraits_border_shrink", "0.5f", 0, "How much of the border is applied to the actual size of the portrait.");
|
|
ConVar asw_portraits_hide( "asw_portraits_hide", "0", FCVAR_NONE );
|
|
|
|
//DECLARE_HUDELEMENT( CASWHudPortraits );
|
|
|
|
CASWHudPortraits::CASWHudPortraits( const char *pElementName ) : CASW_HudElement( pElementName ), CHudNumericDisplay(NULL, "ASWHudPortraits")
|
|
{
|
|
SetHiddenBits( HIDEHUD_REMOTE_TURRET );
|
|
vgui::HScheme scheme = vgui::scheme()->LoadSchemeFromFile("resource/SwarmSchemeNew.res", "SwarmSchemeNew");
|
|
SetScheme(scheme);
|
|
|
|
m_iNumMyMarines = 0;
|
|
m_iNumOtherMarines = 0;
|
|
m_FrameWidth = 0;
|
|
m_CurrentY = 0;
|
|
m_iCurrentMarine = 0;
|
|
m_nInfestedTexture = -1;
|
|
m_nFiringTexture = -1;
|
|
m_nWhiteTexture = -1;
|
|
m_iFiringMod = 0;
|
|
m_fFiringFade = 0;
|
|
m_fInfestedFade = 0;
|
|
// JOYPAD REMOVED
|
|
//m_bLastJoypadMode = engine->ASW_IsJoypadMode();
|
|
m_bLastJoypadMode = false;
|
|
|
|
// bar locations on our texture
|
|
m_PortraitBar[PB_HEALTH].CornerX = 104;
|
|
m_PortraitBar[PB_HEALTH].CornerY = 13;
|
|
m_PortraitBar[PB_HEALTH].Width = 17;
|
|
m_PortraitBar[PB_HEALTH].Height = 90;
|
|
|
|
m_PortraitBar[PB_AMMO].CornerX = 87;
|
|
m_PortraitBar[PB_AMMO].CornerY = 13;
|
|
m_PortraitBar[PB_AMMO].Width = 12;
|
|
m_PortraitBar[PB_AMMO].Height = 90;
|
|
|
|
m_PortraitBar[PB_CLIPS].CornerX = 74;
|
|
m_PortraitBar[PB_CLIPS].CornerY = 13;
|
|
m_PortraitBar[PB_CLIPS].Width = 9;
|
|
m_PortraitBar[PB_CLIPS].Height = 90;
|
|
|
|
// create the portrait panels
|
|
for (int i=0;i<ASW_MAX_PORTRAITS;i++)
|
|
{
|
|
m_pPortraits[i] = new CASW_HUD_Marine_Portrait(this, "Portrait", this);
|
|
m_pPortraits[i]->SetAlpha(0);
|
|
m_pPortraits[i]->SetVisible(false); // portraits start out invisible, become visible when given a marine resource
|
|
}
|
|
}
|
|
|
|
|
|
void CASWHudPortraits::Init()
|
|
{
|
|
Reset();
|
|
}
|
|
|
|
void CASWHudPortraits::Reset()
|
|
{
|
|
SetLabelText(L"Portaits");
|
|
for (int i=0;i<ASW_MAX_PORTRAITS;i++)
|
|
{
|
|
if (m_pPortraits[i])
|
|
m_pPortraits[i]->SetMarineResource(NULL, i, false);
|
|
}
|
|
}
|
|
|
|
void CASWHudPortraits::VidInit()
|
|
{
|
|
Reset();
|
|
}
|
|
|
|
void CASWHudPortraits::UpdatePortraits(bool bResize)
|
|
{
|
|
int iPortraitIndex = 0;
|
|
|
|
// inform each portrait about the marine it should be displaying
|
|
for (int i=0;i<m_iNumMyMarines;i++)
|
|
{
|
|
m_pPortraits[iPortraitIndex]->SetMarineResource(m_hMyMarine[i], iPortraitIndex, true, bResize); // causes it to be positioned accordingly
|
|
iPortraitIndex++;
|
|
if (iPortraitIndex >= ASW_MAX_PORTRAITS)
|
|
break;
|
|
}
|
|
if (iPortraitIndex < ASW_MAX_PORTRAITS)
|
|
{
|
|
for (int i=0;i<m_iNumOtherMarines;i++)
|
|
{
|
|
m_pPortraits[iPortraitIndex]->SetMarineResource(m_hOtherMarine[i], iPortraitIndex, false, bResize); // causes it to be positioned accordingly
|
|
iPortraitIndex++;
|
|
if (iPortraitIndex >= ASW_MAX_PORTRAITS)
|
|
break;
|
|
}
|
|
}
|
|
// hide all subsequent ones
|
|
for (int i=iPortraitIndex;i<ASW_MAX_PORTRAITS;i++)
|
|
{
|
|
m_pPortraits[i]->SetMarineResource(NULL, iPortraitIndex, false);
|
|
}
|
|
}
|
|
|
|
void CASWHudPortraits::OnThink()
|
|
{
|
|
VPROF_BUDGET( "CASWHudPortraits::OnThink", VPROF_BUDGETGROUP_ASW_CLIENT );
|
|
|
|
int iNumMyMarines = 0;
|
|
int iNumOtherMarines = 0;
|
|
C_ASW_Player *local = C_ASW_Player::GetLocalASWPlayer();
|
|
if ( local )
|
|
{
|
|
C_ASW_Game_Resource* pGameResource = ASWGameResource();
|
|
if (pGameResource)
|
|
{
|
|
for (int i=0;i<pGameResource->GetMaxMarineResources();i++)
|
|
{
|
|
C_ASW_Marine_Resource* pMR = pGameResource->GetMarineResource(i);
|
|
if (pMR)
|
|
{
|
|
if (pMR->GetCommander() == local)
|
|
{
|
|
m_hMyMarine[iNumMyMarines] = pMR;
|
|
|
|
iNumMyMarines++;
|
|
if (pMR->GetMarineEntity() == local->GetMarine())
|
|
m_hCurrentlySelectedMarineResource = pMR;
|
|
}
|
|
else if (!(ASWGameRules() && ASWGameRules()->IsTutorialMap())) // in tutorial, don't show marines not under your command
|
|
{
|
|
m_hOtherMarine[iNumOtherMarines] = pMR;
|
|
iNumOtherMarines++;
|
|
}
|
|
}
|
|
}
|
|
// clear out future slots
|
|
for (int i=iNumMyMarines;i<ASW_MAX_MARINE_RESOURCES;i++)
|
|
{
|
|
m_hMyMarine[i] == NULL;
|
|
}
|
|
for (int i=iNumOtherMarines;i<ASW_MAX_MARINE_RESOURCES;i++)
|
|
{
|
|
m_hOtherMarine[i] == NULL;
|
|
}
|
|
}
|
|
}
|
|
// JOYPAD REMOVED
|
|
//bool bJoypadModeChanged = (m_bLastJoypadMode != engine->ASW_IsJoypadMode());
|
|
//m_bLastJoypadMode = engine->ASW_IsJoypadMode();
|
|
bool bJoypadModeChanged = m_bLastJoypadMode = false;
|
|
bool bResize = ((m_iNumMyMarines != iNumMyMarines) || (m_iNumOtherMarines != iNumOtherMarines) || bJoypadModeChanged);
|
|
m_iNumMyMarines = iNumMyMarines;
|
|
m_iNumOtherMarines = iNumOtherMarines;
|
|
|
|
UpdatePortraits(bResize);
|
|
}
|
|
|
|
void CASWHudPortraits::ApplySchemeSettings(IScheme *pScheme)
|
|
{
|
|
BaseClass::ApplySchemeSettings(pScheme);
|
|
SetBgColor(Color(0,0,0,0));
|
|
}
|
|
|
|
void CASWHudPortraits::Paint()
|
|
{
|
|
VPROF_BUDGET( "CASWHudPortraits::Paint", VPROF_BUDGETGROUP_ASW_CLIENT );
|
|
int tall;
|
|
|
|
GetSize(m_FrameWidth,tall);
|
|
m_CurrentY = 0;
|
|
m_iCurrentMarine = 0;
|
|
}
|
|
|
|
void CASWHudPortraits::OnPortraitSizeChanged( CASW_HUD_Marine_Portrait *pPortrait )
|
|
{
|
|
InvalidateLayout();
|
|
}
|
|
|
|
void CASWHudPortraits::PerformLayout()
|
|
{
|
|
BaseClass::PerformLayout();
|
|
|
|
if ( m_bHorizontalLayout )
|
|
{
|
|
int border = 1;
|
|
int panel_padding = 1;
|
|
int x = 0;
|
|
|
|
// count portraits
|
|
int iNumPortraits = 0;
|
|
for (int i=0;i<ASW_MAX_PORTRAITS;i++)
|
|
{
|
|
if ( !m_pPortraits[i] )
|
|
continue;
|
|
|
|
iNumPortraits++;
|
|
}
|
|
|
|
// first place your own portrait
|
|
int iMyPortrait = -1;
|
|
for (int i=0;i<ASW_MAX_PORTRAITS;i++)
|
|
{
|
|
if ( !m_pPortraits[i] )
|
|
continue;
|
|
|
|
if ( m_pPortraits[i]->m_bLocalMarine )
|
|
{
|
|
border = 10.0f * m_pPortraits[i]->m_fScale;
|
|
panel_padding = 11 * m_pPortraits[i]->m_fScale;
|
|
x = border;
|
|
int w, h;
|
|
m_pPortraits[i]->GetSize( w, h );
|
|
m_pPortraits[i]->SetPos( x, GetTall() - ( h + border ) );
|
|
iMyPortrait = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// now place other portraits in reverse order from the right edge
|
|
x = 0;
|
|
for (int i=ASW_MAX_PORTRAITS-1; i>iMyPortrait; i--)
|
|
{
|
|
if ( !m_pPortraits[i] || !m_pPortraits[i]->m_hMarineResource.Get() )
|
|
continue;
|
|
|
|
if ( x == 0 )
|
|
{
|
|
border = 10.0f * m_pPortraits[i]->m_fScale;
|
|
panel_padding = 11 * m_pPortraits[i]->m_fScale;
|
|
|
|
x = border;
|
|
}
|
|
|
|
int w, h;
|
|
m_pPortraits[i]->GetSize( w, h );
|
|
m_pPortraits[i]->SetPos( GetWide() - ( x + w ), GetTall() - ( h + border ) );
|
|
//Msg("putting portrait %d at %d it has width %d my width %d\n", i, GetWide() - ( x + w ), w, GetWide());
|
|
x += w + panel_padding;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int border = 1;
|
|
int panel_padding = 1;
|
|
int y = 0;
|
|
|
|
for (int i=0;i<ASW_MAX_PORTRAITS;i++)
|
|
{
|
|
if ( !m_pPortraits[i] )
|
|
continue;
|
|
|
|
if ( y == 0 )
|
|
{
|
|
border = 10.0f * m_pPortraits[i]->m_fScale;
|
|
panel_padding = 11 * m_pPortraits[i]->m_fScale;
|
|
|
|
y = border;
|
|
}
|
|
|
|
int w, h;
|
|
m_pPortraits[i]->GetSize( w, h );
|
|
m_pPortraits[i]->SetPos( GetWide() - (w + border), y );
|
|
y += h + panel_padding;
|
|
}
|
|
}
|
|
}
|
|
|
|
bool CASWHudPortraits::ShouldDraw( void )
|
|
{
|
|
return CASW_HudElement::ShouldDraw() && asw_draw_hud.GetBool() && !asw_portraits_hide.GetBool();
|
|
} |