Team Fortress 2 Source Code as on 22/4/2020
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.

121 lines
3.0 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. // tf_bot_squad.h
  3. // Small groups of TFBot, managed as a unit
  4. // Michael Booth, November 2009
  5. #ifndef TF_BOT_SQUAD_H
  6. #define TF_BOT_SQUAD_H
  7. #include "NextBot/NextBotEventResponderInterface.h"
  8. class CTFBot;
  9. class CTFBotSquad : public INextBotEventResponder
  10. {
  11. public:
  12. CTFBotSquad( void );
  13. virtual ~CTFBotSquad() { }
  14. // EventResponder ------
  15. virtual INextBotEventResponder *FirstContainedResponder( void ) const;
  16. virtual INextBotEventResponder *NextContainedResponder( INextBotEventResponder *current ) const;
  17. //----------------------
  18. bool IsMember( CTFBot *bot ) const; // is the given bot in this squad?
  19. bool IsLeader( CTFBot *bot ) const; // is the given bot the leader of this squad?
  20. // CTFBot *GetMember( int i );
  21. int GetMemberCount( void ) const;
  22. CTFBot *GetLeader( void ) const;
  23. class Iterator
  24. {
  25. public:
  26. Iterator( void )
  27. {
  28. m_bot = NULL;
  29. m_index = -1;
  30. }
  31. Iterator( CTFBot *bot, int index )
  32. {
  33. m_bot = bot;
  34. m_index = index;
  35. }
  36. CTFBot *operator() ( void )
  37. {
  38. return m_bot;
  39. }
  40. bool operator==( const Iterator &it ) const { return m_bot == it.m_bot && m_index == it.m_index; }
  41. bool operator!=( const Iterator &it ) const { return m_bot != it.m_bot || m_index != it.m_index; }
  42. CTFBot *m_bot;
  43. int m_index;
  44. };
  45. Iterator GetFirstMember( void ) const;
  46. Iterator GetNextMember( const Iterator &it ) const;
  47. Iterator InvalidIterator() const;
  48. void CollectMembers( CUtlVector< CTFBot * > *memberVector ) const;
  49. #define EXCLUDE_LEADER false
  50. float GetSlowestMemberSpeed( bool includeLeader = true ) const;
  51. float GetSlowestMemberIdealSpeed( bool includeLeader = true ) const;
  52. float GetMaxSquadFormationError( void ) const;
  53. bool ShouldSquadLeaderWaitForFormation( void ) const; // return true if the squad leader needs to wait for members to catch up, ignoring those who have broken ranks
  54. bool IsInFormation( void ) const; // return true if the squad is in formation (everyone is in or nearly in their desired positions)
  55. float GetFormationSize( void ) const;
  56. void SetFormationSize( float size );
  57. void DisbandAndDeleteSquad( void );
  58. void SetShouldPreserveSquad( bool bShouldPreserveSquad ) { m_bShouldPreserveSquad = bShouldPreserveSquad; }
  59. bool ShouldPreserveSquad() const { return m_bShouldPreserveSquad; }
  60. private:
  61. friend class CTFBot;
  62. void Join( CTFBot *bot );
  63. void Leave( CTFBot *bot );
  64. CUtlVector< CHandle< CTFBot > > m_roster;
  65. CHandle< CTFBot > m_leader;
  66. float m_formationSize;
  67. bool m_bShouldPreserveSquad;
  68. };
  69. inline bool CTFBotSquad::IsMember( CTFBot *bot ) const
  70. {
  71. return m_roster.HasElement( bot );
  72. }
  73. inline bool CTFBotSquad::IsLeader( CTFBot *bot ) const
  74. {
  75. return m_leader == bot;
  76. }
  77. inline CTFBotSquad::Iterator CTFBotSquad::InvalidIterator() const
  78. {
  79. return Iterator( NULL, -1 );
  80. }
  81. inline float CTFBotSquad::GetFormationSize( void ) const
  82. {
  83. return m_formationSize;
  84. }
  85. inline void CTFBotSquad::SetFormationSize( float size )
  86. {
  87. m_formationSize = size;
  88. }
  89. #endif // TF_BOT_SQUAD_H