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