]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/g_world.c
git-svn-id: svn://svn.icculus.org/nexuiz/trunk@736 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 \r
219 \r
220         // plays music for the level if there is any\r
221         if (self.noise)\r
222         {\r
223                 precache_sound (self.noise);\r
224                 ambientsound ('0 0 0', self.noise, 1.00, ATTN_NONE);\r
225         }\r
226 \r
227                 // 0 normal\r
228         lightstyle(0, "m");\r
229 \r
230         // 1 FLICKER (first variety)\r
231         lightstyle(1, "mmnmmommommnonmmonqnmmo");\r
232 \r
233         // 2 SLOW STRONG PULSE\r
234         lightstyle(2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba");\r
235 \r
236         // 3 CANDLE (first variety)\r
237         lightstyle(3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg");\r
238 \r
239         // 4 FAST STROBE\r
240         lightstyle(4, "mamamamamama");\r
241 \r
242         // 5 GENTLE PULSE 1\r
243         lightstyle(5,"jklmnopqrstuvwxyzyxwvutsrqponmlkj");\r
244 \r
245         // 6 FLICKER (second variety)\r
246         lightstyle(6, "nmonqnmomnmomomno");\r
247 \r
248         // 7 CANDLE (second variety)\r
249         lightstyle(7, "mmmaaaabcdefgmmmmaaaammmaamm");\r
250 \r
251         // 8 CANDLE (third variety)\r
252         lightstyle(8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa");\r
253 \r
254         // 9 SLOW STROBE (fourth variety)\r
255         lightstyle(9, "aaaaaaaazzzzzzzz");\r
256 \r
257         // 10 FLUORESCENT FLICKER\r
258         lightstyle(10, "mmamammmmammamamaaamammma");\r
259 \r
260         // 11 SLOW PULSE NOT FADE TO BLACK\r
261         lightstyle(11, "abcdefghijklmnopqrrqponmlkjihgfedcba");\r
262 \r
263         // styles 32-62 are assigned by the light program for switchable lights\r
264 \r
265         // 63 testing\r
266         lightstyle(63, "a");\r
267 \r
268         if (cvar("g_domination"))\r
269                 dom_init();\r
270 }\r
271 \r
272 /* // spawn redirect function; doesn't work!\r
273 entity spawn()\r
274 {\r
275         entity e;\r
276         e = spawn_real();\r
277         e.create_time = time;\r
278         return e;\r
279 }*/\r
280 \r
281 void light (void)\r
282 {\r
283         makestatic (self);\r
284 }\r
285 \r
286 \r
287 // reads and alters data/maplist.cfg (sliding it one line), and returns a\r
288 // strzoned string containing the next map\r
289 #define MAPLIST "maplist.cfg"\r
290 string() Nex_RotateMapList =\r
291 {\r
292         local float lHandle;\r
293         local string lNextMap;\r
294         local string lCurrentMap;\r
295         local string lBuffer;\r
296 \r
297         lHandle = fopen( MAPLIST, FILE_READ );\r
298         if( lHandle < 0 ) {\r
299                 fclose( lHandle );\r
300                 // restart the current map if no other map is not found\r
301                 return strzone( mapname );\r
302         }\r
303 \r
304         // get the first line that will be moved to the end later\r
305         lCurrentMap = strzone( fgets( lHandle ) );\r
306         if( !lCurrentMap ) {\r
307                 fclose( lHandle );\r
308                 // restart the current map if no other map is not found\r
309                 return strzone( mapname );\r
310         }\r
311 \r
312         // now get the second line which is the map that should be loaded next\r
313         lBuffer = fgets( lHandle );\r
314         // if there isnt a second line, nothing needs to be rotated\r
315         if( !lBuffer ) {\r
316                 fclose( lHandle );\r
317                 strunzone( lCurrentMap );\r
318                 // restart the current map if no other map is not found\r
319                 return strzone( mapname );\r
320         }\r
321 \r
322         // since lBuffer holds the next map, it is assigned to nextmap\r
323         lNextMap = strzone( lBuffer );\r
324 \r
325         // since fgets uses its own buffer we need to move lBuffer to a tempstring\r
326         // before reading the next line (or lBuffer will be lost)\r
327         lBuffer = strcat( lBuffer );\r
328 \r
329         // read in the rest of the list\r
330         while( 1 )  {\r
331                 local string lLine;\r
332 \r
333                 lLine = fgets( lHandle );\r
334                 if( !lLine ) {\r
335                         break;\r
336                 }\r
337 \r
338                 lBuffer = strcat( lBuffer, "\n", lLine );\r
339         }\r
340         // rotate the list\r
341         lBuffer = strcat( lBuffer, "\n", lCurrentMap );\r
342 \r
343         // dismiss lCurrentmap now\r
344         strunzone( lCurrentMap );\r
345 \r
346         // and close the file handle\r
347         fclose( lHandle );\r
348 \r
349         // open the maplist for output this one\r
350         lHandle = fopen( MAPLIST, FILE_WRITE );\r
351         if( lHandle < 0 ) {\r
352                 // this shouldnt happen!\r
353                 // print a warning/error message\r
354                 dprint( "Couldn't open ", MAPLIST, " for output!\n" );\r
355 \r
356                 strunzone( lNextMap );\r
357 \r
358                 // we return the currently running map\r
359                 return strzone( mapname );\r
360         }\r
361 \r
362         fputs( lHandle, lBuffer );\r
363 \r
364         fclose( lHandle );\r
365 \r
366         return lNextMap;\r
367 };\r
368 \r
369 float gameover;\r
370 float intermission_running;\r
371 //float intermission_exittime;\r
372 float alreadychangedlevel;\r
373 \r
374 \r
375 void() GotoNextMap =\r
376 {\r
377         local string nextmap;\r
378         //local float n, nummaps;\r
379         //local string s;\r
380         if (alreadychangedlevel)\r
381                 return;\r
382         alreadychangedlevel = TRUE;\r
383         if (cvar("samelevel"))  // if samelevel is set, stay on same level\r
384                 changelevel (mapname);\r
385         else\r
386         {\r
387                 // method 1\r
388 \r
389                 //local entity pos;\r
390                 local float fh;\r
391                 local string line;\r
392 \r
393                 // restart current map if no cycle is found\r
394                 nextmap = strzone(mapname);\r
395                 fh = fopen("maplist.cfg", FILE_READ);\r
396                 if (fh >= 0)\r
397                 {\r
398                         while (1)\r
399                         {\r
400                                 line = fgets(fh);\r
401                                 if (nextmap == mapname)\r
402                                 {\r
403                                         strunzone(nextmap);\r
404                                         nextmap = strzone(line);\r
405                                 }\r
406                                 if (!line)\r
407                                         break;\r
408                                 if (line == mapname)\r
409                                 {\r
410                                         line = fgets(fh);\r
411                                         if (!line)\r
412                                                 break;\r
413                                         strunzone(nextmap);\r
414                                         nextmap = strzone(line);\r
415                                         break;\r
416                                 }\r
417                         }\r
418                         fclose(fh);\r
419                 }\r
420                 changelevel (nextmap);\r
421                 strunzone(nextmap);\r
422 \r
423                 // method 2\r
424                 //nextmap = Nex_RotateMapList();\r
425                 //changelevel (nextmap);\r
426                 //strunzone (nextmap);\r
427                 // method 3\r
428                 /*\r
429                 s = cvar_string("g_maplist");\r
430                 nummaps = tokenize(s);\r
431                 // if no map list, restart current one\r
432                 nextmap = mapname;\r
433                 if (nummaps >= 1)\r
434                 {\r
435                         n = 0;\r
436                         while (n < nummaps)\r
437                         {\r
438                                 if (argv(n) == mapname)\r
439                                         break;\r
440                                 n = n + 1;\r
441                         }\r
442                         n = n + 1;\r
443                         if (n >= nummaps)\r
444                                 n = 0;\r
445                         nextmap = argv(n);\r
446                 }\r
447                 changelevel (nextmap);\r
448                 */\r
449         }\r
450 };\r
451 \r
452 \r
453 /*\r
454 ============\r
455 IntermissionThink\r
456 \r
457 When the player presses attack or jump, change to the next level\r
458 ============\r
459 */\r
460 void() IntermissionThink =\r
461 {\r
462         if (time < intermission_exittime)\r
463                 return;\r
464 \r
465         if (time < intermission_exittime + 10 && !self.button0 && !self.button1 && !self.button2 && !self.button3)\r
466                 return;\r
467 \r
468         GotoNextMap ();\r
469 };\r
470 \r
471 /*\r
472 ============\r
473 FindIntermission\r
474 \r
475 Returns the entity to view from\r
476 ============\r
477 */\r
478 /*\r
479 entity() FindIntermission =\r
480 {\r
481         local   entity spot;\r
482         local   float cyc;\r
483 \r
484 // look for info_intermission first\r
485         spot = find (world, classname, "info_intermission");\r
486         if (spot)\r
487         {       // pick a random one\r
488                 cyc = random() * 4;\r
489                 while (cyc > 1)\r
490                 {\r
491                         spot = find (spot, classname, "info_intermission");\r
492                         if (!spot)\r
493                                 spot = find (spot, classname, "info_intermission");\r
494                         cyc = cyc - 1;\r
495                 }\r
496                 return spot;\r
497         }\r
498 \r
499 // then look for the start position\r
500         spot = find (world, classname, "info_player_start");\r
501         if (spot)\r
502                 return spot;\r
503 \r
504 // testinfo_player_start is only found in regioned levels\r
505         spot = find (world, classname, "testplayerstart");\r
506         if (spot)\r
507                 return spot;\r
508 \r
509 // then look for the start position\r
510         spot = find (world, classname, "info_player_deathmatch");\r
511         if (spot)\r
512                 return spot;\r
513 \r
514         //objerror ("FindIntermission: no spot");\r
515         return world;\r
516 };\r
517 */\r
518 \r
519 /*\r
520 ===============================================================================\r
521 \r
522 RULES\r
523 \r
524 ===============================================================================\r
525 */\r
526 \r
527 /*\r
528 go to the next level for deathmatch\r
529 only called if a time or frag limit has expired\r
530 */\r
531 void() NextLevel =\r
532 {\r
533         gameover = TRUE;\r
534 \r
535         intermission_running = 1;\r
536 \r
537 // enforce a wait time before allowing changelevel\r
538         intermission_exittime = time + 5;\r
539 \r
540         WriteByte (MSG_ALL, SVC_CDTRACK);\r
541         WriteByte (MSG_ALL, 3);\r
542         WriteByte (MSG_ALL, 3);\r
543 \r
544         //pos = FindIntermission ();\r
545 \r
546         other = find (world, classname, "player");\r
547         while (other != world)\r
548         {\r
549                 //other.nextthink = time + 0.5;\r
550                 other.takedamage = DAMAGE_NO;\r
551                 other.solid = SOLID_NOT;\r
552                 other.movetype = MOVETYPE_NONE;\r
553                 other.angles = other.v_angle;\r
554                 other.angles_x = other.angles_x * -1;\r
555                 /*\r
556                 if (pos != world);\r
557                 {\r
558                         other.modelindex = 0;\r
559                         other.weaponentity = world; // remove weapon model\r
560                         other.view_ofs = '0 0 0';\r
561                         other.angles = other.v_angle = pos.mangle;\r
562                         if (!other.angles)\r
563                         {\r
564                                 other.angles = other.v_angle = pos.angles;\r
565                                 other.v_angle_x = other.v_angle_x * -1;\r
566                         }\r
567                         other.fixangle = TRUE;          // turn this way immediately\r
568                         setorigin (other, pos.origin);\r
569                 }\r
570                 */\r
571                 other = find (other, classname, "player");\r
572         }\r
573 \r
574         WriteByte (MSG_ALL, SVC_INTERMISSION);\r
575 };\r
576 \r
577 /*\r
578 ============\r
579 CheckRules_Player\r
580 \r
581 Exit deathmatch games upon conditions\r
582 ============\r
583 */\r
584 void() CheckRules_Player =\r
585 {\r
586         local float fraglimit;\r
587 \r
588         if (gameover)   // someone else quit the game already\r
589                 return;\r
590 \r
591         fraglimit = cvar("fraglimit");\r
592         if (fraglimit && self.frags >= fraglimit)\r
593         {\r
594                 NextLevel ();\r
595                 return;\r
596         }\r
597 };\r
598 \r
599 float checkrules_oneminutewarning;\r
600 float checkrules_leaderfrags;\r
601 entity checkrules_leader;\r
602 \r
603 /*\r
604 ============\r
605 CheckRules_World\r
606 \r
607 Exit deathmatch games upon conditions\r
608 ============\r
609 */\r
610 void() CheckRules_World =\r
611 {\r
612         local float timelimit;\r
613         local float fraglimit;\r
614         local float checkrules_oldleaderfrags;\r
615         local entity checkrules_oldleader;\r
616         local entity head;\r
617 \r
618         if (intermission_running)\r
619         if (time >= intermission_exittime + 60)\r
620         {\r
621                 GotoNextMap();\r
622                 return;\r
623         }\r
624 \r
625         if (gameover)   // someone else quit the game already\r
626                 return;\r
627 \r
628         timelimit = cvar("timelimit") * 60;\r
629         fraglimit = cvar("fraglimit");\r
630 \r
631         if (timelimit && time >= timelimit)\r
632         {\r
633                 NextLevel ();\r
634                 return;\r
635         }\r
636 \r
637         if (!checkrules_oneminutewarning && timelimit && time > timelimit - 60)\r
638         {\r
639                 checkrules_oneminutewarning = TRUE;\r
640                 sound(world, CHAN_AUTO, "announcer/1minuteremains.wav", 1, ATTN_NONE);\r
641         }\r
642 \r
643         checkrules_oldleader = checkrules_leader;\r
644         checkrules_oldleaderfrags = checkrules_leaderfrags;\r
645         checkrules_leaderfrags = 0;\r
646         checkrules_leader = world;\r
647         head = findchain(classname, "player");\r
648         while (head)\r
649         {\r
650                 if (checkrules_leaderfrags < head.frags)\r
651                 {\r
652                         checkrules_leaderfrags = head.frags;\r
653                         checkrules_leader = head;\r
654                 }\r
655                 head = head.chain;\r
656         }\r
657         if (checkrules_leaderfrags <= 0)\r
658         {\r
659                 checkrules_leader = world;\r
660                 checkrules_leaderfrags = 0;\r
661         }\r
662         checkrules_leaderfrags = floor(checkrules_leaderfrags);\r
663         if (checkrules_leaderfrags != checkrules_oldleaderfrags)\r
664         {\r
665                 if (checkrules_leaderfrags == fraglimit - 1)\r
666                         sound(world, CHAN_AUTO, "announcer/1fragleft.wav", 1, ATTN_NONE);\r
667                 else if (checkrules_leaderfrags == fraglimit - 2)\r
668                         sound(world, CHAN_AUTO, "announcer/2fragsleft.wav", 1, ATTN_NONE);\r
669                 else if (checkrules_leaderfrags == fraglimit - 3)\r
670                         sound(world, CHAN_AUTO, "announcer/3fragsleft.wav", 1, ATTN_NONE);\r
671         }\r
672 //      if (checkrules_leader != checkrules_oldleader)// && checkrules_leaderfrags > checkrules_oldleaderfrags)\r
673 //              bprint("^1",checkrules_leader.netname, " has taken the lead with ", ftos(checkrules_leaderfrags), " frags\n");\r
674 };\r
675 \r