]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/g_world.c
Added new GameC with class selection and random class selection working
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / g_world.c
1 entity  lastspawn;\r
2 \r
3 void() dom_init;\r
4 \r
5 void worldspawn (void)\r
6 {\r
7         lastspawn = world;\r
8 \r
9         // the gravity set here can be overwritten by <mapname>.cfg\r
10         if(world.gravity)\r
11         {\r
12                 cvar_set("sv_gravity", ftos(world.gravity));\r
13         }\r
14         else\r
15                 cvar_set("sv_gravity", "800");\r
16 \r
17         game = cvar ("gamecfg");        // load game options\r
18 \r
19         //precache_model ("progs/beam.mdl");\r
20         precache_model ("progs/beam.mdl");\r
21         precache_model ("models/bullet.mdl");\r
22         precache_model ("models/casing_bronze.mdl");\r
23         precache_model ("models/casing_shell.mdl");\r
24         precache_model ("models/casing_steel.mdl");\r
25         precache_model ("models/ebomb.mdl");\r
26         precache_model ("models/elaser.mdl");\r
27         precache_model ("models/flash.md3");\r
28         precache_model ("models/gibs/bloodyskull.md3");\r
29         precache_model ("models/gibs/chunk.mdl");\r
30         precache_model ("models/gibs/eye.md3");\r
31         precache_model ("models/gibs/gib1.md3");\r
32         precache_model ("models/gibs/gib2.md3");\r
33         precache_model ("models/gibs/gib3.md3");\r
34         precache_model ("models/gibs/gib4.md3");\r
35         precache_model ("models/gibs/gib5.md3");\r
36         precache_model ("models/gibs/gib6.md3");\r
37         precache_model ("models/grenademodel.md3");\r
38         precache_model ("models/hagarmissile.mdl");\r
39         precache_model ("models/items/a_bullets.mdl");\r
40         precache_model ("models/items/a_cells.md3");\r
41         precache_model ("models/items/a_rockets.md3");\r
42         precache_model ("models/items/a_shells.md3");\r
43         precache_model ("models/items/g_a1.md3");\r
44         precache_model ("models/items/g_a25.md3");\r
45         precache_model ("models/items/g_h1.md3");\r
46         precache_model ("models/items/g_h25.md3");\r
47         precache_model ("models/items/g_h100.md3");\r
48         precache_model ("models/items/g_invincible.md3");\r
49         precache_model ("models/items/g_strength.md3");\r
50         precache_model ("models/laser.mdl");\r
51         precache_model ("models/misc/chatbubble.spr");\r
52         precache_model ("models/nexflash.md3");\r
53         precache_model ("models/plasma.mdl");\r
54         precache_model ("models/plasmatrail.mdl");\r
55         precache_model ("models/rocket.md3");\r
56         precache_model ("models/sprites/grenadeexplosion.spr32");\r
57         precache_model ("models/sprites/hagarexplosion.spr32");\r
58         precache_model ("models/sprites/muzzleflash.spr32");\r
59         //precache_model ("models/sprites/plasmahitwall.spr32");\r
60         //precache_model ("models/sprites/plasmashot.spr32");\r
61         precache_model ("models/sprites/rocketexplosion.spr32");\r
62         precache_model ("models/tracer.mdl");\r
63         precache_model ("models/uziflash.md3");\r
64         precache_model ("models/weapons/g_crylink.md3");\r
65         precache_model ("models/weapons/g_electro.md3");\r
66         precache_model ("models/weapons/g_gl.md3");\r
67         precache_model ("models/weapons/g_hagar.md3");\r
68         precache_model ("models/weapons/g_nex.md3");\r
69         precache_model ("models/weapons/g_rl.md3");\r
70         precache_model ("models/weapons/g_shotgun.md3");\r
71         precache_model ("models/weapons/g_uzi.md3");\r
72         precache_model ("models/weapons/v_crylink.md3");\r
73         precache_model ("models/weapons/v_electro.md3");\r
74         precache_model ("models/weapons/v_gl.md3");\r
75         precache_model ("models/weapons/v_hagar.md3");\r
76         precache_model ("models/weapons/v_laser.md3");\r
77         precache_model ("models/weapons/v_nex.md3");\r
78         precache_model ("models/weapons/v_rl.md3");\r
79         precache_model ("models/weapons/v_shotgun.md3");\r
80         precache_model ("models/weapons/v_uzi.md3");\r
81         precache_model ("models/weapons/w_crylink.zym");\r
82         precache_model ("models/weapons/w_electro.zym");\r
83         precache_model ("models/weapons/w_gl.zym");\r
84         precache_model ("models/weapons/w_hagar.zym");\r
85         precache_model ("models/weapons/w_laser.zym");\r
86         precache_model ("models/weapons/w_nex.zym");\r
87         precache_model ("models/weapons/w_rl.zym");\r
88         precache_model ("models/weapons/w_shotgun.zym");\r
89         precache_model ("models/weapons/w_uzi.zym");\r
90 \r
91 \r
92 \r
93         // new weapon models\r
94         precache_model ("models/weapons/v_rli.md3");            // incendiary rockets\r
95         precache_model ("models/weapons/v_flamer.md3");         // flamer\r
96         precache_model ("models/weapons/v_bombletts.md3");      // bombletts\r
97         precache_model ("models/weapons/v_hotbombs.md3");       // hot bombs\r
98         precache_model ("models/weapons/v_grapple.md3");        // grappling hook\r
99         precache_model ("models/weapons/v_namek.md3");          // namek\r
100 \r
101         precache_model ("models/weapons/w_rli.zym");\r
102         precache_model ("models/weapons/w_flamer.zym");\r
103         precache_model ("models/weapons/w_bombletts.zym");\r
104         precache_model ("models/weapons/w_hotbombs.zym");\r
105         precache_model ("models/weapons/w_grapple.zym");\r
106         precache_model ("models/weapons/w_namek.zym");\r
107 \r
108 \r
109         // other stuff\r
110         precache_model ("models/weapons/namekb.mdl");\r
111         precache_sound ("weapons/namek_fire.wav");\r
112 \r
113         precache_model ("models/misc/shield_s.mdl");\r
114 \r
115         precache_model ("models/misc/ropebase.mdl");\r
116 \r
117         // on fire sprites\r
118         precache_model ("models/sprites/fire_base.spr32");\r
119         precache_model ("models/sprites/fire_top.spr32");\r
120 \r
121         precache_model ("models/sprites/null.spr");\r
122 \r
123 \r
124         precache_sound ("announcer/1fragleft.wav");\r
125         precache_sound ("announcer/1minuteremains.wav");\r
126         precache_sound ("announcer/2fragsleft.wav");\r
127         precache_sound ("announcer/3fragsleft.wav");\r
128         precache_sound ("announcer/welcometonexuiz.wav");\r
129         precache_sound ("misc/armor1.wav");\r
130         precache_sound ("misc/armor25.wav");\r
131         precache_sound ("misc/armorimpact.wav");\r
132         precache_sound ("misc/bodyimpact1.wav");\r
133         precache_sound ("misc/bodyimpact2.wav");\r
134         precache_sound ("misc/gib.wav");\r
135         precache_sound ("misc/gib_splat01.wav");\r
136         precache_sound ("misc/gib_splat02.wav");\r
137         precache_sound ("misc/gib_splat03.wav");\r
138         precache_sound ("misc/gib_splat04.wav");\r
139         //precache_sound ("misc/h2ohit.wav");\r
140         precache_sound ("misc/hit.wav");\r
141         precache_sound ("misc/hitground1.wav");\r
142         precache_sound ("misc/hitground2.wav");\r
143         precache_sound ("misc/hitground3.wav");\r
144         precache_sound ("misc/hitground4.wav");\r
145         precache_sound ("misc/itempickup.wav");\r
146         precache_sound ("misc/itemrespawn.wav");\r
147         precache_sound ("misc/jumppad.wav");\r
148         precache_sound ("misc/mediumhealth.wav");\r
149         precache_sound ("misc/megahealth.wav");\r
150         precache_sound ("misc/minihealth.wav");\r
151         precache_sound ("misc/powerup.wav");\r
152         precache_sound ("misc/talk.wav");\r
153         precache_sound ("misc/teleport.wav");\r
154         precache_sound ("plats/medplat1.wav");\r
155         precache_sound ("plats/medplat2.wav");\r
156         precache_sound ("player/lava.wav");\r
157         precache_sound ("player/slime.wav");\r
158         precache_sound ("weapons/crylink.wav");\r
159         precache_sound ("weapons/crylink2.wav");\r
160         precache_sound ("weapons/electro_fire.wav");\r
161         precache_sound ("weapons/electro_fly.wav");\r
162         precache_sound ("weapons/electro_impact.wav");\r
163         precache_sound ("weapons/grenade_bounce.wav");\r
164         precache_sound ("weapons/grenade_fire.wav");\r
165         precache_sound ("weapons/grenade_impact.wav");\r
166         precache_sound ("weapons/hagar_fire.wav");\r
167         precache_sound ("weapons/hagexp1.wav");\r
168         precache_sound ("weapons/hagexp2.wav");\r
169         precache_sound ("weapons/hagexp3.wav");\r
170         precache_sound ("weapons/lasergun_fire.wav");\r
171         precache_sound ("weapons/laserimpact.wav");\r
172         precache_sound ("weapons/nexfire.wav");\r
173         precache_sound ("weapons/neximpact.wav");\r
174         precache_sound ("weapons/ric1.wav");\r
175         precache_sound ("weapons/ric2.wav");\r
176         precache_sound ("weapons/ric3.wav");\r
177         precache_sound ("weapons/rocket_fire.wav");\r
178         precache_sound ("weapons/rocket_fly.wav");\r
179         precache_sound ("weapons/rocket_impact.wav");\r
180         precache_sound ("weapons/shotgun_fire.wav");\r
181         precache_sound ("weapons/shotgun_reload.wav");\r
182         precache_sound ("weapons/tink1.wav");\r
183         precache_sound ("weapons/uzi_fire.wav");\r
184         precache_sound ("weapons/weapon_switch.wav");\r
185         precache_sound ("weapons/weaponpickup.wav");\r
186         precache_sound ("weapons/flamer.wav");\r
187         // TF SOUNDS & MODELS\r
188         precache_sound ("weapons/prime.wav");\r
189         precache_sound ("weapons/gren.wav");\r
190         precache_sound ("weapons/bounce.wav");\r
191 //      precache_sound ("player/step1l.wav");\r
192         precache_sound ("weapons/throw.wav");\r
193         precache_model ("progs/hgren2.mdl");\r
194         precache_model ("models/ammo/grenade/grenade.md3");\r
195         precache_model ("models/grenades/fragnade.md3");\r
196 \r
197         // plays music for the level if there is any\r
198         if (self.noise)\r
199         {\r
200                 precache_sound (self.noise);\r
201                 ambientsound ('0 0 0', self.noise, 1.00, ATTN_NONE);\r
202         }\r
203 \r
204                 // 0 normal\r
205         lightstyle(0, "m");\r
206 \r
207         // 1 FLICKER (first variety)\r
208         lightstyle(1, "mmnmmommommnonmmonqnmmo");\r
209 \r
210         // 2 SLOW STRONG PULSE\r
211         lightstyle(2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba");\r
212 \r
213         // 3 CANDLE (first variety)\r
214         lightstyle(3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg");\r
215 \r
216         // 4 FAST STROBE\r
217         lightstyle(4, "mamamamamama");\r
218 \r
219         // 5 GENTLE PULSE 1\r
220         lightstyle(5,"jklmnopqrstuvwxyzyxwvutsrqponmlkj");\r
221 \r
222         // 6 FLICKER (second variety)\r
223         lightstyle(6, "nmonqnmomnmomomno");\r
224 \r
225         // 7 CANDLE (second variety)\r
226         lightstyle(7, "mmmaaaabcdefgmmmmaaaammmaamm");\r
227 \r
228         // 8 CANDLE (third variety)\r
229         lightstyle(8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa");\r
230 \r
231         // 9 SLOW STROBE (fourth variety)\r
232         lightstyle(9, "aaaaaaaazzzzzzzz");\r
233 \r
234         // 10 FLUORESCENT FLICKER\r
235         lightstyle(10, "mmamammmmammamamaaamammma");\r
236 \r
237         // 11 SLOW PULSE NOT FADE TO BLACK\r
238         lightstyle(11, "abcdefghijklmnopqrrqponmlkjihgfedcba");\r
239 \r
240         // styles 32-62 are assigned by the light program for switchable lights\r
241 \r
242         // 63 testing\r
243         lightstyle(63, "a");\r
244 \r
245         if (cvar("g_domination"))\r
246                 dom_init();\r
247 }\r
248 \r
249 /* // spawn redirect function; doesn't work!\r
250 entity spawn()\r
251 {\r
252         entity e;\r
253         e = spawn_real();\r
254         e.create_time = time;\r
255         return e;\r
256 }*/\r
257 \r
258 void light (void)\r
259 {\r
260         makestatic (self);\r
261 }\r
262 \r
263 \r
264 // reads and alters data/maplist.cfg (sliding it one line), and returns a\r
265 // strzoned string containing the next map\r
266 #define MAPLIST "maplist.cfg"\r
267 string() Nex_RotateMapList =\r
268 {\r
269         local float lHandle;\r
270         local string lNextMap;\r
271         local string lCurrentMap;\r
272         local string lBuffer;\r
273 \r
274         lHandle = fopen( MAPLIST, FILE_READ );\r
275         if( lHandle < 0 ) {\r
276                 fclose( lHandle );\r
277                 // restart the current map if no other map is not found\r
278                 return strzone( mapname );\r
279         }\r
280 \r
281         // get the first line that will be moved to the end later\r
282         lCurrentMap = strzone( fgets( lHandle ) );\r
283         if( !lCurrentMap ) {\r
284                 fclose( lHandle );\r
285                 // restart the current map if no other map is not found\r
286                 return strzone( mapname );\r
287         }\r
288 \r
289         // now get the second line which is the map that should be loaded next\r
290         lBuffer = fgets( lHandle );\r
291         // if there isnt a second line, nothing needs to be rotated\r
292         if( !lBuffer ) {\r
293                 fclose( lHandle );\r
294                 strunzone( lCurrentMap );\r
295                 // restart the current map if no other map is not found\r
296                 return strzone( mapname );\r
297         }\r
298 \r
299         // since lBuffer holds the next map, it is assigned to nextmap\r
300         lNextMap = strzone( lBuffer );\r
301 \r
302         // since fgets uses its own buffer we need to move lBuffer to a tempstring\r
303         // before reading the next line (or lBuffer will be lost)\r
304         lBuffer = strcat( lBuffer );\r
305 \r
306         // read in the rest of the list\r
307         while( 1 )  {\r
308                 local string lLine;\r
309 \r
310                 lLine = fgets( lHandle );\r
311                 if( !lLine ) {\r
312                         break;\r
313                 }\r
314 \r
315                 lBuffer = strcat( lBuffer, "\n", lLine );\r
316         }\r
317         // rotate the list\r
318         lBuffer = strcat( lBuffer, "\n", lCurrentMap );\r
319 \r
320         // dismiss lCurrentmap now\r
321         strunzone( lCurrentMap );\r
322 \r
323         // and close the file handle\r
324         fclose( lHandle );\r
325 \r
326         // open the maplist for output this one\r
327         lHandle = fopen( MAPLIST, FILE_WRITE );\r
328         if( lHandle < 0 ) {\r
329                 // this shouldnt happen!\r
330                 // print a warning/error message\r
331                 dprint( "Couldn't open ", MAPLIST, " for output!\n" );\r
332 \r
333                 strunzone( lNextMap );\r
334 \r
335                 // we return the currently running map\r
336                 return strzone( mapname );\r
337         }\r
338 \r
339         fputs( lHandle, lBuffer );\r
340 \r
341         fclose( lHandle );\r
342 \r
343         return lNextMap;\r
344 };\r
345 \r
346 float gameover;\r
347 float intermission_running;\r
348 //float intermission_exittime;\r
349 float alreadychangedlevel;\r
350 \r
351 \r
352 void() GotoNextMap =\r
353 {\r
354         local string nextmap;\r
355         //local float n, nummaps;\r
356         //local string s;\r
357         if (alreadychangedlevel)\r
358                 return;\r
359         alreadychangedlevel = TRUE;\r
360         if (cvar("samelevel"))  // if samelevel is set, stay on same level\r
361                 changelevel (mapname);\r
362         else\r
363         {\r
364                 // method 1\r
365 \r
366                 //local entity pos;\r
367                 local float fh;\r
368                 local string line;\r
369 \r
370                 // restart current map if no cycle is found\r
371                 nextmap = strzone(mapname);\r
372                 fh = fopen("maplist.cfg", FILE_READ);\r
373                 if (fh >= 0)\r
374                 {\r
375                         while (1)\r
376                         {\r
377                                 line = fgets(fh);\r
378                                 if (nextmap == mapname)\r
379                                 {\r
380                                         strunzone(nextmap);\r
381                                         nextmap = strzone(line);\r
382                                 }\r
383                                 if (!line)\r
384                                         break;\r
385                                 if (line == mapname)\r
386                                 {\r
387                                         line = fgets(fh);\r
388                                         if (!line)\r
389                                                 break;\r
390                                         strunzone(nextmap);\r
391                                         nextmap = strzone(line);\r
392                                         break;\r
393                                 }\r
394                         }\r
395                         fclose(fh);\r
396                 }\r
397                 changelevel (nextmap);\r
398                 strunzone(nextmap);\r
399 \r
400                 // method 2\r
401                 //nextmap = Nex_RotateMapList();\r
402                 //changelevel (nextmap);\r
403                 //strunzone (nextmap);\r
404                 // method 3\r
405                 /*\r
406                 s = cvar_string("g_maplist");\r
407                 nummaps = tokenize(s);\r
408                 // if no map list, restart current one\r
409                 nextmap = mapname;\r
410                 if (nummaps >= 1)\r
411                 {\r
412                         n = 0;\r
413                         while (n < nummaps)\r
414                         {\r
415                                 if (argv(n) == mapname)\r
416                                         break;\r
417                                 n = n + 1;\r
418                         }\r
419                         n = n + 1;\r
420                         if (n >= nummaps)\r
421                                 n = 0;\r
422                         nextmap = argv(n);\r
423                 }\r
424                 changelevel (nextmap);\r
425                 */\r
426         }\r
427 };\r
428 \r
429 \r
430 /*\r
431 ============\r
432 IntermissionThink\r
433 \r
434 When the player presses attack or jump, change to the next level\r
435 ============\r
436 */\r
437 void() IntermissionThink =\r
438 {\r
439         if (time < intermission_exittime)\r
440                 return;\r
441 \r
442         if (time < intermission_exittime + 10 && !self.button0 && !self.button1 && !self.button2 && !self.button3)\r
443                 return;\r
444 \r
445         GotoNextMap ();\r
446 };\r
447 \r
448 /*\r
449 ============\r
450 FindIntermission\r
451 \r
452 Returns the entity to view from\r
453 ============\r
454 */\r
455 /*\r
456 entity() FindIntermission =\r
457 {\r
458         local   entity spot;\r
459         local   float cyc;\r
460 \r
461 // look for info_intermission first\r
462         spot = find (world, classname, "info_intermission");\r
463         if (spot)\r
464         {       // pick a random one\r
465                 cyc = random() * 4;\r
466                 while (cyc > 1)\r
467                 {\r
468                         spot = find (spot, classname, "info_intermission");\r
469                         if (!spot)\r
470                                 spot = find (spot, classname, "info_intermission");\r
471                         cyc = cyc - 1;\r
472                 }\r
473                 return spot;\r
474         }\r
475 \r
476 // then look for the start position\r
477         spot = find (world, classname, "info_player_start");\r
478         if (spot)\r
479                 return spot;\r
480 \r
481 // testinfo_player_start is only found in regioned levels\r
482         spot = find (world, classname, "testplayerstart");\r
483         if (spot)\r
484                 return spot;\r
485 \r
486 // then look for the start position\r
487         spot = find (world, classname, "info_player_deathmatch");\r
488         if (spot)\r
489                 return spot;\r
490 \r
491         //objerror ("FindIntermission: no spot");\r
492         return world;\r
493 };\r
494 */\r
495 \r
496 /*\r
497 ===============================================================================\r
498 \r
499 RULES\r
500 \r
501 ===============================================================================\r
502 */\r
503 \r
504 /*\r
505 go to the next level for deathmatch\r
506 only called if a time or frag limit has expired\r
507 */\r
508 void() NextLevel =\r
509 {\r
510         gameover = TRUE;\r
511 \r
512         intermission_running = 1;\r
513 \r
514 // enforce a wait time before allowing changelevel\r
515         intermission_exittime = time + 5;\r
516 \r
517         WriteByte (MSG_ALL, SVC_CDTRACK);\r
518         WriteByte (MSG_ALL, 3);\r
519         WriteByte (MSG_ALL, 3);\r
520 \r
521         //pos = FindIntermission ();\r
522 \r
523         other = find (world, classname, "player");\r
524         while (other != world)\r
525         {\r
526                 //other.nextthink = time + 0.5;\r
527                 other.takedamage = DAMAGE_NO;\r
528                 other.solid = SOLID_NOT;\r
529                 other.movetype = MOVETYPE_NONE;\r
530                 other.angles = other.v_angle;\r
531                 other.angles_x = other.angles_x * -1;\r
532                 /*\r
533                 if (pos != world);\r
534                 {\r
535                         other.modelindex = 0;\r
536                         other.weaponentity = world; // remove weapon model\r
537                         other.view_ofs = '0 0 0';\r
538                         other.angles = other.v_angle = pos.mangle;\r
539                         if (!other.angles)\r
540                         {\r
541                                 other.angles = other.v_angle = pos.angles;\r
542                                 other.v_angle_x = other.v_angle_x * -1;\r
543                         }\r
544                         other.fixangle = TRUE;          // turn this way immediately\r
545                         setorigin (other, pos.origin);\r
546                 }\r
547                 */\r
548                 other = find (other, classname, "player");\r
549         }\r
550 \r
551         WriteByte (MSG_ALL, SVC_INTERMISSION);\r
552 };\r
553 \r
554 /*\r
555 ============\r
556 CheckRules_Player\r
557 \r
558 Exit deathmatch games upon conditions\r
559 ============\r
560 */\r
561 void() CheckRules_Player =\r
562 {\r
563         local float fraglimit;\r
564 \r
565         if (gameover)   // someone else quit the game already\r
566                 return;\r
567 \r
568         fraglimit = cvar("fraglimit");\r
569         if (fraglimit && self.frags >= fraglimit)\r
570         {\r
571                 NextLevel ();\r
572                 return;\r
573         }\r
574 };\r
575 \r
576 float checkrules_oneminutewarning;\r
577 float checkrules_leaderfrags;\r
578 entity checkrules_leader;\r
579 \r
580 /*\r
581 ============\r
582 CheckRules_World\r
583 \r
584 Exit deathmatch games upon conditions\r
585 ============\r
586 */\r
587 void() CheckRules_World =\r
588 {\r
589         local float timelimit;\r
590         local float fraglimit;\r
591         local float checkrules_oldleaderfrags;\r
592         local entity checkrules_oldleader;\r
593         local entity head;\r
594 \r
595         if (intermission_running)\r
596         if (time >= intermission_exittime + 60)\r
597         {\r
598                 GotoNextMap();\r
599                 return;\r
600         }\r
601 \r
602         if (gameover)   // someone else quit the game already\r
603                 return;\r
604 \r
605         timelimit = cvar("timelimit") * 60;\r
606         fraglimit = cvar("fraglimit");\r
607 \r
608         if (timelimit && time >= timelimit)\r
609         {\r
610                 NextLevel ();\r
611                 return;\r
612         }\r
613 \r
614         if (!checkrules_oneminutewarning && timelimit && time > timelimit - 60)\r
615         {\r
616                 checkrules_oneminutewarning = TRUE;\r
617                 sound(world, CHAN_AUTO, "announcer/1minuteremains.wav", 1, ATTN_NONE);\r
618         }\r
619 \r
620         checkrules_oldleader = checkrules_leader;\r
621         checkrules_oldleaderfrags = checkrules_leaderfrags;\r
622         checkrules_leaderfrags = 0;\r
623         checkrules_leader = world;\r
624         head = findchain(classname, "player");\r
625         while (head)\r
626         {\r
627                 if (checkrules_leaderfrags < head.frags)\r
628                 {\r
629                         checkrules_leaderfrags = head.frags;\r
630                         checkrules_leader = head;\r
631                 }\r
632                 head = head.chain;\r
633         }\r
634         if (checkrules_leaderfrags <= 0)\r
635         {\r
636                 checkrules_leader = world;\r
637                 checkrules_leaderfrags = 0;\r
638         }\r
639         checkrules_leaderfrags = floor(checkrules_leaderfrags);\r
640         if (checkrules_leaderfrags != checkrules_oldleaderfrags)\r
641         {\r
642                 if (checkrules_leaderfrags == fraglimit - 1)\r
643                         sound(world, CHAN_AUTO, "announcer/1fragleft.wav", 1, ATTN_NONE);\r
644                 else if (checkrules_leaderfrags == fraglimit - 2)\r
645                         sound(world, CHAN_AUTO, "announcer/2fragsleft.wav", 1, ATTN_NONE);\r
646                 else if (checkrules_leaderfrags == fraglimit - 3)\r
647                         sound(world, CHAN_AUTO, "announcer/3fragsleft.wav", 1, ATTN_NONE);\r
648         }\r
649 //      if (checkrules_leader != checkrules_oldleader)// && checkrules_leaderfrags > checkrules_oldleaderfrags)\r
650 //              bprint("^1",checkrules_leader.netname, " has taken the lead with ", ftos(checkrules_leaderfrags), " frags\n");\r
651 };\r
652 \r