waypoint.h

//
// HPB_bot - botman's High Ping Bastard bot
//
// (http://planethalflife.com/botman/)
//
// waypoint.h
//
ifndef WAYPOINT_H
define WAYPOINT_H
include
define MAX_WAYPOINTS 1024
define REACHABLE_RANGE 400.0
// defines for waypoint flags field (32 bits are available)
define W_FL_TEAM ((1<<0) + (1<<1)) /* allow for 4 teams (0-3) */
define W_FL_TEAM_SPECIFIC (1<<2) /* waypoint only for specified team */
define W_FL_CROUCH (1<<3) /* must crouch to reach this waypoint */
define W_FL_LADDER (1<<4) /* waypoint on a ladder */
define W_FL_LIFT (1<<5) /* wait for lift to be down before approaching this waypoint */
define W_FL_DOOR (1<<6) /* wait for door to open */
define W_FL_HEALTH (1<<7) /* health kit (or wall mounted) location */
define W_FL_ARMOR (1<<8) /* armor (or HEV) location */
define W_FL_AMMO (1<<9) /* ammo location */
define W_FL_SNIPER (1<<10) /* sniper waypoint (a good sniper spot) */
define W_FL_TFC_FLAG (1<<11) /* flag position (or hostage or president) */
define W_FL_FLF_CAP (1<<11) /* Front Line Force capture point */
define W_FL_TFC_FLAG_GOAL (1<<12) /* flag return position (or rescue zone) */
define W_FL_FLF_DEFEND (1<<12) /* Front Line Force defend point */
define W_FL_PRONE (1<<13) /* go prone (laying down) */
define W_FL_AIMING (1<<14) /* aiming waypoint */
define W_FL_DELETED (1<<31) /* used by waypoint allocation code */
define WAYPOINT_VERSION 4
// define the waypoint file header structure…
typedef struct {
char filetype[8]; // should be "HPB_bot\0"
int waypoint_file_version;
int waypoint_file_flags; // not currently used
int number_of_waypoints;
char mapname[32]; // name of map for these waypoints
} WAYPOINT_HDR;
// define the structure for waypoints…
typedef struct {
int flags; // button, lift, flag, health, ammo, etc.
Vector origin; // location
} WAYPOINT;
define WAYPOINT_UNREACHABLE USHRT_MAX
define WAYPOINT_MAX_DISTANCE (USHRT_MAX-1)
define MAX_PATH_INDEX 4
// define the structure for waypoint paths (paths are connections between
// two waypoint nodes that indicates the bot can get from point A to point B.
// note that paths DON'T have to be two-way. sometimes they are just one-way
// connections between two points. There is an array called "paths" that
// contains head pointers to these structures for each waypoint index.
typedef struct path {
short int index[MAX_PATH_INDEX]; // indexes of waypoints (index -1 means not used)
struct path *next; // link to next structure
} PATH;
// waypoint function prototypes…
void WaypointInit(void);
int WaypointFindPath(PATH **pPath, int *path_index, int waypoint_index, int team);
int WaypointFindNearest(edict_t *pEntity, float distance, int team);
int WaypointFindNearest(Vector v_src, edict_t *pEntity, float range, int team);
int WaypointFindNearestGoal(edict_t *pEntity, int src, int team, int flags);
int WaypointFindNearestGoal(Vector v_src, edict_t *pEntity, float range, int team, int flags);
int WaypointFindRandomGoal(edict_t *pEntity, int team, int flags);
int WaypointFindRandomGoal(Vector v_src, edict_t *pEntity, float range, int team, int flags);
int WaypointFindNearestAiming(Vector v_origin);
void WaypointAdd(edict_t *pEntity);
void WaypointAddAiming(edict_t *pEntity);
void WaypointDelete(edict_t *pEntity);
void WaypointCreatePath(edict_t *pEntity, int cmd);
void WaypointRemovePath(edict_t *pEntity, int cmd);
bool WaypointLoad(edict_t *pEntity);
void WaypointSave(void);
bool WaypointReachable(Vector v_srv, Vector v_dest, edict_t *pEntity);
int WaypointFindReachable(edict_t *pEntity, float range, int team);
void WaypointPrintInfo(edict_t *pEntity);
void WaypointThink(edict_t *pEntity);
void WaypointFloyds(short *shortest_path, short *from_to);
void WaypointRouteInit(void);
unsigned short WaypointRouteFromTo(int src, int dest, int team);
int WaypointDistanceFromTo(int src, int dest, int team);
endif // WAYPOINT_H