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