You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
4.9 KiB
175 lines
4.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "hud_technologytreedoc.h" |
|
#include "hud.h" |
|
#include "hud_macros.h" |
|
#include "techtree.h" |
|
#include "iclientmode.h" |
|
#include "hud_commander_statuspanel.h" |
|
#include "clientmode_commander.h" |
|
#include "commanderoverlaypanel.h" |
|
#include "tf_hints.h" |
|
#include "c_tf_hintmanager.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
static CTechnologyTreeDoc s_TechnologyTreeDoc; |
|
|
|
// Hook network messages |
|
DECLARE_MESSAGE( s_TechnologyTreeDoc, Technology ) |
|
|
|
// Create object singleton on stack |
|
CTechnologyTreeDoc& GetTechnologyTreeDoc() |
|
{ |
|
return s_TechnologyTreeDoc; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Construction |
|
//----------------------------------------------------------------------------- |
|
CTechnologyTreeDoc::CTechnologyTreeDoc( void ) |
|
{ |
|
m_pTree = NULL; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Destruction |
|
//----------------------------------------------------------------------------- |
|
CTechnologyTreeDoc::~CTechnologyTreeDoc( void ) |
|
{ |
|
delete m_pTree; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Initialize the panel |
|
//----------------------------------------------------------------------------- |
|
void CTechnologyTreeDoc::Init( void ) |
|
{ |
|
ReloadTechTree(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CTechnologyTreeDoc::LevelInit( void ) |
|
{ |
|
if ( m_pTree ) |
|
{ |
|
m_pTree->SetPreferredTechnology( NULL ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CTechnologyTreeDoc::LevelShutdown( void ) |
|
{ |
|
if ( m_pTree ) |
|
{ |
|
m_pTree->SetPreferredTechnology( NULL ); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CTechnologyTreeDoc::ReloadTechTree( void ) |
|
{ |
|
// FIXME, CTechnologyTreeDoc should be an entity /MO |
|
HOOK_HUD_MESSAGE( s_TechnologyTreeDoc, Technology ); |
|
|
|
// Reconstruct the tech tree |
|
delete m_pTree; |
|
|
|
// FIXME: If we reactivate this, we'll need to revisit team number here... |
|
m_pTree = new CTechnologyTree( ::filesystem, 0); |
|
Assert( m_pTree ); |
|
|
|
m_pTree->SetPreferredTechnology( NULL ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Receive hud update message from server |
|
// Input : *pszName - |
|
// iSize - |
|
// *pbuf - |
|
// Output : int |
|
//----------------------------------------------------------------------------- |
|
int CTechnologyTreeDoc::MsgFunc_Technology(bf_read &msg) |
|
{ |
|
int index; |
|
int available; |
|
int voters; |
|
float resourcelevel; |
|
bool preferred; |
|
|
|
// Which tech |
|
index = msg.ReadByte(); |
|
// Available to this team? |
|
available = msg.ReadByte(); |
|
// # of players indicating this as their preferred tech for new spending |
|
voters = msg.ReadByte(); |
|
|
|
preferred = ( voters & 0x80 ) ? true : false; |
|
voters &= 0x7f; |
|
|
|
resourcelevel = (float)msg.ReadShort(); |
|
|
|
// Look it up by index |
|
CBaseTechnology *item = m_pTree->GetTechnology( index ); |
|
if ( item ) |
|
{ |
|
bool wasactive = item->GetActive(); |
|
|
|
bool justactivated = !wasactive && available; |
|
|
|
// Set data elements |
|
item->SetActive( available ? true : false ); |
|
item->SetVoters( voters ); |
|
item->SetResourceLevel( resourcelevel ); |
|
|
|
// If this is the tech I am voting for, clear my vote |
|
if ( preferred ) |
|
{ |
|
// Sets the flag on the item, too |
|
m_pTree->SetPreferredTechnology( item ); |
|
} |
|
else |
|
{ |
|
// Force deselection in case there is no active preference on the server any more |
|
item->SetPreferred( false ); |
|
} |
|
|
|
if ( justactivated && item->GetLevel() > 0 && !item->GetHintsGiven( TF_HINT_NEWTECHNOLOGY ) ) |
|
{ |
|
// So we only give this hint once this game, even if we respawn, etc. |
|
item->SetHintsGiven( TF_HINT_NEWTECHNOLOGY, true ); |
|
// Note, only show a max of three or 4 newtechnology hints at a time |
|
CreateGlobalHint( TF_HINT_NEWTECHNOLOGY, item->GetPrintName(), index, 3 ); |
|
} |
|
} |
|
|
|
return 1; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Add a file of technologies to the technology tree |
|
//----------------------------------------------------------------------------- |
|
void CTechnologyTreeDoc::AddTechnologyFile( char *sFilename ) |
|
{ |
|
// Add the technologies to the tech list |
|
if ( m_pTree ) |
|
{ |
|
// FIXME: If we reactivate this, we'll need to revisit team number here... |
|
m_pTree->AddTechnologyFile( ::filesystem, 0, sFilename ); |
|
} |
|
}
|
|
|