3
float bot_size_player (entity e)
7
sz = e.health + e.armorvalue * e.armortype;
8
if (e.weapon == IT_LIGHTNING)
10
else if (e.weapon == IT_ROCKET_LAUNCHER)
12
else if (e.weapon == IT_GRENADE_LAUNCHER)
14
else if (e.weapon == IT_SUPER_NAILGUN)
16
else if (e.weapon == IT_NAILGUN)
18
else if (e.weapon == IT_SUPER_SHOTGUN)
20
else if (e.weapon == IT_SHOTGUN)
22
else if (e.weapon == IT_AXE)
24
if (e.items & IT_QUAD)
26
if (e.items & IT_INVULNERABILITY)
28
if (e.items & IT_INVISIBILITY)
33
void bot_dodge_stuff ()
36
float foedist, avdist, foesz, flen, tsz;
38
string foe_team, self_team;
40
if (waypoint_mode > WM_LOADED)
48
v = self.origin - realorigin(self.enemy);
50
foesz = bot_size_player(self.enemy);
59
foe = find(world, classname, "grenade");
62
flen = vlen(foe.origin - self.origin);
68
foe = find(foe, classname, "grenade");
72
foe = find(world, classname, "missile");
75
if (foe.owner != self)
77
flen = vlen(foe.origin - self.origin);
84
foe = find(foe, classname, "missile");
88
foe = find(world, classname, "spike");
91
if (foe.owner != self)
93
flen = vlen(foe.origin - self.origin);
100
foe = find(foe, classname, "spike");
108
foe = findradius(self.origin, foedist);
111
if(foe.flags & FL_MONSTER)
115
flen = vlen(foe.origin - self.origin);
118
tsz = bot_size_player(foe);
142
if (foe.modelindex != 0)
146
self_team = infokey (self, "team");
147
foe_team = infokey (foe, "team");
148
if (!(teamplay && self_team == foe_team))
150
flen = vlen(foe.origin - self.origin);
153
tsz = bot_size_player(foe);
156
if (fov(foe) || foe.b_sound > time || self.b_skill == 3)
161
foedist = vlen(foe.origin - self.origin);
179
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
183
_x "sweet spot range" - try to maintain this range if possible
184
_y minimum range bot can be to be effective (rl/gl) (move away)
185
_z maximum range bot can be to be effective (lg/axe) (move in)
186
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
189
vector weapon_range (float wep)
193
else if (wep == IT_SHOTGUN)
194
return '128 0 99999';
195
else if (wep == IT_SUPER_SHOTGUN)
196
return '128 0 99999';
197
else if (wep == IT_NAILGUN)
199
else if (wep == IT_SUPER_NAILGUN)
201
else if (wep == IT_GRENADE_LAUNCHER)
202
return '180 48 3000';
203
else if (wep == IT_ROCKET_LAUNCHER)
204
return '180 48 3000';
205
else if (wep == IT_LIGHTNING)
209
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
213
Pick a weapon based on range / ammo
215
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
218
void bot_weapon_switch (float brange)
220
float it, flag, pulse;
223
it = self.items & 127;
227
if ((self.ammo_rockets >= 1) && (it & IT_ROCKET_LAUNCHER))
229
flag = IT_ROCKET_LAUNCHER;
232
else if (self.waterlevel <= 1 && self.ammo_cells >= 1 && (it & IT_LIGHTNING))
237
else if(self.ammo_nails >= 2 && (it & IT_SUPER_NAILGUN))
239
flag = IT_SUPER_NAILGUN;
242
else if ((self.ammo_rockets >= 1) && (it & IT_GRENADE_LAUNCHER))
244
flag = IT_GRENADE_LAUNCHER;
247
else if(self.ammo_shells >= 2 && (it & IT_SUPER_SHOTGUN))
249
flag = IT_SUPER_SHOTGUN;
252
else if(self.ammo_nails >= 1 && (it & IT_NAILGUN))
257
else if(self.ammo_shells >= 1 && (it & IT_SHOTGUN))
265
self.impulse = pulse;
272
self.impulse = pulse;
276
v = weapon_range(flag);
277
if (brange < v_y || brange > v_z)
282
self.impulse = pulse;
290
// quick little function to stop making him shoot the wrong way ! Argh
292
g = angcomp(self.v_angle_x, self.b_angle_x);
294
return; // argh, too far away
295
g = angcomp(self.v_angle_y, self.b_angle_y);
297
return; // not again!
302
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
306
This is the core of the bot's thinking when
309
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
312
void bot_fight_style ()
314
vector v, v1, v2, org;
315
float foedist, mysz, foesz;
316
string trace_ent_team, self_team;
318
if (self.enemy.health <= 0)
323
else if (!self.enemy.takedamage)
328
else if (!fisible(self.enemy))
334
org = realorigin(self.enemy);
335
makevectors(self.v_angle);
337
// decide if I should shoot
339
foedist = vlen(org - self.origin);
340
v = weapon_range(self.weapon);
341
if (foedist > v_y && foedist < v_z)
343
traceline(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * v_z, false, self);
344
if (vlen(trace_endpos - (self.origin + self.view_ofs)) >= v_y)
346
// try to avoid shooting teammates
347
if (trace_ent.classname == "player")
349
trace_ent_team = infokey (trace_ent, "team");
350
self_team = infokey (self, "team");
351
if ((trace_ent_team == self_team && teamplay) || (coop))
358
bot_weapon_switch(foedist);
360
if (!(self.b_aiflags & (AI_PRECISION | AI_BLIND | AI_OBSTRUCTED)))
362
foesz = bot_size_player(self.enemy);
363
mysz = bot_size_player(self) + 5;
382
if (self.avoid.velocity)
383
v = self.avoid.velocity;
385
v = normalize(self.avoid.origin - self.origin);
390
foedist = vlen(self.avoid.origin - (self.origin + v1));
391
if (foedist < vlen(self.avoid.origin - (self.origin + v2)))
396
else if (!self.enemy.flags & FL_MONSTER)
398
if (foedist + 32 < v_x)
399
frik_walkmove(self.origin - org);
400
else if (foedist - 32 > v_x)
401
frik_walkmove(org - self.origin);
402
else if (self.wallhug)
403
frik_walkmove(v_right);
405
frik_walkmove(v_right * -1);
410
foesz = bot_size_player(self.enemy);
411
mysz = bot_size_player(self) + 5;
417
self.keys = self.keys & 960;