summaryrefslogtreecommitdiff
path: root/game/server/tf/player_vs_environment/tf_populator_spawners.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/tf/player_vs_environment/tf_populator_spawners.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/server/tf/player_vs_environment/tf_populator_spawners.h')
-rw-r--r--game/server/tf/player_vs_environment/tf_populator_spawners.h283
1 files changed, 283 insertions, 0 deletions
diff --git a/game/server/tf/player_vs_environment/tf_populator_spawners.h b/game/server/tf/player_vs_environment/tf_populator_spawners.h
new file mode 100644
index 0000000..471168a
--- /dev/null
+++ b/game/server/tf/player_vs_environment/tf_populator_spawners.h
@@ -0,0 +1,283 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: tf_populator_spawners
+// Implementations of NPC Spawning Code for PvE related game modes (MvM)
+//=============================================================================//
+#ifndef TF_POPULATOR_SPAWNERS_H
+#define TF_POPULATOR_SPAWNERS_H
+
+
+#include "bot/tf_bot.h"
+#include "tf_mann_vs_machine_stats.h"
+
+class CMannVsMachineStats;
+class KeyValues;
+class IPopulator;
+class CPopulationManager;
+class CWave;
+
+enum RelativePositionType
+{
+ UNDEFINED = 0,
+ AHEAD,
+ BEHIND,
+ ANYWHERE
+};
+
+struct EventInfo
+{
+ CFmtStr m_target;
+ CFmtStr m_action;
+};
+
+enum SpawnLocationResult
+{
+ SPAWN_LOCATION_NOT_FOUND = 0,
+ SPAWN_LOCATION_NAV,
+ SPAWN_LOCATION_TELEPORTER
+};
+
+typedef CUtlVector< CHandle< CBaseEntity > > EntityHandleVector_t;
+typedef CUtlVector< CHandle< CTFTeamSpawn > > TFTeamSpawnVector_t;
+
+//--------------------------------------------------------------------------------------------------------
+//
+// Return a random value with a distribution like so:
+// 1| /
+// | /
+// |/
+// /----
+// 0 1
+inline float SkewedRandomValue( void )
+{
+ float x = RandomFloat( 0, 1.0f );
+ float y = RandomFloat( 0, 1.0f );
+ return x < y ? y : x;
+}
+
+//-----------------------------------------------------------------------
+class CMvMBotUpgrade
+{
+public:
+ char szAttrib[ MAX_ATTRIBUTE_DESCRIPTION_LENGTH ]; // Debug
+ int iAttribIndex;
+ float flValue;
+ float flMax;
+ int nCost;
+ bool bIsBotAttr;
+ bool bIsSkillAttr; // Probably want to make these an enum or flag later
+};
+
+//-----------------------------------------------------------------------
+class CTFNavAreaIncursionLess
+{
+public:
+ bool Less( const CTFNavArea *a, const CTFNavArea *b, void *pCtx )
+ {
+ return a->GetIncursionDistance( TF_TEAM_BLUE ) < b->GetIncursionDistance( TF_TEAM_BLUE );
+ }
+};
+
+//-----------------------------------------------------------------------
+// A Spawner is responsible for actually spawning a particular
+// instance of an entity into the environment.
+// If 'result' is non-NULL, spawned entities are added to this vector.
+class IPopulationSpawner
+{
+public:
+ // We need a virtual destructor or else the derived-class destructors won't be called,
+ // leading to memory leaks. Found via clang warning.
+ virtual ~IPopulationSpawner()
+ {
+ }
+
+ IPopulationSpawner( IPopulator *populator )
+ {
+ m_populator = populator;
+ }
+
+ IPopulator *GetPopulator( void ) const
+ {
+ return m_populator;
+ }
+
+ virtual bool Parse( KeyValues *data ) = 0;
+ virtual bool Spawn( const Vector &here, EntityHandleVector_t *result = NULL ) = 0;
+ virtual bool IsWhereRequired( void ) const // does this spawner need a valid Where parameter?
+ {
+ return true;
+ }
+
+ virtual bool IsVarious( void ) { return false; }
+ virtual int GetClass( int nSpawnNum = -1 ) { return TF_CLASS_UNDEFINED; }
+ virtual string_t GetClassIcon( int nSpawnNum = -1 ) { return NULL_STRING; }
+ virtual int GetHealth( int nSpawnNum = -1 ){ return 0; }
+ virtual bool IsMiniBoss( int nSpawnNum = -1 ) { return false; }
+ virtual bool HasAttribute( CTFBot::AttributeType type, int nSpawnNum = -1 ) { return false; }
+ virtual bool HasEventChangeAttributes( const char* pszEventName ) const = 0;
+
+ static IPopulationSpawner *ParseSpawner( IPopulator *populator, KeyValues *data );
+
+protected:
+ IPopulator *m_populator;
+};
+
+
+//-----------------------------------------------------------------------
+// A RandomChoice spawner picks one of the Spawners in its
+// vector at random and invokes it to spawn entities.
+class CRandomChoiceSpawner : public IPopulationSpawner
+{
+public:
+ CRandomChoiceSpawner( IPopulator *populator );
+ virtual ~CRandomChoiceSpawner();
+
+ virtual bool Parse( KeyValues *data );
+ virtual bool Spawn( const Vector &here, CUtlVector< CHandle< CBaseEntity > > *result = NULL );
+
+ virtual bool IsVarious( void ) { return true; }
+ virtual int GetClass( int nSpawnNum = -1 );
+ virtual string_t GetClassIcon( int nSpawnNum = -1 );
+ virtual int GetHealth( int nSpawnNum = -1 );
+ virtual bool IsMiniBoss( int nSpawnNum = -1 ) OVERRIDE;
+ virtual bool HasAttribute( CTFBot::AttributeType type, int nSpawnNum = -1 );
+
+ virtual bool HasEventChangeAttributes( const char* pszEventName ) const OVERRIDE;
+
+ CUtlVector< IPopulationSpawner * > m_spawnerVector;
+ CUtlVector< int > m_nRandomPickDecision;
+
+ int m_nNumSpawned;
+};
+
+
+//-----------------------------------------------------------------------
+class CTFBotSpawner : public IPopulationSpawner
+{
+public:
+ CTFBotSpawner( IPopulator *populator );
+ virtual ~CTFBotSpawner() { }
+
+ virtual bool Parse( KeyValues *data );
+ bool ParseEventChangeAttributes( KeyValues *data );
+ virtual bool Spawn( const Vector &here, EntityHandleVector_t *result = NULL );
+
+ virtual int GetClass( int nSpawnNum = -1 );
+ virtual string_t GetClassIcon( int nSpawnNum = -1 );
+ virtual int GetHealth( int nSpawnNum = -1 );
+ virtual bool IsMiniBoss( int nSpawnNum = -1 ) OVERRIDE;
+ virtual bool HasAttribute( CTFBot::AttributeType type, int nSpawnNum = -1 );
+
+ virtual bool HasEventChangeAttributes( const char* pszEventName ) const OVERRIDE;
+
+ int m_class;
+ string_t m_iszClassIcon;
+
+ int m_health;
+ float m_scale;
+ float m_flAutoJumpMin;
+ float m_flAutoJumpMax;
+
+ CUtlString m_name;
+ CUtlStringList m_teleportWhereName;
+
+ CTFBot::EventChangeAttributes_t m_defaultAttributes;
+ CUtlVector< CTFBot::EventChangeAttributes_t > m_eventChangeAttributes;
+};
+
+//-----------------------------------------------------------------------
+class CTankSpawner : public IPopulationSpawner
+{
+public:
+ CTankSpawner( IPopulator *populator );
+
+ virtual string_t GetClassIcon( int nSpawnNum = -1 ) { return MAKE_STRING( "tank" ); }
+ virtual int GetHealth( int nSpawnNum = -1 ){ return m_health; }
+
+ virtual bool Parse( KeyValues *data );
+ virtual bool Spawn( const Vector &here, EntityHandleVector_t *result = NULL );
+
+ virtual bool IsWhereRequired( void ) const // does this spawner need a valid Where parameter?
+ {
+ // the Tank spawns at a given path node
+ return false;
+ }
+
+ virtual bool IsMiniBoss( int nSpawnNum = -1 ) OVERRIDE { return true; }
+
+ virtual bool HasEventChangeAttributes( const char* pszEventName ) const OVERRIDE { return false; }
+
+ int m_health;
+ float m_speed;
+ CUtlString m_name;
+ CUtlString m_startingPathTrackNodeName; // which path_track we start at
+ int m_skin;
+ EventInfo *m_onKilledOutput;
+ EventInfo *m_onBombDroppedOutput;
+};
+
+//-----------------------------------------------------------------------
+class CSentryGunSpawner : public IPopulationSpawner
+{
+public:
+ CSentryGunSpawner( IPopulator *populator );
+
+ virtual bool Parse( KeyValues *data );
+ virtual bool Spawn( const Vector &here, EntityHandleVector_t *result = NULL );
+
+ virtual bool HasEventChangeAttributes( const char* pszEventName ) const OVERRIDE { return false; }
+
+ int m_level;
+};
+
+
+//-----------------------------------------------------------------------
+class CSquadSpawner : public IPopulationSpawner
+{
+public:
+ CSquadSpawner( IPopulator *populator );
+ virtual ~CSquadSpawner();
+
+ virtual bool Parse( KeyValues *data );
+ virtual bool Spawn( const Vector &here, EntityHandleVector_t *result = NULL );
+
+ virtual bool IsVarious( void ) { return true; }
+ virtual int GetClass( int nSpawnNum = -1 );
+ virtual string_t GetClassIcon( int nSpawnNum = -1 );
+ virtual int GetHealth( int nSpawnNum = -1 );
+ virtual bool IsMiniBoss( int nSpawnNum = -1 ) OVERRIDE;
+ virtual bool HasAttribute( CTFBot::AttributeType type, int nSpawnNum = -1 );
+
+ virtual bool HasEventChangeAttributes( const char* pszEventName ) const OVERRIDE;
+
+ CUtlVector< IPopulationSpawner * > m_memberSpawnerVector; // all of these are invoked to instantiate the squad
+
+ float m_formationSize;
+ bool m_bShouldPreserveSquad;
+};
+
+
+//-----------------------------------------------------------------------
+class CMobSpawner : public IPopulationSpawner
+{
+public:
+ CMobSpawner( IPopulator *populator );
+ virtual ~CMobSpawner();
+
+ virtual bool Parse( KeyValues *data );
+ virtual bool Spawn( const Vector &here, EntityHandleVector_t *result = NULL );
+ virtual bool HasEventChangeAttributes( const char* pszEventName ) const OVERRIDE;
+
+ int m_count;
+ IPopulationSpawner *m_spawner;
+
+private:
+ // TODO: Rethink this, since spawners are one-shot, and mobs need to spawn over time...
+ CountdownTimer m_mobSpawnTimer;
+ CountdownTimer m_mobLifetimeTimer;
+ CTFNavArea *m_mobArea;
+ int m_mobCountRemaining;
+};
+
+
+#endif // TF_POPULATOR_SPAWNERS_H