home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2007 September / maximum-cd-2007-09.iso / Assets / data / AssaultCube_v0.93.exe / source / src / bot / bot_waypoint.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-11-15  |  6.3 KB  |  192 lines

  1. //
  2. // C++ Implementation: bot_waypoint.h
  3. //
  4. // Description: Containts all defintions for bot waypoint code
  5. //
  6. //
  7. // Author: Rick Helmus <rickhelmus@gmail.com>
  8. //
  9.  
  10. // Enable this for flood support
  11. #define WP_FLOOD
  12.  
  13. #ifndef BOT_WAYPOINT_H
  14. #define BOT_WAYPOINT_H
  15.  
  16. #define WAYPOINT_VERSION 2
  17. #define EXP_WP_VERSION 1
  18. #define REACHABLE_RANGE 15.0f
  19. #define MAX_MAP_GRIDS    64
  20. #define SECTOR_SIZE      18
  21.  
  22. #define W_FL_TELEPORT         (1<<1) // used if waypoint is at a teleporter
  23. #define W_FL_TELEPORTDEST     (1<<2) // used if waypoint is at a teleporter destination
  24. #define W_FL_FLOOD            (1<<3) // used if this waypoint is made by flooding the map
  25. #define W_FL_JUMP             (1<<4) // if set, bot jumps when reached this waypoint
  26. #define W_FL_TRIGGER          (1<<5) // used if this waypoint is at a trigger
  27. #define W_FL_INTAG            (1<<6) // used if this waypoint is in a tagged cube
  28.  
  29. #define MAX_FLOODWPCONNECTDIST     2
  30. #define MAX_FLOODWPDIST            4.0f
  31.  
  32. struct waypoint_header_s
  33. {
  34.     char szFileType[10];
  35.     int iFileVersion;
  36.     int iFileFlags;  // not currently used
  37.     int iWPCount;
  38.     char szMapName[32];  // name of map for these waypoints
  39. };
  40.  
  41. // Old waypoint structure, used for waypoint version 1
  42. struct waypoint_version_1_s
  43. {
  44.      int iFlags;
  45.      vec v_origin;
  46.      TLinkedList<waypoint_version_1_s *> ConnectedWPs;
  47.      
  48.      // A* stuff
  49.      float f, g;
  50.      waypoint_version_1_s *pParent;
  51.      
  52.      // Construction
  53.      waypoint_version_1_s(void) : iFlags(0), f(0.0f), g(0.0f), pParent(NULL) { };     
  54. };
  55.  
  56. struct node_s
  57. {
  58.      vec v_origin;     
  59.      int iFlags;
  60.      short sTriggerNr;
  61.      short sYaw;
  62.      short sCost; // Base and static cost
  63.      TLinkedList<node_s *> ConnectedWPs;
  64.      TLinkedList<node_s *> ConnectedWPsWithMe;
  65.      
  66.      TLinkedList<node_s *> FailedGoalList;
  67.           
  68.      // Construction
  69.      node_s(void) : iFlags(0), sTriggerNr(0), sYaw(-1), sCost(10) { };
  70.      node_s(const vec &o, const int &f, const short t=0, const short y=-1) : v_origin(o),
  71.                                                                              iFlags(f),
  72.                                                                              sTriggerNr(t),
  73.                                                                              sYaw(y),
  74.                                                                              sCost(0) { };
  75. };
  76.  
  77. struct waypoint_s
  78. {
  79.      node_s *pNode;
  80.      short g[2];
  81.      waypoint_s *pParent[2];
  82.      bool bIsOpen[2], bIsClosed[2];
  83.      
  84.      // Construction
  85.      waypoint_s(void) : pNode(NULL) { bIsOpen[0] = bIsOpen[1] = bIsClosed[0] =
  86.                                       bIsClosed[1] = false; pParent[0] =  pParent[1] = NULL;
  87.                                       g[0] = g[1] = 0; };     
  88. };
  89.  
  90. class CWaypointClass
  91. {
  92. protected:
  93.      bool m_bDrawWaypoints;
  94.      bool m_bDrawWPPaths;
  95.      bool m_bAutoWaypoint;
  96.      bool m_bAutoPlacePaths;
  97.      bool m_bDrawWPText;
  98.      vec m_vLastCreatedWP;
  99.      float m_fPathDrawTime;
  100.      char m_szMapName[32];
  101.      
  102. #ifdef WP_FLOOD
  103.      bool m_bFlooding; // True if flooding map with waypoints
  104.      bool m_bFilteringNodes;
  105.      int m_iFloodStartTime;
  106.      int m_iCurFloodX, m_iCurFloodY;
  107.      int m_iFloodSize;
  108.      int m_iFilteredNodes;
  109. #endif        
  110.      friend class CBot;
  111.      
  112. public:
  113.      TLinkedList<node_s *> m_Waypoints[MAX_MAP_GRIDS][MAX_MAP_GRIDS];
  114.      int m_iWaypointCount; // number of waypoints currently in use
  115.  
  116.      CWaypointClass(void);
  117.      virtual ~CWaypointClass(void) { Clear(); };
  118.  
  119.      void Think(void);
  120.      void Init(void);
  121.      void Clear(void);
  122.      bool LoadWaypoints(void);
  123.      void SaveWaypoints(void);
  124.      bool LoadWPExpFile(void);
  125.      void SaveWPExpFile(void);
  126.      void SetMapName(char *map) { strcpy(m_szMapName, map); };
  127.  
  128.      void SetWaypointsVisible(bool Visible) { m_bDrawWaypoints = Visible; };
  129.      void SetPathsVisible(bool Visible) { m_bDrawWPPaths = Visible; };
  130.      void SetAutoWaypoint(bool On) { m_bAutoWaypoint = On; };
  131.      void SetWPInfo(bool on) { m_bDrawWPText = on; };
  132.      void SetWPFlags(node_s *wp, int iFlags) { wp->iFlags |= iFlags; };
  133.      void UnsetWPFlags(node_s *wp, int iFlags) { wp->iFlags &= ~iFlags; };
  134.      void SetWPTriggerNr(node_s *wp, short sTriggerNr) { wp->sTriggerNr = sTriggerNr; };
  135.      void SetWPYaw(node_s *wp, short sYaw) { wp->sYaw = sYaw; };
  136.      bool WaypointsAreVisible(void) { return m_bDrawWaypoints; };
  137.      node_s *AddWaypoint(vec o, bool connectwp);
  138.      void DeleteWaypoint(vec v_src);
  139.      void AddPath(node_s *pWP1, node_s *pWP2);
  140.      void DeletePath(node_s *pWP);
  141.      void DeletePath(node_s *pWP1, node_s *pWP2);
  142.      void ManuallyCreatePath(vec v_src, int iCmd, bool TwoWay);
  143.      void ManuallyDeletePath(vec v_src, int iCmd, bool TwoWay);
  144.  
  145.      bool WPIsReachable(vec from, vec to);
  146.      //node_s *GetNearestWaypoint(vec v_src, float flRange, bool CheckVisible = true, bool SkipFloodWPs = true);
  147.      node_s *GetNearestWaypoint(vec v_src, float flRange);
  148.      node_s *GetNearestWaypoint(dynent *d, float flRange) { return GetNearestWaypoint(d->o, flRange); };
  149.      node_s *GetNearestTriggerWaypoint(vec v_src, float flRange);
  150.      node_s *GetWaypointFromVec(const vec &v_src);
  151.      void DrawNearWaypoints();
  152.      void GetNodeIndexes(const vec &v_origin, short *i, short *j);
  153.      void CalcCost(node_s *pNode);
  154.      void ReCalcCosts(void);
  155.  
  156.      
  157. #ifdef WP_FLOOD
  158.      // Flood functions
  159.      virtual void StartFlood(void);
  160.      void StopFlood(void);
  161.      void FloodThink(void);
  162.      bool CanPlaceNodeHere(const vec &from);
  163.      void ConnectFloodWP(node_s *pWP);
  164.      node_s *GetNearestFloodWP(vec v_origin, float flRange, node_s *pIgnore, bool SkipTags=false);
  165.      node_s *GetNearestFloodWP(dynent *d, float flRange) { return GetNearestFloodWP(d->o, flRange, NULL); };
  166.      node_s *GetNearestTriggerFloodWP(vec v_origin, float flRange);
  167. #endif
  168. };
  169.  
  170. class CACWaypointClass: public CWaypointClass
  171. {
  172. public:
  173. #ifdef WP_FLOOD
  174.      // Flood functions
  175.      virtual void StartFlood(void);
  176. #endif
  177. };
  178.  
  179. class CCubeWaypointClass: public CWaypointClass
  180. {
  181. public:
  182.      void CreateWPsAtTeleporters(void);
  183.      void CreateWPsAtTriggers(void);
  184.  
  185. #ifdef WP_FLOOD
  186.      // Flood functions
  187.      virtual void StartFlood(void);
  188. #endif
  189. };
  190.  
  191. #endif // BOT_WAYPOINT_H
  192.