115 lines
3.5 KiB
C++
115 lines
3.5 KiB
C++
// Copyright (C) 2007 Id Software, Inc.
|
|
//
|
|
|
|
#ifndef __BOTAI_NODES_H__
|
|
#define __BOTAI_NODES_H__
|
|
|
|
#define OLD_NODE_VERSION 7 // 6
|
|
#define NODE_VERSION 8 // 7
|
|
|
|
#define NODE_MAX_RANGE 4096.0f
|
|
|
|
class idBotNode {
|
|
public:
|
|
|
|
friend class idBotAI;
|
|
friend class idBotNodeGraph;
|
|
|
|
idBotNode();
|
|
virtual ~idBotNode() {}
|
|
|
|
// removes a link to a specific node (normally used when the other node is being deleted)
|
|
void RemoveLink( const idBotNode * node );
|
|
void AddLink( const idBotNode * node );
|
|
|
|
int GetNum() { return num; }
|
|
|
|
private:
|
|
|
|
struct botLink_t {
|
|
const idBotNode * node;
|
|
float cost; // basically the length
|
|
};
|
|
|
|
int num;
|
|
int flags;
|
|
bool active;
|
|
float radius;
|
|
playerTeamTypes_t team;
|
|
idVec3 origin;
|
|
idStr name;
|
|
idList< botLink_t > links;
|
|
};
|
|
|
|
enum {
|
|
NODE_ALL_TYPES = 0,
|
|
NODE_HUSKY_ONLY = 1,
|
|
NODE_GROUND = 2,
|
|
NODE_WATER = 16,
|
|
NODE_GROUND_AND_WATER = 20
|
|
};
|
|
|
|
class idBotNodeGraph {
|
|
public:
|
|
// clears the node graph
|
|
void Clear();
|
|
|
|
int Num();
|
|
|
|
// loads nodes from a file
|
|
void LoadNodes( const char * filename );
|
|
|
|
// saves nodes to a file
|
|
void SaveNodes( const char * filename );
|
|
|
|
// draws the nodes for debugging
|
|
void DrawNodes();
|
|
|
|
// adds a new node and expands the radius up to maxRadius or the closest wall edge
|
|
idBotNode * AddNode( const idVec3 & origin, float maxRadius );
|
|
|
|
// removes a node and removes all links to it
|
|
void DeleteNode( idBotNode * node );
|
|
|
|
// returns the node nearest to the origin
|
|
idBotNode * GetNearestNode( const idMat3& axis, const idVec3& origin, const playerTeamTypes_t team, const moveDirections_t moveDir = NULL_DIR, bool reachableOnly = false, bool activeOnly = false, bool closeNodeOnly = false, idBotNode* ignoreNode = NULL, int vehicleFlags = NODE_ALL_TYPES );
|
|
|
|
bool ActiveVehicleNodeNearby( const idVec3& p, float range );
|
|
|
|
// returns a list of nodes (in botPathList) to get from start to end
|
|
void CreateNodePath( const struct clientInfo_t *botInfo, const idBotNode *start, const idBotNode *end, idList<idBotNode::botLink_t> & botPathList, int vehicleFlags = NODE_ALL_TYPES ) const;
|
|
|
|
// (de)activates all nodes matching the group number
|
|
void ActivateNodes( const char * nodeName, bool activate );
|
|
|
|
void SetNodeTeam( const char * nodeName, const playerTeamTypes_t playerTeam );
|
|
|
|
// returns the nearest node for editing
|
|
static idBotNode * GetNearestEditNode();
|
|
|
|
// various commands for editing the nodes
|
|
static void Cmd_NodeAdd_f( const idCmdArgs &args );
|
|
static void Cmd_NodeDel_f( const idCmdArgs &args );
|
|
static void Cmd_NodeName_f( const idCmdArgs &args );
|
|
static void Cmd_NodeTeam_f( const idCmdArgs &args );
|
|
static void Cmd_NodeRadius_f( const idCmdArgs &args );
|
|
static void Cmd_NodeView_f( const idCmdArgs &args );
|
|
static void Cmd_SaveNodes_f( const idCmdArgs &args );
|
|
static void Cmd_NodeActive_f( const idCmdArgs &args );
|
|
static void Cmd_NodeFlags_f( const idCmdArgs &args );
|
|
static void Cmd_CreateLink_f( const idCmdArgs &args );
|
|
static void Cmd_GenerateNodes_f( const idCmdArgs &args );
|
|
static void Cmd_ClearNodes_f( const idCmdArgs &args );
|
|
static void Cmd_GenerateFromBotActions_f( const idCmdArgs &args );
|
|
|
|
private:
|
|
// returns the straight line distance from node1 to node2
|
|
float GetNodeDistance( const idBotNode * node1, const idBotNode * node2 ) const;
|
|
|
|
private:
|
|
idList< idBotNode * > nodes;
|
|
static idBotNode * lastEditNode;
|
|
};
|
|
|
|
|
|
#endif // __BOTAI_NODES_H__
|