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