1 /* --- Evaluation functions ---
2 UrreBots select items to hunt for based on distance and if the item is valuable to them
3 The returning float is added to the travel distance when searching
4 Higher numbers are crummier
5 -1 means definite unwanted goal*/
12 if (self.ammo_shells > 40)
14 if (self.items & IT_SHOTGUN)
16 if (self.ammo_shells >= 100)
26 if (self.ammo_nails > 120)
28 else if (self.items & IT_UZI)
30 if (self.ammo_nails >= 200)
40 if (self.ammo_rockets > 30)
42 if ((self.items & IT_ROCKET_LAUNCHER) || (self.items & IT_GRENADE_LAUNCHER) || (self.items & IT_HAGAR))
44 if (self.ammo_rockets >= 100)
54 if ((self.items & IT_CRYLINK) || (self.items & IT_NEX) || (self.items & IT_ELECTRO))
56 if (self.ammo_cells >= 100)
65 f2 = self.health * 0.01;
73 float() Health25Eval =
77 f2 = self.health * 0.01;
85 float() Health100Eval =
100 if (self.health < 50)
105 float() Armor100Eval =
111 if (self.health < 50)
185 float() StrengthEval =
192 return 10; // this is the goal of the gamemode, so we want these things above all else
195 float(entity dompoint) DomPointEval =
197 if (dompoint.enemy.team != self.team)
208 Called at load, to give all pickable items their evaluation function
209 Also assigns their current navnode (makes for faster evaluation)*/
215 e = findchainflags(flags, FL_ITEM);
218 e.goallist = FindCurrentNavNode((e.absmin + e.absmax)*0.5, e.mins, e.maxs);
219 if (e.goallist == world)
221 dprint ("Warning: Found no navnode for item\n");
222 e.evalfunc = BadEval;
226 if (e.items & IT_SHELLS)
227 e.evalfunc = ShellsEval;
228 else if (e.items & IT_NAILS)
229 e.evalfunc = NailsEval;
230 else if (e.items & IT_ROCKETS)
231 e.evalfunc = RocketsEval;
232 else if (e.items & IT_CELLS)
233 e.evalfunc = CellsEval;
234 else if (e.max_health == 5)
235 e.evalfunc = Health5Eval;
236 else if (e.max_health == 25)
237 e.evalfunc = Health25Eval;
238 else if (e.max_health & 100)
239 e.evalfunc = Health100Eval;
240 else if (e.armorvalue == 5)
241 e.evalfunc = Armor5Eval;
242 else if (e.armorvalue == 100)
243 e.evalfunc = Armor100Eval;
244 else if (e.items & IT_UZI)
246 else if (e.items & IT_SHOTGUN)
248 else if (e.items & IT_GRENADE_LAUNCHER)
250 else if (e.items & IT_ELECTRO)
252 else if (e.items & IT_CRYLINK)
254 else if (e.items & IT_NEX)
256 else if (e.items & IT_HAGAR)
258 else if (e.items & IT_ROCKET_LAUNCHER)
260 else if (e.items & IT_STRENGTH)
261 e.evalfunc = StrengthEval;
262 else if (e.items & IT_INVINCIBLE)
263 e.evalfunc = InvEval;
264 else if (e.classname == "dom_controlpoint")
265 e.evalfunc = DomPointEval;
268 dprint ("Warning: Unknown item\n");
269 e.evalfunc = BadEval;
276 /* --- DistEvalItems ---
277 This function adds the items assigned navnode's travel cost to the item
278 Used for goal evaluation*/
280 void() DistEvalItems =
286 e = findchainflags(flags, FL_ITEM);
289 if (e.flags & FL_ONGROUND)
292 e.goallist = FindCurrentNavNode((e.absmin + e.absmax)*0.5, e.mins, e.maxs);
293 if (e.classname == "droppedweapon")
295 if (e.items & IT_UZI)
297 else if (e.items & IT_SHOTGUN)
299 else if (e.items & IT_GRENADE_LAUNCHER)
301 else if (e.items & IT_ELECTRO)
303 else if (e.items & IT_CRYLINK)
305 else if (e.items & IT_NEX)
307 else if (e.items & IT_HAGAR)
309 else if (e.items & IT_ROCKET_LAUNCHER)
313 dprint ("Warning: Unknown item\n");
314 e.evalfunc = BadEval;
318 e.evalfunc = RuneEval;
321 dprint ("Warning: Unknown item\n");
322 e.evalfunc = BadEval;
326 v = e.absmin + e.absmax * 0.5;
327 f = vlen(v - e.goallist.pointl);
328 e.costl = e.goallist.costl + f;