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