]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/gamec/urrebot_ai_goals.c
Renamed remotely
[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 /*\r
122         if (deathmatch == 2 && (self.items & IT_SUPER_SHOTGUN))\r
123                 f = -1;\r
124 */\r
125         return f;\r
126 };\r
127 \r
128 float() UEval =\r
129 {\r
130         local float f;\r
131 \r
132         f = 500;\r
133 /*\r
134         if (deathmatch == 2 && (self.items & IT_SUPER_SHOTGUN))\r
135                 f = -1;\r
136 */\r
137         return f;\r
138 };\r
139 \r
140 float() CLEval =\r
141 {\r
142         local float f;\r
143 \r
144         f = 500;\r
145 /*\r
146         if (deathmatch == 2 && (self.items & IT_SUPER_SHOTGUN))\r
147                 f = -1;\r
148 */\r
149         return f;\r
150 };\r
151 \r
152 float() HEval =\r
153 {\r
154         local float f;\r
155 \r
156         f = 500;\r
157 /*\r
158         if (deathmatch == 2 && (self.items & IT_SUPER_SHOTGUN))\r
159                 f = -1;\r
160 */\r
161         return f;\r
162 };\r
163 \r
164 float() NGEval =\r
165 {\r
166         local float f;\r
167 \r
168         f = 200;\r
169 /*\r
170         if (deathmatch == 2 && (self.items & IT_NAILGUN))\r
171                 f = -1;\r
172 */\r
173         return f;\r
174 };\r
175 \r
176 float() SGEval =\r
177 {\r
178         local float f;\r
179 \r
180         f = 1000;\r
181 /*\r
182         if (deathmatch == 2 && (self.items & IT_SUPER_NAILGUN))\r
183                 f = -1;\r
184 */\r
185         return f;\r
186 };\r
187 \r
188 float() GLEval =\r
189 {\r
190         local float f;\r
191 \r
192         f = 300;\r
193 /*\r
194         if (deathmatch == 2 && (self.items & IT_GRENADE_LAUNCHER))\r
195                 f = -1;\r
196 */\r
197         return f;\r
198 };\r
199 \r
200 float() RLEval =\r
201 {\r
202         local float f;\r
203 \r
204         f = 100;\r
205 /*\r
206         if (deathmatch == 2 && (self.items & IT_ROCKET_LAUNCHER))\r
207                 f = -1;\r
208 */\r
209         return f;\r
210 };\r
211 \r
212 float() InvEval =\r
213 {\r
214         return 50;\r
215 };\r
216 \r
217 float() StrengthEval =\r
218 {\r
219         return 50;\r
220 };\r
221 \r
222 float() BadEval =\r
223 {\r
224         return -1;\r
225 };\r
226 \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
230 \r
231 void() ItemEvals =\r
232 {\r
233         local entity e;\r
234 \r
235         e = findchainflags(flags, FL_ITEM);\r
236         while (e)\r
237         {\r
238                 e.enemy = FindCurrentNavNode((e.absmin + e.absmax)*0.5, e.mins, e.maxs);\r
239                 if (e.enemy == world)\r
240                 {\r
241                         dprint ("Warning: Found no box for item\n");\r
242                         e.evalfunc = BadEval;\r
243                 }\r
244                 else\r
245                 {\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
284                         else\r
285                                 dprint ("Warning: Unknown item\n");\r
286                 }\r
287                 e = e.chain;\r
288         }\r
289 };\r
290 \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
294 \r
295 void() DistEvalItems =\r
296 {\r
297         local float f;\r
298         local vector v;\r
299         local entity e;\r
300 \r
301         e = findchainflags(flags, FL_ITEM);\r
302         while (e)\r
303         {\r
304                 /*\r
305                 if (e.flags & FL_ONGROUND)\r
306                 // if (e.classname == "BackPack")\r
307                 if (!e.enemy)\r
308                         e.enemy = FindCurrentNavNode((e.absmin + e.absmax)*0.5, e.mins, e.maxs);\r
309                 */\r
310 \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
314                 e = e.chain;\r
315         }\r
316 };