diff options
Diffstat (limited to 'game/client/tf2/hud_technologytreedoc.cpp')
| -rw-r--r-- | game/client/tf2/hud_technologytreedoc.cpp | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/game/client/tf2/hud_technologytreedoc.cpp b/game/client/tf2/hud_technologytreedoc.cpp new file mode 100644 index 0000000..5ec1859 --- /dev/null +++ b/game/client/tf2/hud_technologytreedoc.cpp @@ -0,0 +1,175 @@ +//========= 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 ); + } +} |