1 /* --- Evaluation functions ---
\r
2 UrreBots select items to hunt for based on distance and if the item is valuable to them
\r
3 The returning float is added to the travel distance when searching
\r
4 Higher numbers are crummier
\r
5 -1 means definite unwanted goal*/
\r
12 if (self.ammo_shells > 40)
\r
14 if (self.items & IT_SHOTGUN)
\r
16 if (self.ammo_shells >= 100)
\r
26 if (self.ammo_nails > 120)
\r
28 else if (self.items & IT_UZI)
\r
30 if (self.ammo_nails >= 200)
\r
35 float() RocketsEval =
\r
40 if (self.ammo_rockets > 30)
\r
42 if ((self.items & IT_ROCKET_LAUNCHER) || (self.items & IT_GRENADE_LAUNCHER) || (self.items & IT_HAGAR))
\r
44 if (self.ammo_rockets >= 100)
\r
54 if ((self.items & IT_CRYLINK) || (self.items & IT_NEX) || (self.items & IT_ELECTRO))
\r
56 if (self.ammo_cells >= 100)
\r
61 float() Health5Eval =
\r
65 f2 = self.health * 0.01;
\r
73 float() Health25Eval =
\r
77 f2 = self.health * 0.01;
\r
85 float() Health100Eval =
\r
94 float() Armor5Eval =
\r
100 if (self.health < 50)
\r
105 float() Armor100Eval =
\r
111 if (self.health < 50)
\r
122 if (deathmatch == 2 && (self.items & IT_SUPER_SHOTGUN))
\r
134 if (deathmatch == 2 && (self.items & IT_SUPER_SHOTGUN))
\r
146 if (deathmatch == 2 && (self.items & IT_SUPER_SHOTGUN))
\r
158 if (deathmatch == 2 && (self.items & IT_SUPER_SHOTGUN))
\r
170 if (deathmatch == 2 && (self.items & IT_NAILGUN))
\r
182 if (deathmatch == 2 && (self.items & IT_SUPER_NAILGUN))
\r
194 if (deathmatch == 2 && (self.items & IT_GRENADE_LAUNCHER))
\r
206 if (deathmatch == 2 && (self.items & IT_ROCKET_LAUNCHER))
\r
217 float() StrengthEval =
\r
227 /* --- ItemEvals ---
\r
228 Called at load, to give all pickable items their evaluation function
\r
229 Also assigns their current waybox (makes for faster evaluation)*/
\r
235 e = findchainflags(flags, FL_ITEM);
\r
238 e.enemy = FindCurrentNavNode((e.absmin + e.absmax)*0.5, e.mins, e.maxs);
\r
239 if (e.enemy == world)
\r
241 dprint ("Warning: Found no box for item\n");
\r
242 e.evalfunc = BadEval;
\r
246 if (e.netname == "shells")
\r
247 e.evalfunc = ShellsEval;
\r
248 else if (e.netname == "bullets")
\r
249 e.evalfunc = NailsEval;
\r
250 else if (e.netname == "rockets")
\r
251 e.evalfunc = RocketsEval;
\r
252 else if (e.netname == "cells")
\r
253 e.evalfunc = CellsEval;
\r
254 else if (e.netname == "5 Health")
\r
255 e.evalfunc = Health5Eval;
\r
256 else if (e.netname == "25 Health")
\r
257 e.evalfunc = Health25Eval;
\r
258 else if (e.netname == "100 Health")
\r
259 e.evalfunc = Health100Eval;
\r
260 else if (e.netname == "Armor Shard")
\r
261 e.evalfunc = Armor5Eval;
\r
262 else if (e.netname == "Armor")
\r
263 e.evalfunc = Armor100Eval;
\r
264 else if (e.netname == "Uzi")
\r
265 e.evalfunc = UEval;
\r
266 else if (e.netname == "Shotgun")
\r
267 e.evalfunc = SGEval;
\r
268 else if (e.netname == "Grenade Launcher")
\r
269 e.evalfunc = GLEval;
\r
270 else if (e.netname == "Electro")
\r
271 e.evalfunc = EEval;
\r
272 else if (e.netname == "Crylink")
\r
273 e.evalfunc = CLEval;
\r
274 else if (e.netname == "Nex Gun")
\r
275 e.evalfunc = NGEval;
\r
276 else if (e.netname == "Hagar")
\r
277 e.evalfunc = HEval;
\r
278 else if (e.netname == "Rocket Launcher")
\r
279 e.evalfunc = RLEval;
\r
280 else if (e.netname == "Strength Powerup")
\r
281 e.evalfunc = StrengthEval;
\r
282 else if (e.netname == "Invulnerability")
\r
283 e.evalfunc = InvEval;
\r
285 dprint ("Warning: Unknown item\n");
\r
291 /* --- DistEvalItems ---
\r
292 This function adds the items assigned navnode's travel cost to the item
\r
293 Used for goal evaluation*/
\r
295 void() DistEvalItems =
\r
301 e = findchainflags(flags, FL_ITEM);
\r
305 if (e.flags & FL_ONGROUND)
\r
306 // if (e.classname == "BackPack")
\r
308 e.enemy = FindCurrentNavNode((e.absmin + e.absmax)*0.5, e.mins, e.maxs);
\r
311 v = e.origin + (e.mins + e.maxs) * 0.5;
\r
312 f = vlen(v - e.enemy.pointl);
\r
313 e.costl = e.enemy.costl + f;
\r