//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #if !defined( TECHTREE_H ) #define TECHTREE_H #ifdef _WIN32 #pragma once #endif // Evil, Game DLL only code #ifndef CLIENT_DLL class CBaseTFPlayer; class CTFTeam; class CInfoCustomTechnology; #endif class IFileSystem; //=========================================================================================== // Technology tree defines #define MAX_TF_TECHLEVELS 6 // Number of TF2 tech levels #define TECHLEVEL_PERCENTAGE_NEEDED 0.5 // Percentage of a tech level that must be owned before the next tech level becomes available #define MAX_TECHNOLOGIES 128 // Max number of resource types #define MAX_ASSOCIATED_WEAPONS 2 // Max number of weapons that a tech can be associated with // Indexes into resource arrays #define NORMAL_RESOURCES 0 #define PROCESSED_RESOURCES 1 #define RESOURCE_TYPES 2 // Tech #define TECHNOLOGY_NAME_LENGTH 64 // Max length of a tech name #define TECHNOLOGY_PRINTNAME_LENGTH 128 // Max length of a tech's print name #define TECHNOLOGY_DESC_LENGTH 256 // Max length of a tech's description #define MAX_CONTAINED_TECHNOLOGIES 16 // Max number of technologies that can be contained within another technology #define MAX_DEPENDANT_TECHNOLOGIES 16 // Max number of technologies that a tech can depend on #define TECHNOLOGY_SOUNDFILENAME_LENGTH 256 #define TECHNOLOGY_TEXTURENAME_LENGTH 128 #define TECHNOLOGY_BUTTONNAME_LENGTH 64 #define TECHNOLOGY_WEAPONNAME_LENGTH 128 // Color codes for Resources struct rescolor { int r; int g; int b; }; // Class result structure for technologies struct classresult_t { bool bClassTouched; // This technology directly affects this class char pszSoundFile[TECHNOLOGY_SOUNDFILENAME_LENGTH]; // Filename of the sound int iSound; // Sound played to members of this class when this technology is achieved char pszDescription[TECHNOLOGY_DESC_LENGTH]; // Description for this technology shown only to this class // If true, then we should determine what weapons should be given to the player // of this class when this technology is received by looking at the "associated_weapons" // data bool m_bAssociateWeaponsForClass; }; extern char sResourceName[32]; extern rescolor sResourceColor; #include "utlvector.h" #include "tf_shareddefs.h" //=========================================================================================== //----------------------------------------------------------------------------- // Purpose: A Technology //----------------------------------------------------------------------------- class CBaseTechnology { public: // Constructions CBaseTechnology( void ); virtual ~CBaseTechnology( void ); // Data read from the data file virtual void SetName( const char *pName ); virtual void SetPrintName( const char *pName ); virtual void SetDescription( const char *pDesc ); virtual void SetButtonName( const char *pName ); virtual void SetLevel( int iLevel ); virtual void SetCost( float fResourceCost ); virtual void SetClassResultSound( int iClass, const char *pSound ); virtual void SetClassResultSound( int iClass, int iSound ); virtual void SetClassResultDescription( int iClass, const char *pDesc ); virtual void SetClassResultAssociateWeapons( int iClass, bool associate ); virtual void AddContainedTechnology( const char *pszTech ); virtual void AddDependentTechnology( const char *pszTech ); // Returns true if the specified class is affected by this technology, or any contained techs virtual bool AffectsClass( int iClass ); virtual bool IsClassUpgrade( void ); virtual bool IsVehicle( void ); virtual bool IsTechLevelUpgrade( void ); virtual bool IsResourceTech( void ); virtual void SetHidden( bool hide ); virtual bool IsHidden( void ); // Used by client to avoid giving you the same hint twice for a technology // during a game/session virtual void ResetHintsGiven( void ); virtual bool GetHintsGiven( int type ); virtual void SetHintsGiven( int type, bool given ); // Returns the level to which this technology belongs virtual int GetLevel( void ); // Returns the internal name of the technology ( no spaces ) virtual const char *GetName( void ); // Returns the printable name of the technology virtual const char *GetPrintName( void ); // Returns the button name of the technology; virtual const char *GetButtonName( void ); // Returns the non-class specific description of this technology virtual const char *GetDescription( int iPlayerClass ); // Returns the sound to play for this technology virtual const char *GetSoundFile( int iClass ); virtual int GetSound( int iClass ); // Set availability of the technology for the specified team virtual void SetAvailable( bool state ); // Returns true if the team has the technology virtual int GetAvailable( void ); // Zero out all preference/voting by players virtual void ZeroPreferences( void ); // Add one to the preference count for this technology for the specified team virtual void IncrementPreferences( void ); // Retrieve the number of player's who want to vote for this technology virtual int GetPreferenceCount( void ); // Retrieves the cost of purchasing the technology (doesn't factor in the resource levels) float GetResourceCost( void ); // Retrieves the current amount of resources spent on the technology float GetResourceLevel( void ); // Sets a resource level to an amount void SetResourceLevel( float flResourceLevel ); // Spends resources on buying this technology bool IncreaseResourceLevel( float flResourcesToSpend ); // Figure out my overall owned percentage void RecalculateOverallLevel( void ); float GetOverallLevel( void ); void ForceComplete( void ); // Goal technologies ( Techs related to a team's goal in a map ) bool IsAGoalTechnology( void ); void SetGoalTechnology( bool bGoal ); // Check if class wants to enumerate weapon associations bool GetAssociateWeaponsForClass( int iClass ); // Weapon associatations int GetNumWeaponAssociations( void ); char const *GetAssociatedWeapon( int index ); void AddAssociatedWeapon( const char *weaponname ); // Contained Technology access int GetNumberContainedTechs( void ); const char *GetContainedTechName( int iTech ); void SetContainedTech( int iTech, CBaseTechnology *pTech ); // Dependent Technology access int GetNumberDependentTechs( void ); const char *GetDependentTechName( int iTech ); void SetDependentTech( int iTech, CBaseTechnology *pTech ); bool DependsOn( CBaseTechnology *pTech ); bool HasInactiveDependencies( void ); // Dirty bit, used for fast knowledge of when to resend techs bool IsDirty( void ); void SetDirty( bool bDirty ); // Evil, Game DLL only code #ifndef CLIENT_DLL // The technology has been acquired by the team. virtual void AddTechnologyToTeam( CTFTeam *pTeam ); // The technology has just been acquired, for each player on the acquiring team // ask the technology to add any necessary weapons/items/abilities/modifiers, etc. virtual void AddTechnologyToPlayer( CBaseTFPlayer *player ); // A technology watcher entity wants to register as a watcher for this technology virtual void RegisterWatcher( CInfoCustomTechnology *pWatcher ); CUtlVector< CInfoCustomTechnology* > m_aWatchers; #endif void UpdateWatchers( void ); // Hud Data void SetActive( bool state ); bool GetActive( void ); void SetPreferred( bool state ); bool GetPreferred( void ); void SetVoters( int voters ); int GetVoters( void ); void SetTextureName( const char *texture ); const char *GetTextureName( void ); void SetTextureId( int id ); int GetTextureId( void ); private: // Name of the technology. Used to identify it in code. char m_pszName[ TECHNOLOGY_NAME_LENGTH ]; // Print name of the technology. Used to print the name of this technology to users. char m_pszPrintName[ TECHNOLOGY_PRINTNAME_LENGTH ]; // Button name of technology in the tech tree char m_szButtonName[ TECHNOLOGY_BUTTONNAME_LENGTH ]; // Description of the technology char m_pszDescription[ TECHNOLOGY_DESC_LENGTH ]; // Level to which the technology belongs int m_nTechLevel; // Sound played to the entire team when this technology is received char m_pszTeamSoundFile[ TECHNOLOGY_SOUNDFILENAME_LENGTH ]; int m_iTeamSound; // Results for this technology when it's achieved, on a per-class basis classresult_t m_ClassResults[ TFCLASS_CLASS_COUNT ]; // Resource costs float m_fResourceCost; // Resource levels (amount of resource spent on the technology so far) float m_fResourceLevel; float m_flOverallOwnedPercentage; // Technologies contained within this one char m_apszContainedTechs[ MAX_CONTAINED_TECHNOLOGIES ][ TECHNOLOGY_NAME_LENGTH ]; int m_iContainedTechs; CBaseTechnology *m_pContainedTechs[ MAX_CONTAINED_TECHNOLOGIES ]; // Technologies this tech depends on char m_apszDependentTechs[ MAX_DEPENDANT_TECHNOLOGIES ][ TECHNOLOGY_NAME_LENGTH ]; int m_iDependentTechs; CBaseTechnology *m_pDependentTechs[ MAX_DEPENDANT_TECHNOLOGIES ]; // Weapon association int m_nNumWeaponAssociations; char m_rgszWeaponAssociation[ MAX_ASSOCIATED_WEAPONS ][ TECHNOLOGY_WEAPONNAME_LENGTH ]; // Does the team have access to the technology bool m_bAvailable; // Is this a "placeholder" tech that shouldn't show up in the real tree bool m_bHidden; CUtlVector< int > m_HintsGiven; // Count of how many team members voted for this technology for spending resources int m_nPreferenceCount; bool m_bGoalTechnology; // True if this tech's related to a team's goal in the current map bool m_bClassUpgrade; // True if the tech unlocks a new class bool m_bVehicle; // True if the tech unlocks a vehicle bool m_bTechLevelUpgrade; // True if the tech unlocks a new tech level bool m_bResourceTech; // True if related to resource gathering // Dirty bit, used for fast knowledge of when to resend techs bool m_bDirty; // Hud data bool m_bActive; bool m_bPreferred; int m_nVoters; int m_nTextureID; char m_szTextureName[ TECHNOLOGY_TEXTURENAME_LENGTH ]; }; //----------------------------------------------------------------------------- // Purpose: The Technology Tree. //----------------------------------------------------------------------------- class CTechnologyTree { public: // Construction CTechnologyTree( IFileSystem* pFileSystem, int nTeamNumber ); virtual ~CTechnologyTree( void ); // Startup/shutdown void Shutdown( void ); // Accessors void AddTechnologyFile( IFileSystem* pFileSystem, int nTeamNumber, char *sFileName ); void LinkContainedTechnologies( void ); void LinkDependentTechnologies( void ); int GetIndex( CBaseTechnology *pItem ); // Get the index of the specified item CBaseTechnology *GetTechnology( int index ); CBaseTechnology *GetTechnology( const char *pName ); float GetPercentageOfTechLevelOwned( int iTechLevel ); // Size of list int GetNumberTechnologies( void ); // Local client's preferred item void SetPreferredTechnology( CBaseTechnology *pItem ); CBaseTechnology *GetPreferredTechnology( void ); // Preference handling void ClearPreferenceCount( void ); void IncrementPreferences( void ); int GetPreferenceCount( void ); // Get the number of players who've voted on techs CBaseTechnology *GetDesiredTechnology( int iDesireLevel ); // Growable list of technologies CUtlVector< CBaseTechnology * > m_Technologies; int m_nPreferenceCount; }; #endif // TECHTREE_H