Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.
 
 
 
 
 
 

286 lines
9.4 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
// tf_populator.h
// KeyValues driven procedural population system
// Michael Booth, April 2011
#ifndef TF_POPULATOR_H
#define TF_POPULATOR_H
#include "bot/tf_bot.h"
#include "tf_mann_vs_machine_stats.h"
#include "tf_populator_spawners.h"
#include "tf_populators.h"
class CMannVsMachineStats;
class KeyValues;
class IPopulator;
class CPopulationManager;
class CWave;
#define MVM_POP_FILE_PATH "scripts/population"
//-----------------------------------------------------------------------
class CPopulationManager : public CPointEntity, public CGameEventListener
{
public:
DECLARE_CLASS( CPopulationManager, CPointEntity );
DECLARE_DATADESC();
CPopulationManager( void );
virtual ~CPopulationManager();
// CPointEntity
virtual void Spawn( void ); // entity spawn
// CGameEventListener
virtual void FireGameEvent( IGameEvent *gameEvent );
virtual void Reset( void );
virtual bool Initialize( void );
virtual void Precache( void );
const char *GetPopulationFilename( void );
const char *GetPopulationFilenameShort( void );
void SetPopulationFilename( const char *populationFile );
// Resolve a pop file shortname to a full name
bool FindPopulationFileByShortName( const char *pShortName, CUtlString &outFullName );
// Enumerate possible population files for this map, searching e.g. mapname_*.pop, //BSP/.../*.pop
// This is separate from the explicit popfile lists for tours.
static void FindDefaultPopulationFileShortNames( CUtlVector< CUtlString > &outVecShortNames );
void SetupOnRoundStart( void );
void Update( void ); // continuously invoked to modify population over time
// Triggered by GameRules for any mode specific logic that isn't suitable for the entity think (e.g. not simulating)
void GameRulesThink();
void UpdateObjectiveResource( void );
void ResetMap( void );
void CycleMission ( void );
bool LoadMissionCycleFile ( void );
bool IsValidMvMMap( const char *pszMapName );
// Waves
void ShowNextWaveDescription( void );
void StartCurrentWave( void );
void JumpToWave( uint32 waveNumber, float fCleanMoneyPercent = -1.0f );
void WaveEnd ( bool bSuccess );
CWave *GetCurrentWave( void );
int GetWaveNumber( void ) { return m_iCurrentWaveIndex; }
int GetTotalWaveCount( void ) { return m_waveVector.Count(); }
// Check Points
void ClearCheckpoint( void );
void SetCheckpoint( int waveNumber );
void RestoreCheckpoint( void );
void RestoreItemToCheckpointState( CTFPlayer *player, CEconItemView *item );
void ForgetOtherBottleUpgrades ( CTFPlayer *player, CEconItemView *pItem, int upgradeToKeep );
void RestorePlayerCurrency ();
CUtlVector< CUpgradeInfo > *GetPlayerUpgradeHistory ( CTFPlayer *player ); // Returns the Upgrade vector for a given player
int GetPlayerCurrencySpent ( CTFPlayer *player );
void AddPlayerCurrencySpent ( CTFPlayer *player, int cost );
void SendUpgradesToPlayer ( CTFPlayer *player );
void OnPlayerKilled( CTFPlayer *corpse );
void OnCurrencyPackFade( void );
void OnCurrencyCollected( int nAmount, bool bCountAsDropped, bool bIsBonus );
int GetTotalPopFileCurrency( void );
void AdjustMinPlayerSpawnTime( void );
void MarkAllCurrentPlayersSafeToLeave();
void MvMVictory( void );
void PlayerDoneViewingLoot( const CTFPlayer* pPlayer );
void GetSentryBusterDamageAndKillThreshold( int &nDamage, int &nKills ) const;
bool IsInEndlessWaves ( void );
// Endless
float GetHealthMultiplier ( bool bIsTank = false );
float GetDamageMultiplier ( void );
void EndlessParseBotUpgrades( void );
void EndlessRollEscalation ( void );
void EndlessSetAttributesForBot( CTFBot *pBot );
bool EndlessShouldResetFlag ();
void EndlessFlagHasReset ();
// inlined
bool IsRestoringCheckpoint( void ) const; // return true if we are in the process of restoring players to their checkpointed state
float GetElapsedTime( void ) const; // return elapsed time since scenario started
int GetStartingCurrency( void ) const;
int GetRespawnWaveTime( void ) const;
bool CanBotsAttackWhileInSpawnRoom( void ) const;
KeyValues *GetTemplate( const char *pszName ) const;
bool IsAdvancedPopFile( void ) { return m_bAdvancedPopFile; }
void SetMapRestartTime( float flTime ) { m_flMapRestartTime = flTime; }
bool IsPopFileEventType( int fileType ) { return m_nMvMEventPopfileType == fileType; }
void DebugWaveStats();
void AllocateBots();
void PauseSpawning();
void UnpauseSpawning();
bool IsSpawningPaused() const { return m_bSpawningPaused; }
bool IsBonusRound() const { return m_bBonusRound; }
CBaseCombatCharacter* GetBonusBoss() const { return m_hBonusBoss; }
enum { MVM_INVADERS_TEAM_SIZE = 22 };
static bool GetWavesUseReadyBetween() { return true; }
void SetDefaultEventChangeAttributesName( const char* pszDefaultEventChangeAttributesName ) { m_defaultEventChangeAttributesName = pszDefaultEventChangeAttributesName; }
const char* GetDefaultEventChangeAttributesName() const { return m_defaultEventChangeAttributesName.String(); }
bool HasEventChangeAttributes( const char* pszEventName ) const;
static int CollectMvMBots ( CUtlVector< CTFPlayer *> *pBots );
// Respec
void RemovePlayerAndItemUpgradesFromHistory( CTFPlayer *pPlayer );
void AddRespecToPlayer( CTFPlayer *pPlayer );
void RemoveRespecFromPlayer( CTFPlayer *pPlayer );
void SetNumRespecsForPlayer( CTFPlayer *pPlayer, int nCount );
int GetNumRespecsAvailableForPlayer( CTFPlayer *pPlayer );
int GetNumRespecsEarnedInWave( void ) { return m_nRespecsAwardedInWave; }
int GetNumRespecsEarned( void ) { return m_nRespecsAwarded; }
void ResetRespecPoints( void );
// Buyback
void SetBuybackCreditsForPlayer( CTFPlayer *pPlayer, int nCount );
void RemoveBuybackCreditFromPlayer( CTFPlayer *pPlayer );
int GetNumBuybackCreditsForPlayer( CTFPlayer *pPlayer );
bool IsPlayerBeingTrackedForBuybacks( CTFPlayer *pPlayer );
private:
struct CheckpointSnapshotInfo
{
CSteamID m_steamId; // which player this snapshot is for
int m_currencySpent; // how much money they had spent up to this check point
CUtlVector< CUpgradeInfo > m_upgradeVector; // the upgrades the player had as this checkpoint
};
struct PlayerUpgradeHistory
{
CSteamID m_steamId; // which player this snapshot is for
CUtlVector< CUpgradeInfo > m_upgradeVector;
int m_currencySpent;
};
void PostInitialize( void );
bool Parse( void ); // read in population from file from m_filename
CheckpointSnapshotInfo *FindCheckpointSnapshot( CTFPlayer *player ) const;
CheckpointSnapshotInfo *FindCheckpointSnapshot( CSteamID id ) const;
PlayerUpgradeHistory *FindOrAddPlayerUpgradeHistory ( CTFPlayer *player );
PlayerUpgradeHistory *FindOrAddPlayerUpgradeHistory ( CSteamID steamId );
void LoadLastKnownMission();
bool LoadMvMMission( KeyValues *pNextMission );
CUtlVector< IPopulator * > m_populatorVector;
char m_popfileFull[ MAX_PATH ];
char m_popfileShort[ MAX_PATH ];
KeyValues *m_pTemplates;
bool m_bIsInitialized;
bool m_bAllocatedBots;
bool m_bBonusRound;
CHandle< CBaseCombatCharacter > m_hBonusBoss;
int m_nStartingCurrency;
int m_nLobbyBonusCurrency;
int m_nMvMEventPopfileType;
int m_nRespawnWaveTime;
bool m_bFixedRespawnWaveTime;
bool m_canBotsAttackWhileInSpawnRoom;
int m_sentryBusterDamageDealtThreshold;
int m_sentryBusterKillThreshold;
uint32 m_iCurrentWaveIndex;
CUtlVector< CWave * > m_waveVector; // pointers to waves within m_populationVector
float m_flMapRestartTime; // Restart the Map if gameover and this time elapses
CUtlVector< PlayerUpgradeHistory * > m_playerUpgrades; // list of all players and their upgrades who have played on this MVM rotation
bool m_isRestoringCheckpoint;
// checkpoint data must be static because the population manager entity is destroyed and recreated each round
static CUtlVector< CheckpointSnapshotInfo * > m_checkpointSnapshot; // snapshot of player state at the saved checkpoint
static int m_checkpointWaveIndex; // wave to restart at if scenario lost
static int m_nNumConsecutiveWipes;
bool m_bAdvancedPopFile;
bool m_bCheckForCurrencyAchievement;
CMannVsMachineStats *m_pMVMStats;
KeyValues *m_pKvpMvMMapCycle;
bool m_bSpawningPaused;
bool m_bIsWaveJumping;
bool m_bEndlessOn;
CUtlVector< CMvMBotUpgrade > m_BotUpgradesList;
CUtlVector< CMvMBotUpgrade > m_EndlessActiveBotUpgrades;
CUniformRandomStream m_randomizer;
CUtlVector< int > m_EndlessSeeds;
bool m_bShouldResetFlag;
CUtlVector< const CTFPlayer* > m_donePlayers;
CUtlString m_defaultEventChangeAttributesName;
// Respec
CUtlMap< uint64, int > m_PlayerRespecPoints; // The number of upgrade respecs players (steamID) have
int m_nRespecsAwarded;
int m_nRespecsAwardedInWave;
int m_nCurrencyCollectedForRespec;
// Buyback
CUtlMap< uint64, int > m_PlayerBuybackPoints; // The number of times a player can buyback
};
inline bool CPopulationManager::IsRestoringCheckpoint( void ) const
{
return m_isRestoringCheckpoint;
}
inline int CPopulationManager::GetStartingCurrency( void ) const
{
return m_nStartingCurrency + m_nLobbyBonusCurrency;
}
inline int CPopulationManager::GetRespawnWaveTime( void ) const
{
return m_nRespawnWaveTime;
}
inline bool CPopulationManager::CanBotsAttackWhileInSpawnRoom( void ) const
{
return m_canBotsAttackWhileInSpawnRoom;
}
inline KeyValues *CPopulationManager::GetTemplate( const char *pszName ) const
{
return m_pTemplates->FindKey( pszName );
}
// singleton accessor
extern CPopulationManager *g_pPopulationManager;
#endif // TF_POPULATOR_H