]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/bot_misc.c
- Added new backpack/tfitem property -- item_backpack gives metal ammo when var...
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / bot_misc.c
1 /***********************************************\r
2 *                                              *\r
3 *              FrikBot Misc Code               *\r
4 *   "Because you can't name it anything else"  *\r
5 *                                              *\r
6 ***********************************************/\r
7 \r
8 /*\r
9 This program is in the Public Domain. My crack legal\r
10 team would like to add:\r
11 \r
12 RYAN "FRIKAC" SMITH IS PROVIDING THIS SOFTWARE "AS IS"\r
13 AND MAKES NO WARRANTY, EXPRESS OR IMPLIED, AS TO THE\r
14 ACCURACY, CAPABILITY, EFFICIENCY, MERCHANTABILITY, OR\r
15 FUNCTIONING OF THIS SOFTWARE AND/OR DOCUMENTATION. IN\r
16 NO EVENT WILL RYAN "FRIKAC" SMITH BE LIABLE FOR ANY\r
17 GENERAL, CONSEQUENTIAL, INDIRECT, INCIDENTAL,\r
18 EXEMPLARY, OR SPECIAL DAMAGES, EVEN IF RYAN "FRIKAC"\r
19 SMITH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\r
20 DAMAGES, IRRESPECTIVE OF THE CAUSE OF SUCH DAMAGES.\r
21 \r
22 You accept this software on the condition that you\r
23 indemnify and hold harmless Ryan "FrikaC" Smith from\r
24 any and all liability or damages to third parties,\r
25 including attorney fees, court costs, and other\r
26 related costs and expenses, arising out of your use\r
27 of this software irrespective of the cause of said\r
28 liability.\r
29 \r
30 The export from the United States or the subsequent\r
31 reexport of this software is subject to compliance\r
32 with United States export control and munitions\r
33 control restrictions. You agree that in the event you\r
34 seek to export this software, you assume full\r
35 responsibility for obtaining all necessary export\r
36 licenses and approvals and for assuring compliance\r
37 with applicable reexport restrictions.\r
38 \r
39 Any reproduction of this software must contain\r
40 this notice in its entirety.\r
41 \r
42 */\r
43 \r
44 /*\r
45 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
46 \r
47 BotName\r
48 \r
49 Sets bot's name and colors\r
50 \r
51 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
52 */\r
53 string(float r) BotName =\r
54 {\r
55         self.b_num = r;\r
56         if (r == 1)\r
57         {\r
58                 self.playermodel = "models/player/visitant.zym";\r
59                 self.playerskin = "0";\r
60                 return "Visitant";\r
61         }\r
62         else if (r == 2)\r
63         {\r
64                 self.playermodel = "models/player/marine.zym";\r
65                 self.playerskin = "0";\r
66                 return "Marine";\r
67         }\r
68         else if (r == 3)\r
69         {\r
70                 self.playermodel = "models/player/specop.zym";\r
71                 self.playerskin = "0";\r
72                 return "Specop";\r
73         }\r
74         else if (r == 4)\r
75         {\r
76                 self.playermodel = "models/player/nexus.zym";\r
77                 self.playerskin = "0";\r
78                 return "Nexus";\r
79         }\r
80         else if (r == 5)\r
81         {\r
82                 self.playermodel = "models/player/skadi.zym";\r
83                 self.playerskin = "0";\r
84                 return "Skadi";\r
85         }\r
86         else if (r == 6)\r
87         {\r
88                 self.playermodel = "models/player/lurk.zym";\r
89                 self.playerskin = "0";\r
90                 return "Lurk";\r
91         }\r
92         else if (r == 7)\r
93         {\r
94                 self.playermodel = "models/player/headhunter.zym";\r
95                 self.playerskin = "0";\r
96                 return "HeadHunter";\r
97         }\r
98         else if (r == 8)\r
99         {\r
100                 self.playermodel = "models/player/carni.zym";\r
101                 self.playerskin = "0";\r
102                 return "Carni";\r
103         }\r
104         else if (r == 9)\r
105         {\r
106                 self.playermodel = "models/player/grunt.zym";\r
107                 self.playerskin = "0";\r
108                 return "Grunt";\r
109         }\r
110         else if (r == 10)\r
111         {\r
112                 self.playermodel = "models/player/insurrectionist.zym";\r
113                 self.playerskin = "0";\r
114                 return "Insurrectionist";\r
115         }\r
116         else if (r == 11)\r
117         {\r
118                 self.playermodel = "models/player/jeandarc.zym";\r
119                 self.playerskin = "0";\r
120                 return "Jeandarc";\r
121         }\r
122         else if (r == 12)\r
123         {\r
124                 self.playermodel = "models/player/lycanthrope.zym";\r
125                 self.playerskin = "0";\r
126                 return "Lycanthrope";\r
127         }\r
128         else if (r == 13)\r
129         {\r
130                 self.playermodel = "models/player/pyria.zym";\r
131                 self.playerskin = "0";\r
132                 return "Pyria";\r
133         }\r
134         else if (r == 14)\r
135         {\r
136                 self.playermodel = "models/player/shock.zym";\r
137                 self.playerskin = "0";\r
138                 return "Shock";\r
139         }\r
140         else if (r == 15)\r
141         {\r
142                 self.playermodel = "models/player/marine.zym";\r
143                 self.playerskin = "1";\r
144                 return "Private";\r
145         }\r
146         else if (r == 16)\r
147         {\r
148                 self.playermodel = "models/player/nexus.zym";\r
149                 self.playerskin = "1";\r
150                 return "Mulder";\r
151         }\r
152         else if (r == 17)\r
153         {\r
154                 self.playermodel = "models/player/skadi.zym";\r
155                 self.playerskin = "1";\r
156                 return "Elite";\r
157         }\r
158         else if (r == 18)\r
159         {\r
160                 self.playermodel = "models/player/lurk.zym";\r
161                 self.playerskin = "1";\r
162                 return "Reptile";\r
163         }\r
164         else if (r == 19)\r
165         {\r
166                 self.playermodel = "models/player/crash.zym";\r
167                 self.playerskin = "2";\r
168                 return "mechanical";\r
169         }\r
170         else if (r == 20)\r
171         {\r
172                 self.playermodel = "models/player/crash.zym";\r
173                 self.playerskin = "1";\r
174                 return "Quark";\r
175         }\r
176         else if (r == 21)\r
177         {\r
178                 self.playermodel = "models/player/insurrectionist.zym";\r
179                 self.playerskin = "1";\r
180                 return "Anarchist";\r
181         }\r
182         else if (r == 22)\r
183         {\r
184                 self.playermodel = "models/player/jeandarc.zym";\r
185                 self.playerskin = "1";\r
186                 return "Heroine";\r
187         }\r
188         else if (r == 23)\r
189         {\r
190                 self.playermodel = "models/player/lycanthrope.zym";\r
191                 self.playerskin = "1";\r
192                 return "Wolf";\r
193         }\r
194         else if (r == 24)\r
195         {\r
196                 self.playermodel = "models/player/pyria.zym";\r
197                 self.playerskin = "1";\r
198                 return "Soldier";\r
199         }\r
200         else if (r == 25)\r
201         {\r
202                 self.playermodel = "models/player/rebel.zym";\r
203                 self.playerskin = "0";\r
204                 return "Rebel";\r
205         }\r
206         else\r
207         {\r
208                 self.playermodel = "models/player/crash.zym";\r
209                 self.playerskin = "0";\r
210                 return "Crash";\r
211         }\r
212 \r
213 };\r
214 string () PickARandomName =\r
215 {\r
216         if (bot_count > 16)\r
217                 return "player";\r
218 \r
219         local float y, test;\r
220         local string h;\r
221         local entity t;\r
222         y = TRUE;\r
223         while(y)\r
224         {\r
225                 test = ceil(random() * 16);\r
226                 h = BotName(test);\r
227                 t = find(world, netname, h);\r
228                 if (t == world)\r
229                         y = FALSE;\r
230         }\r
231         return h;\r
232 };\r
233 \r
234 \r
235 \r
236 // I didn't like the old code so this is very stripped down\r
237 \r
238 entity b_originator;\r
239 float b_topic;\r
240 /* FBX Topics\r
241 \r
242 b_originator == self\r
243  1 - sign on\r
244  2 - killed targ\r
245  3 - team message "friendly eyes"\r
246  4 - team message "on your back"\r
247  5 - team message "need back up"\r
248  6 - excuses\r
249  ----\r
250  7 - gameover\r
251  ----\r
252  8 - welcoming someone onto server\r
253  9 - ridicule lost frag (killed self?)\r
254  10 - ridicule lost frag (lava)\r
255  11 - lag\r
256 b_originator == targ\r
257 \r
258 \r
259 */\r
260 void(float tpic) bot_start_topic =\r
261 {\r
262         if (random() < 0.2)\r
263         {\r
264                 b_topic = tpic;\r
265                 b_originator = self;\r
266         }\r
267         else\r
268                 b_topic = 0;\r
269 };\r
270 \r
271 /*\r
272 void() bot_chat =\r
273 {\r
274         local float r;\r
275         if (b_options & OPT_NOCHAT)\r
276                 return;\r
277         r = ceil (random() * 6);\r
278 \r
279         if (self.b_chattime > time)\r
280         {\r
281                 if (self.b_skill < 2)\r
282                         self.keys = self.button0 = self.button2 = 0;\r
283                 return;\r
284         }\r
285         else if (self.b_chattime)\r
286         {\r
287                 if (b_topic == 1)\r
288                 {\r
289                         if (b_originator == self)\r
290                         {\r
291                                 if (r == 1)\r
292                                 {\r
293                                         BotSay(": lo all\n");\r
294                                         bot_start_topic(8);\r
295                                 }\r
296                                 else if (r == 2)\r
297                                 {\r
298                                         BotSay(": hey everyone\n");\r
299                                         bot_start_topic(8);\r
300                                 }\r
301                                 else if (r == 3)\r
302                                 {\r
303                                         BotSay(": prepare to be fragged!\n");\r
304                                         bot_start_topic(0);\r
305                                 }\r
306                                 else if (r == 4)\r
307                                 {\r
308                                         BotSay(": boy this is laggy\n");\r
309                                         bot_start_topic(11);\r
310                                 }\r
311                                 else if (r == 5)\r
312                                 {\r
313                                         BotSay(": #mm getting some lag here\n");\r
314                                         bot_start_topic(11);\r
315                                 }\r
316                                 else\r
317                                 {\r
318                                         BotSay(": hi everyone\n");\r
319                                         bot_start_topic(8);\r
320                                 }\r
321                         }\r
322                 }\r
323                 else if (b_topic == 2)\r
324                 {\r
325                         if (b_originator == self)\r
326                         {\r
327                                 if (r == 1)\r
328                                         BotSay(": take that\n");\r
329                                 else if (r == 2)\r
330                                         BotSay(": yehaww!\n");\r
331                                 else if (r == 3)\r
332                                         BotSay(": wh00p\n");\r
333                                 else if (r == 4)\r
334                                         BotSay(": j00_sawk();\n");\r
335                                 else if (r == 5)\r
336                                         BotSay(": i rule\n");\r
337                                 else\r
338                                         BotSay(": eat that\n");\r
339                                 bot_start_topic(0);\r
340                         }\r
341                 }\r
342                 else if (b_topic == 3)\r
343                 {\r
344                         if (b_originator == self)\r
345                         {\r
346                                 if (r < 3)\r
347                                         BotSayTeam(": friendly eyes\n");\r
348                                 else\r
349                                         BotSayTeam(": team eyes\n");\r
350                                 bot_start_topic(0);\r
351                         }\r
352                 }\r
353                 else if (b_topic == 4)\r
354                 {\r
355                         if (b_originator == self)\r
356                         {\r
357                                 if (r < 3)\r
358                                         BotSayTeam(": on your back\n");\r
359                                 else\r
360                                         BotSayTeam(": I'm with you\n");\r
361                                 bot_start_topic(0);\r
362                         }\r
363                 }\r
364                 else if (b_topic == 5)\r
365                 {\r
366                         if (b_originator == self)\r
367                         {\r
368                                 if (r < 3)\r
369                                         BotSayTeam(": I need help\n");\r
370                                 else\r
371                                         BotSayTeam(": need backup\n");\r
372                                 bot_start_topic(0);\r
373                         }\r
374                 }\r
375                 else if (b_topic == 6)\r
376                 {\r
377                         if (b_originator == self)\r
378                         {\r
379                                 if (r == 1)\r
380                                 {\r
381                                         BotSay(": sun got in my eyes\n");\r
382                                         bot_start_topic(0);\r
383                                 }\r
384                                 else if (r == 2)\r
385                                 {\r
386                                         BotSay(": mouse needs cleaning\n");\r
387                                         bot_start_topic(0);\r
388                                 }\r
389                                 else if (r == 3)\r
390                                 {\r
391                                         BotSay(": i meant to do that\n");\r
392                                         bot_start_topic(0);\r
393                                 }\r
394                                 else if (r == 4)\r
395                                 {\r
396                                         BotSay(": lag\n");\r
397                                         bot_start_topic(11);\r
398                                 }\r
399                                 else if (r == 5)\r
400                                 {\r
401                                         BotSay(": killer lag\n");\r
402                                         bot_start_topic(11);\r
403                                 }\r
404                                 else\r
405                                 {\r
406                                         BotSay(": 100% lag\n");\r
407                                         bot_start_topic(11);\r
408                                 }\r
409                         }\r
410                 }\r
411                 else if (b_topic == 7)\r
412                 {\r
413                         if (r == 1)\r
414                                 BotSay(": gg\n");\r
415                         else if (r == 2)\r
416                                 BotSay(": gg all\n");\r
417                         else if (r == 3)\r
418                                 BotSay(": that was fun\n");\r
419                         else if (r == 4)\r
420                                 BotSay(": good game\n");\r
421                         else if (r == 5)\r
422                                 BotSay(": pah\n");\r
423                         else\r
424                                 BotSay(": hrm\n");\r
425                         bot_start_topic(0);\r
426                 }\r
427                 else if (b_topic == 8)\r
428                 {\r
429                         if (b_originator != self)\r
430                         {\r
431                                 if (r == 1)\r
432                                 {\r
433                                         BotSay(": heya\n");\r
434                                         bot_start_topic(0);\r
435                                 }\r
436                                 else if (r == 2)\r
437                                 {\r
438                                         BotSay(": welcome\n");\r
439                                         bot_start_topic(0);\r
440                                 }\r
441                                 else if (r == 3)\r
442                                 {\r
443                                         BotSayInit();\r
444                                         BotSay2(": hi ");\r
445                                         BotSay2(b_originator.netname);\r
446                                         BotSay2("\n");\r
447                                         bot_start_topic(0);\r
448                                 }\r
449                                 else if (r == 4)\r
450                                 {\r
451                                         BotSayInit();\r
452                                         BotSay2(": hey ");\r
453                                         BotSay2(b_originator.netname);\r
454                                         BotSay2("\n");\r
455                                         bot_start_topic(0);\r
456                                 }\r
457                                 else if (r == 5)\r
458                                 {\r
459                                         BotSay(": howdy\n");\r
460                                         bot_start_topic(0);\r
461                                 }\r
462                                 else\r
463                                 {\r
464                                         BotSay(": lo\n");\r
465                                         bot_start_topic(0);\r
466                                 }\r
467                         }\r
468                 }\r
469 \r
470                 else if (b_topic == 9)\r
471                 {\r
472                         if (b_originator != self)\r
473                         {\r
474                                 if (r == 1)\r
475                                         BotSay(": hah\n");\r
476                                 else if (r == 2)\r
477                                         BotSay(": heheh\n");\r
478                                 else if (r == 3)\r
479                                 {\r
480                                         BotSayInit();\r
481                                         BotSay2(": good work ");\r
482                                         BotSay2(b_originator.netname);\r
483                                         BotSay2("\n");\r
484                                 }\r
485                                 else if (r == 4)\r
486                                 {\r
487                                         BotSayInit();\r
488                                         BotSay2(": nice1 ");\r
489                                         BotSay2(b_originator.netname);\r
490                                         BotSay2("\n");\r
491                                 }\r
492                                 else if (r == 5)\r
493                                         BotSay(": lol\n");\r
494                                 else\r
495                                         BotSay(": :)\n");\r
496                                 b_topic = 6;\r
497                         }\r
498                 }\r
499                 else if (b_topic == 10)\r
500                 {\r
501                         if (b_originator != self)\r
502                         {\r
503                                 if (r == 1)\r
504                                         BotSay(": have a nice dip?\n");\r
505                                 else if (r == 2)\r
506                                         BotSay(": bah I hate levels with lava\n");\r
507                                 else if (r == 3)\r
508                                 {\r
509                                         BotSayInit();\r
510                                         BotSay2(": good job ");\r
511                                         BotSay2(b_originator.netname);\r
512                                         BotSay2("\n");\r
513                                 }\r
514                                 else if (r == 4)\r
515                                 {\r
516                                         BotSayInit();\r
517                                         BotSay2(": nice backflip ");\r
518                                         BotSay2(b_originator.netname);\r
519                                         BotSay2("\n");\r
520                                 }\r
521                                 else if (r == 5)\r
522                                         BotSay(": watch your step\n");\r
523                                 else\r
524                                         BotSay(": hehe\n");\r
525                                 b_topic = 6;\r
526                         }\r
527                 }\r
528 \r
529                 else if (b_topic == 11)\r
530                 {\r
531                         if (b_originator != self)\r
532                         {\r
533                                 if (r == 1)\r
534                                 {\r
535                                         BotSayInit();\r
536                                         BotSay2(": yeah right ");\r
537                                         BotSay2(b_originator.netname);\r
538                                         BotSay2("\n");\r
539                                         bot_start_topic(0);\r
540                                 }\r
541                                 else if (r == 2)\r
542                                 {\r
543                                         BotSay(": ping\n");\r
544                                         bot_start_topic(0);\r
545                                 }\r
546                                 else if (r == 3)\r
547                                 {\r
548                                         BotSay(": shuddup, you're an lpb\n");\r
549                                         bot_start_topic(0);\r
550                                 }\r
551                                 else if (r == 4)\r
552                                 {\r
553                                         BotSay(": lag my eye\n");\r
554                                         bot_start_topic(0);\r
555                                 }\r
556                                 else if (r == 5)\r
557                                 {\r
558                                         BotSay(": yeah\n");\r
559                                         bot_start_topic(11);\r
560                                 }\r
561                                 else\r
562                                 {\r
563                                         BotSay(": totally\n");\r
564                                         bot_start_topic(11);\r
565                                 }\r
566                         }\r
567                 }\r
568                 self.b_chattime = 0;\r
569         }\r
570         else if (b_topic)\r
571         {\r
572                 if (random() < 0.5)\r
573                 {\r
574                         if (self == b_originator)\r
575                         {\r
576                                 if (b_topic <= 7)\r
577                                         self.b_chattime = time + 2;\r
578                         }\r
579                         else\r
580                         {\r
581                                 if (b_topic >= 7)\r
582                                         self.b_chattime = time + 2;\r
583                         }\r
584                 }\r
585         }\r
586 };\r
587 */\r
588 \r
589 /*\r
590 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
591 \r
592 Kick A Bot.\r
593 \r
594 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
595 */\r
596 \r
597 void() KickABot =\r
598 {\r
599         local entity ty;\r
600         ty = find(world, classname, "player");\r
601         while (ty != world)\r
602         {\r
603                 if (!(ty.ishuman))\r
604                 {\r
605 \r
606                         BotDisconnect(ty);\r
607                         ty.ishuman = TRUE;\r
608                         ty = world;\r
609                 }\r
610                 else\r
611                         ty = find(ty, classname, "player");\r
612         }\r
613 \r
614 };\r
615 \r
616 \r
617 /*\r
618 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
619 \r
620 Simplified origin checking.\r
621 \r
622 God, I wish I had inline\r
623 \r
624 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
625 */\r
626 \r
627 vector(entity ent) realorigin =\r
628 {\r
629 // even more simplified...\r
630         return (ent.absmin + ent.absmax) * 0.5;\r
631 };\r
632 \r
633 /*\r
634 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
635 \r
636 fisible\r
637 \r
638 a version of visible that checks for corners\r
639 of the bounding boxes\r
640 \r
641 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
642 */\r
643 \r
644 float (entity targ) fisible =\r
645 {\r
646         local vector    spot1, org;\r
647         local float thruwater, pc1, pc2;\r
648 \r
649         org = realorigin(targ);\r
650         spot1 = self.origin + self.view_ofs;\r
651 \r
652         if (targ.solid == SOLID_BSP)\r
653         {\r
654                 traceline (spot1, org, TRUE, self);\r
655                 if (trace_ent == targ)\r
656                         return TRUE;\r
657                 else if (trace_fraction == 1)\r
658                         return TRUE;\r
659                 return FALSE;\r
660         }\r
661         else\r
662         {\r
663                 pc1 = pointcontents(org);\r
664                 pc2 = pointcontents(spot1);\r
665                 if (targ.classname == "player")\r
666                         thruwater = FALSE;\r
667                 else if (pc1 == CONTENT_LAVA)\r
668                         return FALSE;\r
669                 else\r
670                         thruwater = TRUE;\r
671         }\r
672 \r
673         if (pc1 < -1) // targ's origin is in water or other liquid\r
674         {\r
675                 if (pc2 != pc1)\r
676                 {\r
677                         // look for their head\r
678                         traceline (spot1, org + targ.mins, TRUE, self);\r
679                         // cross the water check\r
680                         if (trace_inopen)\r
681                                 if (trace_inwater)\r
682                                         if (!thruwater)\r
683                                                 return FALSE;\r
684                         if (trace_ent == targ)\r
685                                 return TRUE;\r
686                         else if (trace_fraction == 1)\r
687                                 return TRUE;\r
688                         return FALSE;\r
689                 }\r
690         }\r
691         else\r
692         {\r
693                 if (pc2 != pc1)\r
694                 {\r
695                         traceline (spot1, org + targ.maxs, TRUE, self);\r
696                         if (trace_inopen)\r
697                                 if (trace_inwater)\r
698                                         if (!thruwater)\r
699                                                 return FALSE;\r
700                         if (trace_ent == targ)\r
701                                 return TRUE;\r
702                         else if (trace_fraction == 1)\r
703                                 return TRUE;\r
704                         return FALSE;\r
705                 }\r
706         }\r
707         traceline (spot1, org, TRUE, self);\r
708         if (trace_ent == targ)\r
709                 return TRUE;\r
710         else if (trace_fraction == 1)\r
711                 return TRUE;\r
712         traceline (spot1, org + targ.maxs, TRUE, self);\r
713         if (trace_ent == targ)\r
714                 return TRUE;\r
715         else if (trace_fraction == 1)\r
716                 return TRUE;\r
717         traceline (spot1, org + targ.mins, TRUE, self);\r
718         if (trace_ent == targ)\r
719                 return TRUE;\r
720         else if (trace_fraction == 1)\r
721                 return TRUE;\r
722         return FALSE;\r
723 };\r
724 \r
725 \r
726 /*\r
727 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
728 \r
729 Wisible\r
730 \r
731 goes through movable brushes/entities, used\r
732 for waypoints\r
733 \r
734 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
735 */\r
736 \r
737 // this is used for waypoint stuff....\r
738 float (entity targ1, entity targ2) wisible =\r
739 {\r
740         local vector    spot1, spot2;\r
741         local entity ignore;\r
742 \r
743         spot1 = targ1.origin;\r
744         spot2 = realorigin(targ2);\r
745 \r
746         ignore = self;\r
747         do\r
748         {\r
749                 traceline (spot1, spot2, TRUE, ignore);\r
750                 spot1 = realorigin(trace_ent);\r
751                 ignore = trace_ent;\r
752         } while ((trace_ent != world) && (trace_fraction != 1));\r
753         if (trace_endpos == spot2)\r
754                 return TRUE;\r
755         else\r
756                 return FALSE;\r
757 };\r
758 \r
759 \r
760 /*\r
761 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
762 \r
763 sisible\r
764 \r
765 Now this is getting ridiculous. Simple visible,\r
766 used when we need just a simple traceline nothing else\r
767 \r
768 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
769 */\r
770 \r
771 float (entity targ) sisible =\r
772 {\r
773         traceline (self.origin, targ.origin, TRUE, self);\r
774         if (trace_ent == targ)\r
775                 return TRUE;\r
776         else if (trace_fraction == 1)\r
777                 return TRUE;\r
778         return FALSE;\r
779 };\r
780 /*\r
781 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
782 \r
783 angcomp\r
784 \r
785 subtracts one angle from another\r
786 \r
787 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
788 */\r
789 \r
790 float (float y1, float y2) angcomp =\r
791 {\r
792         y1 = frik_anglemod(y1);\r
793         y2 = frik_anglemod(y2);\r
794 \r
795         local float answer;\r
796         answer = y1 - y2;\r
797         if (answer > 180)\r
798                 answer = (360 - answer) * -1;\r
799         else if (answer < -180)\r
800                 answer = answer + 360;\r
801         return answer;\r
802 };\r
803 \r
804 /*\r
805 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
806 \r
807 fov\r
808 \r
809 is the entity in the bot's field of view\r
810 \r
811 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
812 */\r
813 float (entity targ) fov =\r
814 {\r
815         local vector yawn;\r
816         local float g;\r
817         yawn = realorigin(targ);\r
818         yawn = (yawn + targ.view_ofs) - (self.origin + self.view_ofs);\r
819         yawn = normalize(yawn);\r
820         yawn = vectoangles(yawn);\r
821         g = angcomp(self.v_angle_x, yawn_x);\r
822         if (fabs(g) > 45)\r
823                 return FALSE;\r
824         g = angcomp(self.v_angle_y, yawn_y);\r
825         if (fabs(g) > 60)\r
826                 return FALSE;\r
827 \r
828         return TRUE;\r
829 };\r
830 \r
831 /*\r
832 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
833 \r
834 frik_anglemod\r
835 \r
836 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
837 */\r
838 float(float v) frik_anglemod =\r
839 {\r
840         return v - floor(v/360) * 360;\r
841 };