]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/gamec/urrebot_ai_goals.c
The laser got a small viewkick
[divverent/nexuiz.git] / data / qcsrc / server / gamec / urrebot_ai_goals.c
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*/
6
7 float() ShellsEval =
8 {
9         local float f;
10
11         f = 1000;
12         if (self.ammo_shells > 40)
13                 f = f + 500;
14         if (self.items & IT_SHOTGUN)
15                 f = f - 250;
16         if (self.ammo_shells >= 100)
17                 f = -1;
18         return f;
19 };
20
21 float() NailsEval =
22 {
23         local float f;
24
25         f = 1000;
26         if (self.ammo_nails > 120)
27                 f = f + 200;
28         else if (self.items & IT_UZI)
29                 f = f - 250;
30         if (self.ammo_nails >= 200)
31                 f = -1;
32         return f;
33 };
34
35 float() RocketsEval =
36 {
37         local float f;
38
39         f = 1000;
40         if (self.ammo_rockets > 30)
41                 f = f + 50;
42         if ((self.items & IT_ROCKET_LAUNCHER) || (self.items & IT_GRENADE_LAUNCHER) || (self.items & IT_HAGAR))
43                 f = f - 400;
44         if (self.ammo_rockets >= 100)
45                 f = -1;
46         return f;
47 };
48
49 float() CellsEval =
50 {
51         local float f;
52
53         f = 1000;
54         if ((self.items & IT_CRYLINK) || (self.items & IT_NEX) || (self.items & IT_ELECTRO))
55                 f = f - 400;
56         if (self.ammo_cells >= 100)
57                 f = -1;
58         return f;
59 };
60
61 float() Health5Eval =
62 {
63         local float f, f2;
64
65         f2 = self.health * 0.01;
66         f = 800 * f2;
67
68         if (f < 20)
69                 f = 20;
70         return f;
71 };
72
73 float() Health25Eval =
74 {
75         local float f, f2;
76
77         f2 = self.health * 0.01;
78         f = 400 * f2;
79
80         if (f < 20)
81                 f = 20;
82         return f;
83 };
84
85 float() Health100Eval =
86 {
87         local float f;
88
89         f = 100;
90
91         return f;
92 };
93
94 float() Armor5Eval =
95 {
96         local float f;
97
98         f = 800;
99
100         if (self.health < 50)
101                 f = f - 300;
102         return f;
103 };
104
105 float() Armor100Eval =
106 {
107         local float f;
108
109         f = 250;
110
111         if (self.health < 50)
112                 f = f - 80;
113         return f;
114 };
115
116 float() EEval =
117 {
118         local float f;
119
120         f = 250;
121         return f;
122 };
123
124 float() UEval =
125 {
126         local float f;
127
128         f = 500;
129         return f;
130 };
131
132 float() CLEval =
133 {
134         local float f;
135
136         f = 500;
137         return f;
138 };
139
140 float() HEval =
141 {
142         local float f;
143
144         f = 500;
145         return f;
146 };
147
148 float() NGEval =
149 {
150         local float f;
151
152         f = 200;
153         return f;
154 };
155
156 float() SGEval =
157 {
158         local float f;
159
160         f = 1000;
161         return f;
162 };
163
164 float() GLEval =
165 {
166         local float f;
167
168         f = 300;
169         return f;
170 };
171
172 float() RLEval =
173 {
174         local float f;
175
176         f = 100;
177         return f;
178 };
179
180 float() InvEval =
181 {
182         return 50;
183 };
184
185 float() StrengthEval =
186 {
187         return 50;
188 };
189
190 float() RuneEval =
191 {
192         return 10; // this is the goal of the gamemode, so we want these things above all else
193 };
194
195 float(entity dompoint) DomPointEval =
196 {
197         if (dompoint.enemy.team != self.team)
198                 return 50;
199         return -1;
200 };
201
202 float() BadEval =
203 {
204         return -1;
205 };
206
207 /* --- ItemEvals ---
208 Called at load, to give all pickable items their evaluation function
209 Also assigns their current navnode (makes for faster evaluation)*/
210
211 void() ItemEvals =
212 {
213         local entity e;
214
215         e = findchainflags(flags, FL_ITEM);
216         while (e)
217         {
218                 e.goallist = FindCurrentNavNode((e.absmin + e.absmax)*0.5, e.mins, e.maxs);
219                 if (e.goallist == world)
220                 {
221                         dprint ("Warning: Found no navnode for item\n");
222                         e.evalfunc = BadEval;
223                 }
224                 else
225                 {
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)
245                                 e.evalfunc = UEval;
246                         else if (e.items & IT_SHOTGUN)
247                                 e.evalfunc = SGEval;
248                         else if (e.items & IT_GRENADE_LAUNCHER)
249                                 e.evalfunc = GLEval;
250                         else if (e.items & IT_ELECTRO)
251                                 e.evalfunc = EEval;
252                         else if (e.items & IT_CRYLINK)
253                                 e.evalfunc = CLEval;
254                         else if (e.items & IT_NEX)
255                                 e.evalfunc = NGEval;
256                         else if (e.items & IT_HAGAR)
257                                 e.evalfunc = HEval;
258                         else if (e.items & IT_ROCKET_LAUNCHER)
259                                 e.evalfunc = RLEval;
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;
266                         else
267                         {
268                                 dprint ("Warning: Unknown item\n");
269                                 e.evalfunc = BadEval;
270                         }
271                 }
272                 e = e.chain;
273         }
274 };
275
276 /* --- DistEvalItems ---
277 This function adds the items assigned navnode's travel cost to the item
278 Used for goal evaluation*/
279
280 void() DistEvalItems =
281 {
282         local float f;
283         local vector v;
284         local entity e;
285
286         e = findchainflags(flags, FL_ITEM);
287         while (e)
288         {
289                 if (e.flags & FL_ONGROUND)
290                 if (!e.goallist)
291                 {
292                         e.goallist = FindCurrentNavNode((e.absmin + e.absmax)*0.5, e.mins, e.maxs);
293                         if (e.classname == "droppedweapon")
294                         {
295                                 if (e.items & IT_UZI)
296                                         e.evalfunc = UEval;
297                                 else if (e.items & IT_SHOTGUN)
298                                         e.evalfunc = SGEval;
299                                 else if (e.items & IT_GRENADE_LAUNCHER)
300                                         e.evalfunc = GLEval;
301                                 else if (e.items & IT_ELECTRO)
302                                         e.evalfunc = EEval;
303                                 else if (e.items & IT_CRYLINK)
304                                         e.evalfunc = CLEval;
305                                 else if (e.items & IT_NEX)
306                                         e.evalfunc = NGEval;
307                                 else if (e.items & IT_HAGAR)
308                                         e.evalfunc = HEval;
309                                 else if (e.items & IT_ROCKET_LAUNCHER)
310                                         e.evalfunc = RLEval;
311                                 else
312                                 {
313                                         dprint ("Warning: Unknown item\n");
314                                         e.evalfunc = BadEval;
315                                 }
316                         }
317                         else if (e.runes)
318                                 e.evalfunc = RuneEval;
319                         else
320                         {
321                                 dprint ("Warning: Unknown item\n");
322                                 e.evalfunc = BadEval;
323                         }
324                 }
325
326                 v = e.absmin + e.absmax * 0.5;
327                 f = vlen(v - e.goallist.pointl);
328                 e.costl = e.goallist.costl + f;
329                 e = e.chain;
330         }
331 };