summaryrefslogtreecommitdiff
path: root/src/fpsgame/ai.h
diff options
context:
space:
mode:
authorxolatile2025-08-04 22:53:42 +0200
committerxolatile2025-08-04 22:53:42 +0200
commitd309df4ce4d8ad0ed995a8e1c4267412a7782021 (patch)
tree999ca8d785ecc1681e5eb7538ce2e6a18d244fa5 /src/fpsgame/ai.h
parent29d613d9cb65a0faa7e3f80e75bea0b6d910cb9a (diff)
downloadxolatile-badassbug-d309df4ce4d8ad0ed995a8e1c4267412a7782021.tar.xz
xolatile-badassbug-d309df4ce4d8ad0ed995a8e1c4267412a7782021.tar.zst
Bunch of small changes...
Diffstat (limited to 'src/fpsgame/ai.h')
-rw-r--r--src/fpsgame/ai.h500
1 files changed, 250 insertions, 250 deletions
diff --git a/src/fpsgame/ai.h b/src/fpsgame/ai.h
index 43efde9..9ea7e41 100644
--- a/src/fpsgame/ai.h
+++ b/src/fpsgame/ai.h
@@ -7,84 +7,84 @@ enum { AI_NONE = 0, AI_BOT, AI_MAX };
namespace ai
{
- const int MAXWAYPOINTS = USHRT_MAX - 2;
- const int MAXWAYPOINTLINKS = 6;
- const int WAYPOINTRADIUS = 16;
-
- const float MINWPDIST = 4.f; // is on top of
- const float CLOSEDIST = 32.f; // is close
- const float FARDIST = 128.f; // too far to remap close
- const float JUMPMIN = 4.f; // decides to jump
- const float JUMPMAX = 32.f; // max jump
- const float SIGHTMIN = 64.f; // minimum line of sight
- const float SIGHTMAX = 1024.f; // maximum line of sight
- const float VIEWMIN = 90.f; // minimum field of view
- const float VIEWMAX = 180.f; // maximum field of view
-
- struct waypoint
- {
- vec o;
- float curscore, estscore;
+ const int MAXWAYPOINTS = USHRT_MAX - 2;
+ const int MAXWAYPOINTLINKS = 6;
+ const int WAYPOINTRADIUS = 16;
+
+ const float MINWPDIST = 4.f; // is on top of
+ const float CLOSEDIST = 32.f; // is close
+ const float FARDIST = 128.f; // too far to remap close
+ const float JUMPMIN = 4.f; // decides to jump
+ const float JUMPMAX = 32.f; // max jump
+ const float SIGHTMIN = 64.f; // minimum line of sight
+ const float SIGHTMAX = 1024.f; // maximum line of sight
+ const float VIEWMIN = 90.f; // minimum field of view
+ const float VIEWMAX = 180.f; // maximum field of view
+
+ struct waypoint
+ {
+ vec o;
+ float curscore, estscore;
int weight;
- ushort route, prev;
- ushort links[MAXWAYPOINTLINKS];
+ ushort route, prev;
+ ushort links[MAXWAYPOINTLINKS];
- waypoint() {}
- waypoint(const vec &o, int weight = 0) : o(o), weight(weight), route(0) { memset(links, 0, sizeof(links)); }
+ waypoint() {}
+ waypoint(const vec &o, int weight = 0) : o(o), weight(weight), route(0) { memset(links, 0, sizeof(links)); }
- int score() const { return int(curscore) + int(estscore); }
+ int score() const { return int(curscore) + int(estscore); }
- int find(int wp)
+ int find(int wp)
{
loopi(MAXWAYPOINTLINKS) if(links[i] == wp) return i;
return -1;
}
bool haslinks() { return links[0]!=0; }
- };
- extern vector<waypoint> waypoints;
+ };
+ extern vector<waypoint> waypoints;
- static inline bool iswaypoint(int n)
- {
- return n > 0 && n < waypoints.length();
- }
+ static inline bool iswaypoint(int n)
+ {
+ return n > 0 && n < waypoints.length();
+ }
- extern int showwaypoints, dropwaypoints;
- extern int closestwaypoint(const vec &pos, float mindist, bool links, fpsent *d = NULL);
- extern void findwaypointswithin(const vec &pos, float mindist, float maxdist, vector<int> &results);
+ extern int showwaypoints, dropwaypoints;
+ extern int closestwaypoint(const vec &pos, float mindist, bool links, fpsent *d = NULL);
+ extern void findwaypointswithin(const vec &pos, float mindist, float maxdist, vector<int> &results);
extern void inferwaypoints(fpsent *d, const vec &o, const vec &v, float mindist = ai::CLOSEDIST);
- struct avoidset
- {
- struct obstacle
- {
- void *owner;
- int numwaypoints;
- float above;
-
- obstacle(void *owner, float above = -1) : owner(owner), numwaypoints(0), above(above) {}
- };
-
- vector<obstacle> obstacles;
- vector<int> waypoints;
-
- void clear()
- {
- obstacles.setsize(0);
- waypoints.setsize(0);
- }
-
- void add(void *owner, float above)
- {
- obstacles.add(obstacle(owner, above));
- }
-
- void add(void *owner, float above, int wp)
- {
- if(obstacles.empty() || owner != obstacles.last().owner) add(owner, above);
- obstacles.last().numwaypoints++;
- waypoints.add(wp);
- }
+ struct avoidset
+ {
+ struct obstacle
+ {
+ void *owner;
+ int numwaypoints;
+ float above;
+
+ obstacle(void *owner, float above = -1) : owner(owner), numwaypoints(0), above(above) {}
+ };
+
+ vector<obstacle> obstacles;
+ vector<int> waypoints;
+
+ void clear()
+ {
+ obstacles.setsize(0);
+ waypoints.setsize(0);
+ }
+
+ void add(void *owner, float above)
+ {
+ obstacles.add(obstacle(owner, above));
+ }
+
+ void add(void *owner, float above, int wp)
+ {
+ if(obstacles.empty() || owner != obstacles.last().owner) add(owner, above);
+ obstacles.last().numwaypoints++;
+ waypoints.add(wp);
+ }
void add(avoidset &avoid)
{
@@ -97,175 +97,175 @@ namespace ai
}
}
- void avoidnear(void *owner, float above, const vec &pos, float limit);
-
- #define loopavoid(v, d, body) \
- if(!(v).obstacles.empty()) \
- { \
- int cur = 0; \
- loopv((v).obstacles) \
- { \
- const ai::avoidset::obstacle &ob = (v).obstacles[i]; \
- int next = cur + ob.numwaypoints; \
- if(ob.owner != d) \
- { \
- for(; cur < next; cur++) \
- { \
- int wp = (v).waypoints[cur]; \
- body; \
- } \
- } \
- cur = next; \
- } \
- }
-
- bool find(int n, fpsent *d) const
- {
- loopavoid(*this, d, { if(wp == n) return true; });
- return false;
- }
-
- int remap(fpsent *d, int n, vec &pos, bool retry = false);
- };
-
- extern bool route(fpsent *d, int node, int goal, vector<int> &route, const avoidset &obstacles, int retries = 0);
- extern void navigate();
- extern void clearwaypoints(bool full = false);
- extern void seedwaypoints();
- extern void loadwaypoints(bool force = false, const char *mname = NULL);
- extern void savewaypoints(bool force = false, const char *mname = NULL);
-
- // ai state information for the owner client
- enum
- {
- AI_S_WAIT = 0, // waiting for next command
- AI_S_DEFEND, // defend goal target
- AI_S_PURSUE, // pursue goal target
- AI_S_INTEREST, // interest in goal entity
- AI_S_MAX
- };
-
- enum
- {
- AI_T_NODE,
- AI_T_PLAYER,
- AI_T_AFFINITY,
- AI_T_ENTITY,
- AI_T_MAX
- };
-
- struct interest
- {
- int state, node, target, targtype;
- float score;
- interest() : state(-1), node(-1), target(-1), targtype(-1), score(0.f) {}
- ~interest() {}
- };
-
- struct aistate
- {
- int type, millis, targtype, target, idle;
- bool override;
-
- aistate(int m, int t, int r = -1, int v = -1) : type(t), millis(m), targtype(r), target(v)
- {
- reset();
- }
- ~aistate() {}
-
- void reset()
- {
- idle = 0;
- override = false;
- }
- };
-
- const int NUMPREVNODES = 6;
-
- struct aiinfo
- {
- vector<aistate> state;
- vector<int> route;
- vec target, spot;
- int enemy, enemyseen, enemymillis, weappref, prevnodes[NUMPREVNODES], targnode, targlast, targtime, targseq,
- lastrun, lasthunt, lastaction, lastcheck, jumpseed, jumprand, blocktime, huntseq, blockseq, lastaimrnd;
- float targyaw, targpitch, views[3], aimrnd[3];
- bool dontmove, becareful, tryreset, trywipe;
-
- aiinfo()
- {
- clearsetup();
- reset();
- loopk(3) views[k] = 0.f;
- }
- ~aiinfo() {}
+ void avoidnear(void *owner, float above, const vec &pos, float limit);
+
+ #define loopavoid(v, d, body) \
+ if(!(v).obstacles.empty()) \
+ { \
+ int cur = 0; \
+ loopv((v).obstacles) \
+ { \
+ const ai::avoidset::obstacle &ob = (v).obstacles[i]; \
+ int next = cur + ob.numwaypoints; \
+ if(ob.owner != d) \
+ { \
+ for(; cur < next; cur++) \
+ { \
+ int wp = (v).waypoints[cur]; \
+ body; \
+ } \
+ } \
+ cur = next; \
+ } \
+ }
+
+ bool find(int n, fpsent *d) const
+ {
+ loopavoid(*this, d, { if(wp == n) return true; });
+ return false;
+ }
+
+ int remap(fpsent *d, int n, vec &pos, bool retry = false);
+ };
+
+ extern bool route(fpsent *d, int node, int goal, vector<int> &route, const avoidset &obstacles, int retries = 0);
+ extern void navigate();
+ extern void clearwaypoints(bool full = false);
+ extern void seedwaypoints();
+ extern void loadwaypoints(bool force = false, const char *mname = NULL);
+ extern void savewaypoints(bool force = false, const char *mname = NULL);
+
+ // ai state information for the owner client
+ enum
+ {
+ AI_S_WAIT = 0, // waiting for next command
+ AI_S_DEFEND, // defend goal target
+ AI_S_PURSUE, // pursue goal target
+ AI_S_INTEREST, // interest in goal entity
+ AI_S_MAX
+ };
+
+ enum
+ {
+ AI_T_NODE,
+ AI_T_PLAYER,
+ AI_T_AFFINITY,
+ AI_T_ENTITY,
+ AI_T_MAX
+ };
+
+ struct interest
+ {
+ int state, node, target, targtype;
+ float score;
+ interest() : state(-1), node(-1), target(-1), targtype(-1), score(0.f) {}
+ ~interest() {}
+ };
+
+ struct aistate
+ {
+ int type, millis, targtype, target, idle;
+ bool override;
+
+ aistate(int m, int t, int r = -1, int v = -1) : type(t), millis(m), targtype(r), target(v)
+ {
+ reset();
+ }
+ ~aistate() {}
+
+ void reset()
+ {
+ idle = 0;
+ override = false;
+ }
+ };
+
+ const int NUMPREVNODES = 6;
+
+ struct aiinfo
+ {
+ vector<aistate> state;
+ vector<int> route;
+ vec target, spot;
+ int enemy, enemyseen, enemymillis, weappref, prevnodes[NUMPREVNODES], targnode, targlast, targtime, targseq,
+ lastrun, lasthunt, lastaction, lastcheck, jumpseed, jumprand, blocktime, huntseq, blockseq, lastaimrnd;
+ float targyaw, targpitch, views[3], aimrnd[3];
+ bool dontmove, becareful, tryreset, trywipe;
+
+ aiinfo()
+ {
+ clearsetup();
+ reset();
+ loopk(3) views[k] = 0.f;
+ }
+ ~aiinfo() {}
void clearsetup()
{
- weappref = GUN_PISTOL;
- spot = target = vec(0, 0, 0);
- lastaction = lasthunt = lastcheck = enemyseen = enemymillis = blocktime = huntseq = blockseq = targtime = targseq = lastaimrnd = 0;
- lastrun = jumpseed = lastmillis;
- jumprand = lastmillis+5000;
- targnode = targlast = enemy = -1;
+ weappref = GUN_PISTOL;
+ spot = target = vec(0, 0, 0);
+ lastaction = lasthunt = lastcheck = enemyseen = enemymillis = blocktime = huntseq = blockseq = targtime = targseq = lastaimrnd = 0;
+ lastrun = jumpseed = lastmillis;
+ jumprand = lastmillis+5000;
+ targnode = targlast = enemy = -1;
}
void clear(bool prev = false)
{
- if(prev) memset(prevnodes, -1, sizeof(prevnodes));
- route.setsize(0);
+ if(prev) memset(prevnodes, -1, sizeof(prevnodes));
+ route.setsize(0);
}
- void wipe(bool prev = false)
- {
- clear(prev);
- state.setsize(0);
- addstate(AI_S_WAIT);
- trywipe = false;
- }
-
- void clean(bool tryit = false)
- {
- if(!tryit) becareful = dontmove = false;
- targyaw = rnd(360);
- targpitch = 0.f;
- tryreset = tryit;
- }
-
- void reset(bool tryit = false) { wipe(); clean(tryit); }
-
- bool hasprevnode(int n) const
- {
- loopi(NUMPREVNODES) if(prevnodes[i] == n) return true;
- return false;
- }
-
- void addprevnode(int n)
- {
- if(prevnodes[0] != n)
- {
- memmove(&prevnodes[1], prevnodes, sizeof(prevnodes) - sizeof(prevnodes[0]));
- prevnodes[0] = n;
- }
- }
-
- aistate &addstate(int t, int r = -1, int v = -1)
- {
- return state.add(aistate(lastmillis, t, r, v));
- }
-
- void removestate(int index = -1)
- {
- if(index < 0) state.pop();
- else if(state.inrange(index)) state.remove(index);
- if(!state.length()) addstate(AI_S_WAIT);
- }
-
- aistate &getstate(int idx = -1)
- {
- if(state.inrange(idx)) return state[idx];
- return state.last();
- }
+ void wipe(bool prev = false)
+ {
+ clear(prev);
+ state.setsize(0);
+ addstate(AI_S_WAIT);
+ trywipe = false;
+ }
+
+ void clean(bool tryit = false)
+ {
+ if(!tryit) becareful = dontmove = false;
+ targyaw = rnd(360);
+ targpitch = 0.f;
+ tryreset = tryit;
+ }
+
+ void reset(bool tryit = false) { wipe(); clean(tryit); }
+
+ bool hasprevnode(int n) const
+ {
+ loopi(NUMPREVNODES) if(prevnodes[i] == n) return true;
+ return false;
+ }
+
+ void addprevnode(int n)
+ {
+ if(prevnodes[0] != n)
+ {
+ memmove(&prevnodes[1], prevnodes, sizeof(prevnodes) - sizeof(prevnodes[0]));
+ prevnodes[0] = n;
+ }
+ }
+
+ aistate &addstate(int t, int r = -1, int v = -1)
+ {
+ return state.add(aistate(lastmillis, t, r, v));
+ }
+
+ void removestate(int index = -1)
+ {
+ if(index < 0) state.pop();
+ else if(state.inrange(index)) state.remove(index);
+ if(!state.length()) addstate(AI_S_WAIT);
+ }
+
+ aistate &getstate(int idx = -1)
+ {
+ if(state.inrange(idx)) return state[idx];
+ return state.last();
+ }
aistate &switchstate(aistate &b, int t, int r = -1, int v = -1)
{
@@ -278,40 +278,40 @@ namespace ai
}
return addstate(t, r, v);
}
- };
+ };
extern avoidset obstacles;
- extern vec aitarget;
-
- extern float viewdist(int x = 101);
- extern float viewfieldx(int x = 101);
- extern float viewfieldy(int x = 101);
- extern bool targetable(fpsent *d, fpsent *e);
- extern bool cansee(fpsent *d, vec &x, vec &y, vec &targ = aitarget);
-
- extern void init(fpsent *d, int at, int on, int sk, int bn, int pm, const char *name, const char *team);
- extern void update();
- extern void avoid();
- extern void think(fpsent *d, bool run);
-
- extern bool badhealth(fpsent *d);
- extern bool checkothers(vector<int> &targets, fpsent *d = NULL, int state = -1, int targtype = -1, int target = -1, bool teams = false, int *members = NULL);
- extern bool makeroute(fpsent *d, aistate &b, int node, bool changed = true, int retries = 0);
- extern bool makeroute(fpsent *d, aistate &b, const vec &pos, bool changed = true, int retries = 0);
- extern bool randomnode(fpsent *d, aistate &b, const vec &pos, float guard = SIGHTMIN, float wander = SIGHTMAX);
- extern bool randomnode(fpsent *d, aistate &b, float guard = SIGHTMIN, float wander = SIGHTMAX);
- extern bool violence(fpsent *d, aistate &b, fpsent *e, int pursue = 0);
- extern bool patrol(fpsent *d, aistate &b, const vec &pos, float guard = SIGHTMIN, float wander = SIGHTMAX, int walk = 1, bool retry = false);
- extern bool defend(fpsent *d, aistate &b, const vec &pos, float guard = SIGHTMIN, float wander = SIGHTMAX, int walk = 1);
- extern void assist(fpsent *d, aistate &b, vector<interest> &interests, bool all = false, bool force = false);
- extern bool parseinterests(fpsent *d, aistate &b, vector<interest> &interests, bool override = false, bool ignore = false);
+ extern vec aitarget;
+
+ extern float viewdist(int x = 101);
+ extern float viewfieldx(int x = 101);
+ extern float viewfieldy(int x = 101);
+ extern bool targetable(fpsent *d, fpsent *e);
+ extern bool cansee(fpsent *d, vec &x, vec &y, vec &targ = aitarget);
+
+ extern void init(fpsent *d, int at, int on, int sk, int bn, int pm, const char *name, const char *team);
+ extern void update();
+ extern void avoid();
+ extern void think(fpsent *d, bool run);
+
+ extern bool badhealth(fpsent *d);
+ extern bool checkothers(vector<int> &targets, fpsent *d = NULL, int state = -1, int targtype = -1, int target = -1, bool teams = false, int *members = NULL);
+ extern bool makeroute(fpsent *d, aistate &b, int node, bool changed = true, int retries = 0);
+ extern bool makeroute(fpsent *d, aistate &b, const vec &pos, bool changed = true, int retries = 0);
+ extern bool randomnode(fpsent *d, aistate &b, const vec &pos, float guard = SIGHTMIN, float wander = SIGHTMAX);
+ extern bool randomnode(fpsent *d, aistate &b, float guard = SIGHTMIN, float wander = SIGHTMAX);
+ extern bool violence(fpsent *d, aistate &b, fpsent *e, int pursue = 0);
+ extern bool patrol(fpsent *d, aistate &b, const vec &pos, float guard = SIGHTMIN, float wander = SIGHTMAX, int walk = 1, bool retry = false);
+ extern bool defend(fpsent *d, aistate &b, const vec &pos, float guard = SIGHTMIN, float wander = SIGHTMAX, int walk = 1);
+ extern void assist(fpsent *d, aistate &b, vector<interest> &interests, bool all = false, bool force = false);
+ extern bool parseinterests(fpsent *d, aistate &b, vector<interest> &interests, bool override = false, bool ignore = false);
extern void spawned(fpsent *d);
extern void damaged(fpsent *d, fpsent *e);
extern void killed(fpsent *d, fpsent *e);
extern void itemspawned(int ent);
- extern void render();
+ extern void render();
}