1 /***************************************************************************
2 * TEKMSC.C - screenfx, menus, flic stuff etc. for Tekwar *
3 * *
4 * *
5 ***************************************************************************/
6
7 #include "build.h"
8 #include "names.h"
9 #include "pragmas.h"
10 #include "mmulti.h"
11 #include "baselayer.h"
12 #include "compat.h"
13 #include "scancodes.h"
14 #include "tekwar.h"
15
16 #define NUMWHITESHIFTS 3
17 #define WHITESTEPS 20
18 #define WHITETICS 6
19 #define NUMREDSHIFTS 4
20 #define REDSTEPS 8
21
22 #define MENUQUITGAME 4
23 #define MENULOADGAME 6
24 #define MENUSAVEGAME 7
25 #define MENUSOUNDMUS 8
26 #define MENUMOUSEADJ 9
27 #define MENUSCREENADJ 10
28 #define HELPSCREEN 99
29
30 #define HCSCALE 100
31 #define AMMOSCALE 10
32
33 #define AVERAGEFRAMES 16
34 #define MFONTYSTEP 12
35 #define MAXSUBOPTIONS 6
36
37 char headbobstr[13]={"HEAD BOB ON"};
38 struct menu {
39 short x,y;
40 char proportional,shade,pal;
41 const char *label;
42 struct menu *nextopt;
43 char tomenu,backmenu;
44 } menu[][MAXSUBOPTIONS]={
45 {{-1,1,1,0,0,NULL,NULL,0,0}, // 0
46 {-1,1,1,0,0,NULL,NULL,0,0},
47 {-1,1,1,0,0,NULL,NULL,0,0},
48 {-1,1,1,0,0,NULL,NULL,0,0},
49 {-1,1,1,0,0,NULL,NULL,0,0},
50 {-1,1,1,0,0,NULL,NULL,0,0}},
51 {{-1,1,1,0,0,"TEKWAR MENU",&menu[1][1],0,0}, // 1 MAIN MENU
52 {-1,3,1,0,2,"NEW GAME",&menu[1][2],2,0},
53 {-1,4,1,2,2,"OPTIONS",&menu[1][3],3,0},
54 {-1,5,1,4,2,"LOAD GAME",&menu[1][4],6,0},
55 {-1,6,1,6,2,"SAVE GAME",&menu[1][5],7,0},
56 {-1,7,1,8,2," ABORT ",NULL,4,0}},
57 {{-1,1,1,0,0,"DIFFICULTY",&menu[2][1],0,1}, // 2 DIFFICULTY LEVEL
58 {-1,3,1,0,2,"EASY",&menu[2][2],0,1},
59 {-1,4,1,0,2,"MEDIUM",&menu[2][3],0,1},
60 {-1,5,1,0,2,"HARD",NULL,0,1},
61 {-1,6,1,0,2,NULL,NULL,0,1},
62 {-1,7,1,0,2,NULL,NULL,0,1}},
63 {{-1,1,1,0,0,"OPTIONS MENU",&menu[3][1],0,1}, // 3 OPTIONS MENU
64 //{-1,3,1,0,2,"SELECT MISSION",&menu[3][2],5,1},
65 {-1,4,1,0,2,"MOUSE SENSITIVITY",&menu[3][2],9,1},
66 {-1,5,1,0,2,"SOUND/MUSIC VOLUME",&menu[3][3],8,1},
67 {-1,6,1,0,2,&headbobstr[0],NULL,0,1},
68 {-1,3,1,0,2,NULL,NULL,0,1},
69 {-1,0,1,0,2,NULL,NULL,0,1}},
70 {{-1,5,1,0,3,"ABORT MISSION Y/N?",NULL,0,1}, // 4 QUIT TO DOS
71 {-1,0,1,0,2,NULL,NULL,0,1},
72 {-1,0,1,0,2,NULL,NULL,0,1},
73 {-1,0,1,0,2,NULL,NULL,0,1},
74 {-1,0,1,0,2,NULL,NULL,0,1},
75 {-1,0,1,0,2,NULL,NULL,0,1}},
76 {{-1,1,1,0,0,"SELECT LOCATIONS",&menu[5][1],0,3},// 5 DAY/NIGHT MISSION
77 {-1,3,1,0,2,"CITY",&menu[5][2],0,3},
78 {-1,4,1,0,2,"HOSPITAL",&menu[5][3],0,3},
79 {-1,5,1,0,2,"POLICE STATION",&menu[5][4],0,3},
80 {-1,6,1,0,2,"WAREHOUSE",NULL,0,3},
81 {-1,0,1,0,2,NULL,NULL,0,1}},
82 {{-1,1,1,0,3,"LOAD GAME MENU",NULL,0,1}, // 6 LOAD GAME MENU
83 {-1,0,1,0,2,NULL,NULL,0,1},
84 {-1,0,1,0,2,NULL,NULL,0,1},
85 {-1,0,1,0,2,NULL,NULL,0,1},
86 {-1,0,1,0,2,NULL,NULL,0,1},
87 {-1,0,1,0,2,NULL,NULL,0,1}},
88 {{-1,1,1,0,3,"SAVE GAME MENU",NULL,0,1}, // 7 SAVE GAME MENU
89 {-1,0,1,0,2,NULL,NULL,0,1},
90 {-1,0,1,0,2,NULL,NULL,0,1},
91 {-1,0,1,0,2,NULL,NULL,0,1},
92 {-1,0,1,0,2,NULL,NULL,0,1},
93 {-1,0,1,0,2,NULL,NULL,0,1}},
94 {{-1,1,1,0,3,"SOUND/MUSIC VOLUME",&menu[8][1],0,3}, // 8 SOUND EFFECTS VOLUME
95 {-1,3,1,0,2,"SOUND VOLUME",&menu[8][2],0,3},
96 {-1,6,1,0,2,"MUSIC VOLUME",NULL,0,3},
97 {-1,0,1,0,2,NULL,NULL,0,3},
98 {-1,0,1,0,2,NULL,NULL,0,1},
99 {-1,0,1,0,2,NULL,NULL,0,1}},
100 {{-1,1,1,0,3,"MOUSE SENSITIVITY",NULL,0,3}, // 9 MOUSE SENSITIVITY
101 {-1,0,1,0,2,NULL,NULL,0,3},
102 {-1,0,1,0,2,NULL,NULL,0,1},
103 {-1,0,1,0,2,NULL,NULL,0,1},
104 {-1,0,1,0,2,NULL,NULL,0,1},
105 {-1,0,1,0,2,NULL,NULL,0,1}},
106 {{-1,1,1,0,3,"SCREEN SIZE",NULL,0,3}, // 10 SCREEN SIZE
107 {-1,0,1,0,2,NULL,NULL,0,3},
108 {-1,0,1,0,2,NULL,NULL,0,1},
109 {-1,0,1,0,2,NULL,NULL,0,1},
110 {-1,0,1,0,2,NULL,NULL,0,1},
111 {-1,0,1,0,2,NULL,NULL,0,1}}
112 };
113 int lastselopt[16]={
114 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
115 };
116
117 int framecnt,frameval[AVERAGEFRAMES];
118 char blink=0xFF;
119 int menuspincnt=0L;
120 int activemenu=0;
121 char requesttoquit;
122 char dofadein=0;
123 unsigned char whiteshifts[NUMREDSHIFTS][768];
124 unsigned char redshifts[NUMREDSHIFTS][768];
125 int redcount,whitecount;
126 char palshifted;
127 char depresscount;
128 int selopt=1;
129 char otoggles[MAXTOGGLES];
130 char tektempbuf[TEKTEMPBUFSIZE];
131 char gameover=0;
132 char demowon=0;
133 char outofsync=0;
134 char rearviewdraw;
135 int timedinv;
136 char loadsavenames[MAXLOADSAVEOPTS][MAXLOADSAVESIZE];
137 char lockeybuf[MAXLOADSAVESIZE];
138 int invredcards[MAXPLAYERS], invbluecards[MAXPLAYERS];
139 short symbols[7];
140 short symbolsdeposited[7];
141 int invaccutrak[MAXPLAYERS];
142 int noenemiesflag;
143 int noguardflag;
144 int nostalkflag;
145 int nochaseflag;
146 int nostrollflag;
147 int nobriefflag;
148 char messagebuf[MSGBUFSIZE];
149 char notininventory;
150 char redrawborders;
151 int curblink,loadnewgame;
152 int locmessagelen,loctypemode;
153 int mousesensitivity,musicv=16,soundv=16;
154 int curblinkclock;
155 int messagex;
156 short hcpos,wppos,rvpos;
157 int autocenter[MAXPLAYERS],menudirect;
158 int hcmoving,rvmoving,wpmoving;
159 short winner=-1;
160 char rvonemotime;
161 char wponemotime;
162 char hconemotime;
163 int lastsec;
164 int lastscore;
165 char lasttimetoggle;
166 char lastscoretoggle;
167 char lastinvtoggle;
168 int lastwx2;
169 int lastinvr,lastinvb,lastinvacc;
170 int fortieth;
171 int seconds=0;
172 int minutes=0;
173 int hours=0;
174 int messageon=0;
175 int difficulty;
176 int currentmapno=0;
177 int warpretang,warpretsect;
178 int warpretx,warprety,warpretz;
179 int mission=0;
180 char numlives=0;
181 char mission_accomplished=0;
182 int civillianskilled=0;
183 char generalplay;
184 char novideoid;
185 char singlemapmode;
186 int newnetleader=0,oldnetleader=0;
187 int netclock;
188 int allsymsdeposited=0;
189 int killedsonny=0;
190
191
192 void
fadeout(int UNUSED (start),int UNUSED (end),int UNUSED (red),int UNUSED (green),int UNUSED (blue),int UNUSED (steps))193 fadeout(int UNUSED(start), int UNUSED(end), int UNUSED(red), int UNUSED(green), int UNUSED(blue), int UNUSED(steps))
194 {
195 // int i,j,orig,delta;
196 // char *origptr,*newptr;
197
198 finishpaletteshifts();
199 /*
200 asmwaitvrt(1);
201 getpalette(&palette1[0][0]);
202 memcpy(palette2,palette1,768);
203
204 for( i=0; i<steps; i++ ) {
205 origptr=&palette1[start][0];
206 newptr=&palette2[start][0];
207 for( j=start; j<=end; j++ ) {
208 orig = *origptr++;
209 delta = red-orig;
210 *newptr++ = orig + delta * i / steps;
211 orig = *origptr++;
212 delta = green-orig;
213 *newptr++ = orig + delta * i / steps;
214 orig = *origptr++;
215 delta = blue-orig;
216 *newptr++ = orig + delta * i / steps;
217 }
218
219 asmwaitvrt(1);
220 asmsetpalette(&palette2[0][0]);
221 }
222 */
223 return;
224 }
225
226 void
clearkeys(void)227 clearkeys(void)
228 {
229 memset(keystatus, 0, sizeof(keystatus));
230
231 return;
232 }
233
234 void
fadein(int UNUSED (start),int UNUSED (end),int UNUSED (steps))235 fadein(int UNUSED(start), int UNUSED(end), int UNUSED(steps))
236 {
237 /* int i,j,delta;
238
239 if( steps == 0 ) {
240 return;
241 }
242
243 asmwaitvrt(1);
244 getpalette(&palette1[0][0]);
245 memcpy(&palette2[0][0],&palette1[0][0],sizeof(palette1));
246
247 start *= 3;
248 end = end*3+2;
249
250 // fade through intermediate frames
251 for( i=0; i<steps; i++ ) {
252 for( j=start; j<=end; j++ ) {
253 delta=palette[j]-palette1[0][j];
254 palette2[0][j]=palette1[0][j] + delta * i / steps;
255 }
256
257 asmwaitvrt(1);
258 asmsetpalette(&palette2[0][0]);
259 }
260
261 // final color
262 asmwaitvrt(1);
263 asmsetpalette(palette);
264 */
265 dofadein=0;
266 clearkeys();
267 }
268
fog()269 void fog()
270 {
271 char* temp = palookup[0];
272 palookup[0] = palookup[255];
273 palookup[255] = temp;
274 }
275
initpaletteshifts()276 int initpaletteshifts()
277 {
278 unsigned char* workptr, * baseptr;
279 int i, j, delta;
280
281 for (i = 1; i <= NUMREDSHIFTS; i++)
282 {
283 workptr = &redshifts[i - 1][0];
284 baseptr = &palette[0];
285 for (j = 0; j <= 255; j++)
286 {
287 delta = 64 - *baseptr;
288 *workptr++ = *baseptr++ + delta * i / REDSTEPS;
289 delta = -*baseptr;
290 *workptr++ = *baseptr++ + delta * i / REDSTEPS;
291 delta = -*baseptr;
292 *workptr++ = *baseptr++ + delta * i / REDSTEPS;
293 }
294 }
295
296 for (i = 1; i <= NUMWHITESHIFTS; i++)
297 {
298 workptr = &whiteshifts[i - 1][0];
299 baseptr = &palette[0];
300 for (j = 0; j <= 255; j++)
301 {
302 delta = 64 - *baseptr;
303 *workptr++ = *baseptr++ + delta * i / WHITESTEPS;
304 delta = 62 - *baseptr;
305 *workptr++ = *baseptr++ + delta * i / WHITESTEPS;
306 delta = 0 - *baseptr;
307 *workptr++ = *baseptr++ + delta * i / WHITESTEPS;
308 }
309 }
310
311 return 0;
312 }
313
314 int
startredflash(int damage)315 startredflash(int damage)
316 {
317 if( redcount != 0 )
318 return(0);
319
320 redcount=0;
321
322 redcount+=damage;
323
324 if( redcount < 0 ) {
325 redcount=0;
326 }
327
328 return 0;
329 }
330
331 int
startwhiteflash(int bonus)332 startwhiteflash(int bonus)
333 {
334 whitecount = 0;
335
336 whitecount+=bonus;
337
338 if( whitecount < 0 ) {
339 whitecount=0;
340 }
341
342 return 0;
343 }
344
345 void
woundflash()346 woundflash()
347 {
348 startredflash(4);
349 }
350
351 void
criticalflash()352 criticalflash()
353 {
354 startredflash(32);
355 }
356
357 void
bonusflash()358 bonusflash()
359 {
360 startwhiteflash(8);
361 }
362
363 void
burnflash()364 burnflash()
365 {
366 startredflash(8);
367 }
368
369 void
updatepaletteshifts(void)370 updatepaletteshifts(void)
371 {
372 int red,white;
373
374 if (whitecount)
375 {
376 white = whitecount/WHITETICS +1;
377 if (white>NUMWHITESHIFTS)
378 white = NUMWHITESHIFTS;
379 whitecount -= TICSPERFRAME;
380 if (whitecount < 0)
381 whitecount = 0;
382 }
383 else {
384 white = 0;
385 }
386
387 if (redcount)
388 {
389 red = redcount/10 +1;
390 if (red>NUMREDSHIFTS)
391 red = NUMREDSHIFTS;
392 redcount -= TICSPERFRAME;
393 if (redcount < 0)
394 redcount = 0;
395 }
396 else {
397 red = 0;
398 }
399
400
401 if( red ) {
402 //asmsetpalette(redshifts[red-1]);
403 debugprintf("updatepaletteshifts redshifts[%d]\n", red-1);
404 palshifted = 1;
405 }
406 else if( white ) {
407 //asmsetpalette(whiteshifts[white-1]);
408 debugprintf("updatepaletteshifts whiteshifts[%d]\n", white-1);
409 palshifted = 1;
410 }
411 else if( palshifted ) {
412 //asmsetpalette(&palette[0]); // back to normal
413 debugprintf("updatepaletteshifts reset\n");
414 // setbrightness(brightness);
415 palshifted = 0;
416 }
417
418 return;
419 }
420
421 void
setup3dscreen()422 setup3dscreen()
423 {
424 int i, dax, day, dax2, day2;
425
426 if( screensize > xdim ) {
427 dax = 0; day = 0;
428 dax2 = xdim-1; day2 = ydim-1;
429 }
430 else {
431 dax = (xdim>>1)-(screensize>>1);
432 dax2 = dax+screensize-1;
433 day = ((ydim-32)>>1)-(((screensize*(ydim-32))/xdim)>>1);
434 day2 = day + ((screensize*(ydim-32))/xdim)-1;
435 tekview(&dax,&day,&dax2,&day2);
436 videoSetViewableArea(dax,day>>detailmode,dax2,day2>>detailmode);
437 }
438 if( screensize <= xdim ) {
439 permanentwritespritetile(0L,0L,BACKGROUND,0,0L,0L,xdim-1,ydim-1,0);
440 permanentwritesprite((xdim-320)>>1,ydim-32,STATUSBAR,0,0,0,xdim-1,ydim-1,0);
441 i = ((xdim-320)>>1);
442 while (i >= 8) i -= 8, permanentwritesprite(i,ydim-32,STATUSBARFILL8,0,0,0,xdim-1,ydim-1,0);
443 if (i >= 4) i -= 4, permanentwritesprite(i,ydim-32,STATUSBARFILL4,0,0,0,xdim-1,ydim-1,0);
444 i = ((xdim-320)>>1)+320;
445 while (i <= xdim-8) permanentwritesprite(i,ydim-32,STATUSBARFILL8,0,0,0,xdim-1,ydim-1,0), i += 8;
446 if (i <= xdim-4) permanentwritesprite(i,ydim-32,STATUSBARFILL4,0,0,0,xdim-1,ydim-1,0), i += 4;
447 }
448 }
449
450 void
finishpaletteshifts(void)451 finishpaletteshifts(void)
452 {
453 if( palshifted == 1 ) {
454 palshifted = 0;
455 //asmsetpalette(&palette[0]);
456 debugprintf("finishpaletteshifts\n");
457 }
458
459 return;
460 }
461
462 void
showmessage(const char * fmt,...)463 showmessage(const char *fmt,...)
464 {
465 va_list vargs;
466
467 memset(messagebuf, '\0', MSGBUFSIZE);
468
469 va_start(vargs,fmt);
470 vsprintf(messagebuf,fmt,vargs);
471 va_end(vargs);
472
473 messagebuf[MSGBUFSIZE-1]='\0';
474 messagex=(xdim>>1)-( ((strlen(messagebuf))>>1)*8 );
475 if( messagex < 0 )
476 messagex=0;
477 messageon=1;
478 }
479
480 #ifdef DOANNOYINGTITLESCREEN
481 void
tektitlescreen()482 tektitlescreen()
483 {
484 int i,j,k,l;
485 char *ptr;
486
487 setgamemode(0, vesares[option[6]&15][0],vesares[option[6]&15][1], 8);
488 setview(0L,0L,xdim-1,ydim-1);
489 loadtile(TITLESCRPIC);
490 loadtile(BACKGROUND);
491 i=0;
492 j=1621;
493 for( k=0; k<256; k++ ) {
494 for( l=0; l<256; l++ ) {
495 ptr = (char *)(waloff[TITLESCRPIC]+i);
496 *ptr =*(char *)(waloff[BACKGROUND]+i);
497 i = (i+j)&65535;
498 j = (j+4)&65535;
499 }
500 rotatesprite(0<<16, 0<<16, 65536l, 0, TITLESCRPIC, 0, 0, 0, 2+8+16, 0, 0, xdim-1, ydim-1);
501 nextpage();
502 }
503 }
504 #endif
505
tekfirstpass()506 void tekfirstpass()
507 {
508 setbrightness(brightness);
509 }
510
511 void
tekgamestarted(void)512 tekgamestarted(void)
513 {
514 hcpos=-tilesiz[HCDEVICE].x;
515 wppos=-tilesiz[WPDEVICE].x;
516 rvpos=-tilesiz[RVDEVICE].x;
517 seconds=minutes=hours=0;
518 show2dsprite[playersprite[myconnectindex]>>3]|=
519 (1<<(playersprite[myconnectindex]&7));
520 songmastervolume(musicv<<3);
521 soundmastervolume(soundv<<11);
522 }
523
524 int
tekprivatekeys(void)525 tekprivatekeys(void)
526 {
527 if( activemenu != 0 ) {
528 return(0);
529 }
530
531 // alt hot keys - non mappable
532 /*
533 if( (keystatus[56] != 0) && (keystatus[25] != 0) ) {
534 keystatus[56]=0;
535 keystatus[25]=0;
536 cd_play();
537 }
538 if( (keystatus[56] != 0) && (keystatus[19] != 0) ) {
539 keystatus[56]=0;
540 keystatus[19]=0;
541 cd_resetdisc();
542 }
543 if( (keystatus[56] != 0) && (keystatus[31] != 0) ) {
544 keystatus[56]=0;
545 keystatus[31]=0;
546 cd_stopplay();
547 }
548 if( (keystatus[56] != 0) && (keystatus[33] != 0) ) {
549 keystatus[56]=0;
550 keystatus[33]=0;
551 cd_advancetrack();
552 }
553 if( (keystatus[56] != 0) && (keystatus[48] != 0) ) {
554 keystatus[56]=0;
555 keystatus[48]=0;
556 cd_retardtrack();
557 }
558 */
559 if( (keystatus[56] != 0) && (keystatus[16] != 0) ) {
560 keystatus[56]=0;
561 keystatus[16]=0;
562 gameover=1;
563 }
564
565 // cheat num lock keys
566 if( (keystatus[56] != 0) && (keystatus[42] != 0) && (option[4] == 0) ) {
567 if( keystatus[34] != 0 ) {
568 toggles[TOGGLE_GODMODE]^=0x01;
569 if( toggles[TOGGLE_GODMODE] ) {
570 holyon();
571 }
572 else {
573 holyoff();
574 }
575 keystatus[34]=0;
576 }
577 if( keystatus[35] != 0 ) {
578 changehealth(screenpeek, 200);
579 keystatus[35]=0;
580 }
581 if( keystatus[36] != 0 ) {
582 symbols[0]=1;
583 symbols[1]=1;
584 symbols[2]=1;
585 symbols[3]=1;
586 symbols[4]=1;
587 symbols[5]=1;
588 symbols[6]=1;
589 keystatus[36]=0;
590 }
591 if( keystatus[17] != 0 ) {
592 ammo1[screenpeek]=MAXAMMO;
593 ammo2[screenpeek]=MAXAMMO;
594 ammo3[screenpeek]=MAXAMMO;
595 ammo4[screenpeek]=MAXAMMO;
596 ammo5[screenpeek]=MAXAMMO;
597 ammo6[screenpeek]=MAXAMMO;
598 ammo7[screenpeek]=MAXAMMO;
599 ammo8[screenpeek]=MAXAMMO;
600 invredcards[screenpeek]=1;
601 invbluecards[screenpeek]=1;
602 invaccutrak[screenpeek]=1;
603 weapons[screenpeek] =(flags32[GUN1FLAG]|flags32[GUN2FLAG]|flags32[GUN3FLAG]|flags32[GUN4FLAG]);
604 weapons[screenpeek]|=(flags32[GUN5FLAG]|flags32[GUN6FLAG]|flags32[GUN7FLAG]|flags32[GUN8FLAG]);
605 keystatus[17]=0;
606 }
607 keystatus[69]=0;
608 }
609
610 // local game keys
611 if( keystatus[keys[23]] != 0 ) {
612 keystatus[keys[23]]=0;
613 toggles[TOGGLE_RETICULE]^=0x01;
614 }
615 if( keystatus[keys[24]] != 0 ) {
616 keystatus[keys[24]]=0;
617 toggles[TOGGLE_TIME]^=0x01;
618 }
619 if( keystatus[keys[25]] != 0 ) {
620 keystatus[keys[25]]=0;
621 toggles[TOGGLE_SCORE]^=0x01;
622
623 }
624 if( keystatus[keys[20]] != 0 ) {
625 keystatus[keys[20]]=0;
626 toggles[TOGGLE_REARVIEW]^=0x01;
627 playsound( S_REARMONITOR,0,0,0, ST_IMMEDIATE);
628 rvmoving=1;
629 }
630 if( keystatus[keys[21]] != 0 ) {
631 keystatus[keys[21]]=0;
632 toggles[TOGGLE_UPRT]^=0x01;
633 playsound(S_STATUS1+toggles[TOGGLE_UPRT],0,0,0, ST_IMMEDIATE);
634 wpmoving=1;
635 }
636 if (keystatus[keys[22]] != 0) {
637 keystatus[keys[22]]=0;
638 toggles[TOGGLE_HEALTH]^=0x01;
639 playsound( S_HEALTHMONITOR,0,0,0, ST_IMMEDIATE);
640 hcmoving=1;
641 }
642 if( keystatus[keys[26]] != 0 ) {
643 keystatus[keys[26]]=0;
644 toggles[TOGGLE_INVENTORY]^=0x01;
645 }
646
647 // non mappable function keys
648 if (keystatus[59] != 0) {
649 activemenu=HELPSCREEN;
650 menudirect=1;
651 }
652 else if (keystatus[60] != 0) {
653 if( option[4] == 0 ) {
654 activemenu=MENUSAVEGAME;
655 menudirect=1;
656 }
657 }
658 else if (keystatus[61] != 0) {
659 if( option[4] == 0 ) {
660 activemenu=MENULOADGAME;
661 menudirect=1;
662 }
663 }
664 else if (keystatus[62] != 0) {
665 activemenu=MENUQUITGAME;
666 menudirect=1;
667 }
668 else if (keystatus[64] != 0) {
669 activemenu=MENUMOUSEADJ;
670 menudirect=1;
671 selopt=1;
672 }
673 else if (keystatus[66] != 0) {
674 activemenu=MENUSOUNDMUS;
675 menudirect=1;
676 selopt=1;
677 }
678 if( keystatus[65] != 0 ) {
679 keystatus[65]=0;
680 toggles[TOGGLE_OVERSCAN]^=0x01;
681 }
682
683 // esc non mappable
684 if( keystatus[1] != 0 ) {
685 keystatus[1]=0;
686 if( activemenu ) {
687 activemenu=0;
688 }
689 else {
690 activemenu=1;
691 playsound(S_MENUSOUND1,0,0,0,ST_IMMEDIATE);
692 }
693 }
694
695 return 0;
696 }
697
698 void
redrawbackfx(void)699 redrawbackfx(void)
700 {
701 memmove(otoggles,toggles,MAXTOGGLES);
702 }
703
704 void
holyon()705 holyon()
706 {
707 if( screensize <= xdim ) {
708 printext((xdim>>1)-16,4,"HOLY",ALPHABET2,255);
709 }
710 }
711
712 void
holyoff()713 holyoff()
714 {
715 if( screensize <= xdim ) {
716 permanentwritesprite((xdim>>1)-16,4,TIMERESTORE,
717 0,(xdim>>1)-16,4,xdim-1,ydim-1,0);
718 }
719 }
720
721 void
showtime()722 showtime()
723 {
724 int alphabet=ALPHABET+(xdim > 360);
725
726 if( (screensize > xdim) || (dimensionmode[screenpeek] == 2) ) {
727 if( toggles[TOGGLE_TIME] ) {
728 sprintf(tektempbuf,"%02d:%02d:%02d", hours,minutes,seconds);
729 printext(xdim-72,ydim-12,tektempbuf,alphabet,255);
730 }
731 lastsec=0;
732 }
733 else {
734 if( toggles[TOGGLE_TIME] == 0 ) {
735 if( lasttimetoggle != toggles[TOGGLE_TIME] ) {
736 permanentwritesprite(xdim-80,ydim-12,TIMERESTORE,
737 0,xdim-80,ydim-12,xdim-1,ydim-1,0);
738 }
739 lasttimetoggle=toggles[TOGGLE_TIME];
740 lastsec=0;
741 }
742 else {
743 if( lastsec != seconds ) {
744 permanentwritesprite(xdim-80,ydim-12,TIMERESTORE,
745 0,xdim-80,ydim-12,xdim-1,ydim-1,0);
746 sprintf(tektempbuf,"%02d:%02d:%02d", hours,minutes,seconds);
747 printext(xdim-72,ydim-12,tektempbuf,alphabet,255);
748 lastsec=seconds;
749 }
750 lasttimetoggle=toggles[TOGGLE_TIME];
751 }
752 }
753 }
754
755 void
showscore()756 showscore()
757 {
758 int alphabet=ALPHABET+(xdim > 360);
759
760 if( (screensize > xdim) || (dimensionmode[screenpeek] == 2) ) {
761 if( toggles[TOGGLE_SCORE] ) {
762 if( score[screenpeek] == 1 ) {
763 sprintf(tektempbuf,"%08d", 0);
764 }
765 else {
766 sprintf(tektempbuf,"%08d", score[screenpeek]);
767 }
768 printext(xdim-160,ydim-12,tektempbuf,alphabet,255);
769 }
770 lastscore=0;
771 }
772 else {
773 if( toggles[TOGGLE_SCORE] == 0 ) {
774 if( (lastscoretoggle != toggles[TOGGLE_SCORE]) ) {
775 permanentwritesprite(xdim-160,ydim-12,SCORERESTORE,
776 0,xdim-160,ydim-12,xdim-1,ydim-1,0);
777 }
778 lastscoretoggle=toggles[TOGGLE_SCORE];
779 lastscore=0;
780 }
781 else {
782 if( (score[screenpeek]==0) || (lastscore != score[screenpeek]) ) {
783 permanentwritesprite(xdim-160,ydim-12,SCORERESTORE,
784 0,xdim-160,ydim-12,xdim-1,ydim-1,0);
785 if( score[screenpeek] == 1 ) {
786 sprintf(tektempbuf,"%08d", 0);
787 }
788 else {
789 sprintf(tektempbuf,"%08d", score[screenpeek]);
790 }
791 printext(xdim-160,ydim-12,tektempbuf,alphabet,255);
792 lastscore=score[screenpeek];
793 if( score[screenpeek]==0 )
794 score[screenpeek]=1;
795 }
796 lastscoretoggle=toggles[TOGGLE_SCORE];
797 }
798 }
799 }
800
801 void
showinv(int snum)802 showinv(int snum)
803 {
804 char ti=toggles[TOGGLE_INVENTORY];
805 char shade;
806
807 if( (screensize < xdim) || (toggles[TOGGLE_INVENTORY] == 0) ) {
808 goto skipsyms;
809 }
810 if( symbols[0] ) {
811 shade=0;
812 if( symbolsdeposited[0] )
813 shade=32;
814 rotatesprite((windowxy2.x-(30*8))<<16, (windowxy2.y-32)<<16, 65536l, 0, SYMBOL1PIC,
815 shade, 0, 8+16, windowxy1.x, windowxy1.y, windowxy2.x, windowxy2.y);
816 }
817 if( symbols[1] ) {
818 shade=0;
819 if( symbolsdeposited[1] )
820 shade=32;
821 rotatesprite((windowxy2.x-(30*7))<<16, (windowxy2.y-32)<<16, 65536l, 0, SYMBOL2PIC,
822 shade, 0, 8+16, windowxy1.x, windowxy1.y, windowxy2.x, windowxy2.y);
823 }
824 if( symbols[2] ) {
825 shade=0;
826 if( symbolsdeposited[2] )
827 shade=32;
828 rotatesprite((windowxy2.x-(30*6))<<16, (windowxy2.y-32)<<16, 65536l, 0, SYMBOL3PIC,
829 shade, 0, 8+16, windowxy1.x, windowxy1.y, windowxy2.x, windowxy2.y);
830 }
831 if( symbols[3] ) {
832 shade=0;
833 if( symbolsdeposited[3] )
834 shade=32;
835 rotatesprite((windowxy2.x-(30*5))<<16, (windowxy2.y-32)<<16, 65536l, 0, SYMBOL4PIC,
836 shade, 0, 8+16, windowxy1.x, windowxy1.y, windowxy2.x, windowxy2.y);
837 }
838 if( symbols[4] ) {
839 shade=0;
840 if( symbolsdeposited[4] )
841 shade=32;
842 rotatesprite((windowxy2.x-(30*4))<<16, (windowxy2.y-32)<<16, 65536l, 0, SYMBOL5PIC,
843 shade, 0, 8+16, windowxy1.x, windowxy1.y, windowxy2.x, windowxy2.y);
844 }
845 if( symbols[5] ) {
846 shade=0;
847 if( symbolsdeposited[5] )
848 shade=32;
849 rotatesprite((windowxy2.x-(30*3))<<16, (windowxy2.y-32)<<16, 65536l, 0, SYMBOL6PIC,
850 shade, 0, 8+16, windowxy1.x, windowxy1.y, windowxy2.x, windowxy2.y);
851 }
852 if( symbols[6] ) {
853 shade=0;
854 if( symbolsdeposited[6] )
855 shade=32;
856 rotatesprite((windowxy2.x-(30*2))<<16, (windowxy2.y-32)<<16, 65536l, 0, SYMBOL7PIC,
857 shade, 0, 8+16, windowxy1.x, windowxy1.y, windowxy2.x, windowxy2.y);
858 }
859
860 skipsyms:
861
862 if( ti ) {
863 timedinv--;
864 if( timedinv == 0 )
865 toggles[TOGGLE_INVENTORY]=0;
866 }
867
868 if( (windowxy2.x >= (xdim-24)) && ti ) {
869 if( invbluecards[snum] != 0 ) {
870 rotatesprite((xdim-24)<<16, ((ydim>>1)-14)<<16, 65536l, 0, 483,
871 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
872 }
873 if( invredcards[snum] != 0 ) {
874 rotatesprite((xdim-24)<<16, ((ydim>>1)-2)<<16, 65536l, 0, 484,
875 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
876 }
877 if( invaccutrak[snum] != 0 ) {
878 rotatesprite((xdim-24)<<16, ((ydim>>1)+10)<<16, 65536l, 0, 485,
879 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
880 }
881 lastinvtoggle=1;
882 return;
883 }
884 }
885
886 #define NETWINSCORE 1200
887
888 void
nextnetlevel()889 nextnetlevel()
890 {
891 int i,j,len,other,readyplayers,playerreadyflag[MAXPLAYERS];
892 int lastpacketclock,packets=0L;
893
894 if( strcmp(boardfilename,"NET1.MAP") == 0) {
895 strcpy(boardfilename,"NET2.MAP");
896 }
897 else if( strcmp(boardfilename,"NET2.MAP") == 0) {
898 strcpy(boardfilename,"NET3.MAP");
899 }
900 else if( strcmp(boardfilename,"NET3.MAP") == 0) {
901 strcpy(boardfilename,"NET4.MAP");
902 }
903 else if( strcmp(boardfilename,"NET4.MAP") == 0) {
904 strcpy(boardfilename,"NET6.MAP");
905 }
906 else if( strcmp(boardfilename,"NET6.MAP") == 0) {
907 strcpy(boardfilename,"NET7.MAP");
908 }
909 else if( strcmp(boardfilename,"NET7.MAP") == 0) {
910 strcpy(boardfilename,"NET5.MAP");
911 }
912 else if( strcmp(boardfilename,"NET5.MAP") == 0) {
913 strcpy(boardfilename,"NET1.MAP");
914 }
915 initpaletteshifts();
916 prepareboard(boardfilename);
917 precache();
918 for( i=connecthead ; i >= 0 ; i=connectpoint2[i] ) {
919 initplayersprite((short)i);
920 }
921 //** Les START - 10/02/95
922 for (i=connecthead ; i >= 0 ; i=connectpoint2[i]) {
923 playerreadyflag[i]=0;
924 }
925 #if 0
926 for (i=connecthead ; i >= 0 ; i=connectpoint2[i]) {
927 syncvel[i]=fsyncvel[i]=osyncvel[i]=0;
928 syncsvel[i]=fsyncsvel[i]=osyncsvel[i]=0;
929 syncangvel[i]=fsyncangvel[i]=osyncangvel[i]=0;
930 syncbits[i]=fsyncbits[i]=osyncbits[i]=0;
931 for (j=0 ; j < MOVEFIFOSIZ ; j++) {
932 baksyncvel[j][i]=0;
933 baksyncsvel[j][i]=0;
934 baksyncangvel[j][i]=0;
935 baksyncbits[j][i]=0;
936 }
937 }
938 movefifoplc=movefifoend=0;
939 syncvalplc=othersyncvalplc=0;
940 syncvalend=othersyncvalend=0;
941 syncvalcnt=othersyncvalcnt=0L;
942 olocvel=olocvel2=0;
943 olocsvel=olocsvel2=0;
944 olocangvel=olocangvel2=0;
945 olocbits=olocbits2=0;
946 #endif
947 randomseed=17L;
948 keystatus[0x01]=0;
949 memset(playerreadyflag,0,sizeof(int)*MAXPLAYERS);
950 readyplayers=0;
951 if (myconnectindex == connecthead) {
952 playerreadyflag[myconnectindex]=1;
953 do {
954 if ((len=getpacket(&other,packetbuf)) > 0) {
955 playerreadyflag[other]=1;
956 }
957 readyplayers=0;
958 for (i=connecthead ; i >= 0 ; i=connectpoint2[i]) {
959 if (playerreadyflag[i]) {
960 readyplayers++;
961 }
962 }
963 showmessage("%d OF %d PLAYERS READY..",readyplayers,numplayers);
964 drawscreen(screenpeek,0L);
965 } while (readyplayers < numplayers && keystatus[0x01] == 0);
966 if (keystatus[0x01]) {
967 keystatus[0x01]=0;
968 crash("Multiplayer game aborted!");
969 }
970 if (dbgflag) {
971 fprintf(dbgfp,"\nNEW LEVEL\n\n");
972 }
973 }
974 else {
975 showmessage("ONE MOMENT...");
976 if (dbgflag) {
977 fprintf(dbgfp,"\nNEW LEVEL\n\n");
978 }
979 }
980 //** Les END - 10/02/95
981 }
982
983 #ifdef WONMESSAGE
984 void
postwonmessage(int nw)985 postwonmessage(int nw)
986 {
987 int len;
988
989 clearview();
990 printext((xdim>>1)-40,(ydim>>1)-48,"TEK MASTER",ALPHABET2,255);
991 len=strlen(netnames[nw]);
992 len<<=2;
993 sprintf(tektempbuf,"%s",netnames[nw]);
994 printext((xdim>>1)-len,(ydim>>1)-32,tektempbuf,ALPHABET,255);
995 nextpage();
996 nextnetlevel();
997 }
998 #endif
999
1000 void
netstats()1001 netstats()
1002 {
1003 int icnt,i;
1004
1005 #ifdef NETNAMES
1006 if( option[4] != 0 ) {
1007 icnt=connecthead;
1008 for( i=connecthead ; i >= 0 ; i=connectpoint2[i] ) {
1009 icnt=i;
1010 #if 0
1011 if( score[i] > score[newnetleader] ) {
1012 if( score[newnetleader] < NETWINSCORE ) {
1013 newnetleader=i;
1014 }
1015 }
1016 #endif
1017 if( (toggles[TOGGLE_SCORE]) && (screensize >= xdim) ) {
1018 sprintf(tektempbuf,"%2d %10s %6d",i,netnames[i],score[i]);
1019 printext(12,(windowxy1.y+32)+(i<<3),tektempbuf,ALPHABET,255);
1020 }
1021 }
1022 #if 0
1023 if( newnetleader != oldnetleader ) {
1024 oldnetleader=newnetleader;
1025 }
1026 else if( (totalclock-netclock) > 7200 ) {
1027 netclock=totalclock;
1028 sprintf(tektempbuf,"%2d %s LEADS",newnetleader,netnames[newnetleader],score[newnetleader]);
1029 showmessage(tektempbuf);
1030 }
1031 #endif
1032 }
1033 #endif
1034 }
1035
1036 int
tekscreenfx(void)1037 tekscreenfx(void)
1038 {
1039 int ammo,n;
1040 int i;
1041 static short hcpic,rvpic,wppic;
1042
1043 updatepaletteshifts();
1044 updatesounds(screenpeek);
1045
1046 //#define COMMITTEE
1047 #ifdef COMMITTEE
1048 printext((xdim>>1)-25,windowy1+24,"THURS 6PM",ALPHABET,255);
1049 #endif
1050
1051 #ifdef MATRIXTIMELIMIT
1052 if( mission == 7 ) {
1053 switch( minutes ) {
1054 case 1:
1055 if( (seconds == 0) && (fortieth < 10) ) {
1056 showmessage("1 MINUTE LEFT");
1057 playsound(S_BEEP,0,0,0,ST_IMMEDIATE);
1058 }
1059 break;
1060 case 2:
1061 if( (seconds == 0) && (fortieth < 10) ) {
1062 showmessage("MATRIX TIMED OUT"); break;
1063 playsound(S_ALARM3,0,0,0,ST_IMMEDIATE);
1064 }
1065 else if( seconds == 3 ) {
1066 gameover=1;
1067 }
1068 break;
1069 }
1070 }
1071 #endif
1072
1073 if( (messageon == 0) && notininventory ) {
1074 showmessage("NOT IN INVENTORY");
1075 notininventory=0;
1076 }
1077 if( otoggles[TOGGLE_REARVIEW] ) {
1078 if (rvpos < 0) {
1079 rvpos+=(TICSPERFRAME<<2);
1080 if (rvpos >= 0) {
1081 rvpos=0;
1082 rvpic=RVDEVICEON;
1083 }
1084 else {
1085 n=tilesiz[RVDEVICE].x/(RVDEVICEON-RVDEVICE);
1086 n=(tilesiz[RVDEVICE].x-abs(rvpos))/n;
1087 rvpic=RVDEVICE+n;
1088 }
1089 }
1090 rotatesprite(rvpos<<16, 0<<16, 65536l, 0, rvpic,
1091 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
1092 if (rvpos == 0) {
1093 rearview(screenpeek);
1094 }
1095 }
1096 else if (abs(rvpos) < tilesiz[RVDEVICE].x) {
1097 rvpos-=(TICSPERFRAME<<2);
1098 if (abs(rvpos) > tilesiz[RVDEVICE].x) {
1099 rvpos=-tilesiz[RVDEVICE].x;
1100 rvpic=RVDEVICE;
1101 }
1102 else {
1103 n=tilesiz[RVDEVICE].x/(RVDEVICEON-RVDEVICE);
1104 n=(tilesiz[RVDEVICE].x-abs(rvpos))/n;
1105 rvpic=RVDEVICE+n;
1106 }
1107 rotatesprite(rvpos<<16, 0<<16, 65536l, 0, rvpic,
1108 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
1109 }
1110 if( otoggles[TOGGLE_UPRT] ) {
1111 if (wppos < 0) {
1112 wppos+=(TICSPERFRAME<<2);
1113 if (wppos >= 0) {
1114 wppos=0;
1115 wppic=WPDEVICEON;
1116 }
1117 else {
1118 n=tilesiz[WPDEVICE].x/(WPDEVICEON-WPDEVICE);
1119 n=(tilesiz[WPDEVICE].x-abs(wppos))/n;
1120 wppic=WPDEVICE+n;
1121 }
1122 }
1123 if (wppos == 0) {
1124 switch (locselectedgun+1) {
1125 #ifdef GUNINWPDEV
1126 case GUN1FLAG:
1127 wppic=WPDEVICEGUN2;
1128 break;
1129 case GUN2FLAG:
1130 wppic=WPDEVICEGUN4;
1131 break;
1132 case GUN3FLAG:
1133 wppic=WPDEVICEGUN6;
1134 break;
1135 #endif
1136 default:
1137 wppic=WPDEVICEON;
1138 break;
1139 }
1140 }
1141 rotatesprite((xdim-1-(tilesiz[WPDEVICE].x+wppos))<<16, 0<<16, 65536l, 0, WPDEVICE,
1142 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
1143 }
1144 else if (abs(wppos) < tilesiz[WPDEVICE].x) {
1145 wppos-=(TICSPERFRAME<<2);
1146 if (abs(wppos) > tilesiz[WPDEVICE].x) {
1147 wppos=-tilesiz[WPDEVICE].x;
1148 wppic=WPDEVICE;
1149 }
1150 else {
1151 n=tilesiz[WPDEVICE].x/(WPDEVICEON-WPDEVICE);
1152 n=(tilesiz[WPDEVICE].x-abs(wppos))/n;
1153 wppic=WPDEVICE+n;
1154 }
1155 //overwritesprite(wppos,0,wppic,0,0,0);
1156 rotatesprite((xdim-1-(tilesiz[WPDEVICE].x+wppos))<<16, 0<<16, 65536l, 0, WPDEVICE,
1157 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
1158 }
1159 #define SCOREANDTIMEONWPDEVICE
1160 #ifdef SCOREANDTIMEONWPDEVICE
1161 if( (wppic == WPDEVICEON) && (activemenu == 0) ) {
1162 sprintf(tektempbuf,"%02d:%02d:%02d", hours,minutes,seconds);
1163 printext(xdim-74,8,tektempbuf,ALPHABET,255);
1164 sprintf(tektempbuf,"%08d", score[screenpeek]);
1165 printext(xdim-74,18,tektempbuf,ALPHABET,255);
1166 }
1167 #endif
1168 #ifdef SCOREANDTIMEATBOTTOM
1169 if ((activemenu == 0) && !(biasthreshholdon)) {
1170 showtime();
1171 showscore();
1172 }
1173 #endif
1174 if( activemenu == 0 ) {
1175 showinv(screenpeek);
1176 }
1177 if( toggles[TOGGLE_GODMODE] && (screensize > xdim) ) {
1178 printext((xdim>>1)-16,4,"HOLY",ALPHABET2,255);
1179 }
1180 if (otoggles[TOGGLE_HEALTH]) {
1181 if (hcpos < 0) {
1182 hcpos+=(TICSPERFRAME<<2);
1183 if (hcpos >= 0) {
1184 hcpos=0;
1185 hcpic=HCDEVICEON;
1186 }
1187 else {
1188 n=tilesiz[HCDEVICE].x/(HCDEVICEON-HCDEVICE);
1189 n=(tilesiz[HCDEVICE].x-abs(hcpos))/n;
1190 hcpic=HCDEVICE+n;
1191 }
1192 }
1193 rotatesprite(hcpos<<16, (ydim-tilesiz[hcpic].y)<<16, 65536l, 0, hcpic,
1194 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
1195 if (hcpic == HCDEVICEON) {
1196 for (n=0 ; n < health[screenpeek]/HCSCALE ; n++) {
1197 rotatesprite((hcpos+34+(n*5))<<16, (ydim-tilesiz[hcpic].y+7)<<16, 65536l, 0, GREENLIGHTPIC,
1198 (health[screenpeek]/HCSCALE)-n, 0, 8+16, 0, 0, xdim-1, ydim-1);
1199 }
1200 for (n=0 ; n < stun[screenpeek]/HCSCALE ; n++) {
1201 rotatesprite((hcpos+34+(n*5))<<16, (ydim-tilesiz[hcpic].y+13)<<16, 65536l, 0, YELLOWLIGHTPIC,
1202 (stun[screenpeek]/HCSCALE)-n, 0, 8+16, 0, 0, xdim-1, ydim-1);
1203 }
1204 switch (locselectedgun) {
1205 case 0:
1206 ammo=ammo1[screenpeek];
1207 break;
1208 case 1:
1209 ammo=ammo2[screenpeek];
1210 break;
1211 case 2:
1212 ammo=ammo3[screenpeek];
1213 break;
1214 case 3:
1215 ammo=ammo4[screenpeek];
1216 break;
1217 case 4:
1218 ammo=ammo5[screenpeek];
1219 break;
1220 case 5:
1221 ammo=ammo6[screenpeek];
1222 break;
1223 case 6:
1224 ammo=ammo7[screenpeek];
1225 break;
1226 case 7:
1227 ammo=ammo8[screenpeek];
1228 break;
1229 default:
1230 ammo=MAXAMMO;
1231 break;
1232 }
1233 if( ammo > MAXAMMO ) {
1234 ammo =MAXAMMO-1;
1235 }
1236 for (n=0 ; n < ammo/AMMOSCALE ; n++) {
1237 rotatesprite((hcpos+34+(n*5))<<16, (ydim-tilesiz[hcpic].y+19)<<16, 65536l, 0, BLUELIGHTPIC,
1238 (ammo/AMMOSCALE)-n, 0, 8+16, 0, 0, xdim-1, ydim-1);
1239 }
1240 }
1241 }
1242 else if (abs(hcpos) < tilesiz[HCDEVICE].x) {
1243 hcpos-=(TICSPERFRAME<<2);
1244 if (abs(hcpos) > tilesiz[HCDEVICE].x) {
1245 hcpos=-tilesiz[HCDEVICE].x;
1246 hcpic=HCDEVICE;
1247 }
1248 else {
1249 n=tilesiz[HCDEVICE].x/(HCDEVICEON-HCDEVICE);
1250 n=(tilesiz[HCDEVICE].x-abs(hcpos))/n;
1251 hcpic=HCDEVICE+n;
1252 }
1253 rotatesprite(hcpos<<16, (ydim-tilesiz[hcpic].y)<<16, 65536l, 0, hcpic,
1254 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
1255 }
1256
1257 #ifdef FRAMECNT
1258 i=totalclock;
1259 if (i != frameval[framecnt]) {
1260 sprintf(tempbuf,"%ld",(CLKIPS*AVERAGEFRAMES)/(i-frameval[framecnt]));
1261 printext256(windowx1,windowy1,31,-1,tempbuf,1);
1262 frameval[framecnt]=i;
1263 }
1264 framecnt=((framecnt+1)&(AVERAGEFRAMES-1));
1265 #endif
1266
1267 if( (activemenu == 0) && (option[4] != 0) ) {
1268 netstats();
1269 }
1270
1271 if( biasthreshholdon ) {
1272 sprintf(tempbuf,"SET BIAS THRESHHOLD %3d", biasthreshhold);
1273 printext((xdim>>1)-96,windowxy2.y-10,tempbuf,ALPHABET2,255);
1274 }
1275 else if( (activemenu == 0) && messageon ) {
1276 if( messagex > windowxy1.x )
1277 printext(messagex,windowxy2.y-32,messagebuf,ALPHABET2,255);
1278 }
1279 if( (activemenu == 0) && (toggles[TOGGLE_HEALTH] == 0) && (hcpos == -tilesiz[HCDEVICE].x) && (screensize > 140) ) {
1280 if (!(biasthreshholdon)) {
1281 if( health[screenpeek] < 0 ) {
1282 sprintf(tektempbuf,"%4d", 0);
1283 }
1284 else if( health[screenpeek] > MAXHEALTH ) {
1285 sprintf(tektempbuf,"%4d", 1000);
1286 }
1287 else {
1288 sprintf(tektempbuf,"%4d", health[screenpeek]);
1289 }
1290 printext(windowxy1.x+6,windowxy2.y-10,tektempbuf,ALPHABET2,255);
1291 }
1292 }
1293 if (activemenu) {
1294 domenu();
1295 }
1296
1297 return 0;
1298 }
1299
1300 void
tektime(void)1301 tektime(void)
1302 {
1303 fortieth++;
1304 if( fortieth == 40 ) {
1305 fortieth=0;
1306 seconds++;
1307 }
1308 if( seconds == 60 ) {
1309 minutes++;
1310 seconds=0;
1311 }
1312 if( minutes == 60 ) {
1313 hours++;
1314 minutes=0;
1315 }
1316 if( hours > 99 ) {
1317 hours=0;
1318 }
1319 if( messageon ) {
1320 messageon++;
1321 if( messageon == 160 ) {
1322 messageon=0;
1323 }
1324 }
1325 }
1326
1327 void
initmenu(void)1328 initmenu(void)
1329 {
1330 gameover=0;
1331 activemenu=0;
1332 }
1333
1334 void
newgame(const char * mapname)1335 newgame(const char *mapname)
1336 {
1337 int i;
1338
1339 if( option[4] != 0 ) {
1340 return;
1341 }
1342
1343 ready2send=0;
1344
1345 stopallsounds();
1346 if (strcmp(boardfilename,mapname) != 0) {
1347 strcpy(boardfilename,mapname);
1348 }
1349 initpaletteshifts();
1350 prepareboard(boardfilename);
1351 precache();
1352 for (i=connecthead ; i >= 0 ; i=connectpoint2[i]) {
1353 initplayersprite((short)i);
1354 }
1355
1356 ready2send=1;
1357 }
1358
1359 const char *mapnames[TOTALMAPS] = {
1360 "subway0.map", // 0
1361 "subway1.map", // 1
1362 "subway2.map", // 2
1363 "subway3.map", // 3
1364 "level1.map", // 4
1365 "level2.map", // 5
1366 "", // 6
1367 "", // 7
1368 "city1.map", // 8
1369 "", // 9
1370 "", // 10
1371 "beach1.map", // 11
1372 "park1.map", // 12
1373 "", // 13
1374 "", // 14
1375 "mid1.map", // 15
1376 "mid2.map", // 16
1377 "mid3.map", // 17
1378 "sewer1.map", // 18
1379 "sewer2.map", // 19
1380 "inds1.map", // 20
1381 "", // 21
1382 "free1.map", // 22
1383 "free2.map", // 23
1384 "", // 24
1385 "ware1.map", // 25
1386 "ware2.map", // 26
1387 "ware3.map", // 27
1388 "", // 28
1389 "", // 29
1390 "final1.map", // 30
1391 "" // 31
1392 };
1393
1394 #define TOTALMISSIONS 7
1395 #define MAXMAPSPERMISSION 6
1396 int missionset[TOTALMISSIONS][MAXMAPSPERMISSION] = {
1397 //SUB M1 M2 M3 M4 MTRX
1398 { 0, 4, 5,-1,10, -1 }, // mission 0
1399 { 0, 8,-1,-1,-1, -1 }, // mission 1
1400 { 1, 11,12,-1,-1, -1 }, // mission 2
1401 { 1, 15,16,17,-1, -1 }, // mission 3
1402 { 2, 18,19,20,-1, -1 }, // mission 4
1403 { 2, 22,23,-1,-1, -1 }, // mission 5
1404 { 3, 25,26,27,-1, -1 }, // mission 6
1405 };
1406
1407 int
accessiblemap(int mn)1408 accessiblemap(int mn)
1409 {
1410 int i;
1411
1412 if( (mn < 0) || (mn >= TOTALMAPS) ) {
1413 return(0);
1414 }
1415 if( strlen(mapnames[mn]) < 2 ) {
1416 return(0);
1417 }
1418 for( i=0; i<MAXMAPSPERMISSION; i++ ) {
1419 if( missionset[mission][i] == mn ) {
1420 return(1);
1421 }
1422 }
1423 return(0);
1424 }
1425
1426 int
mapreturn(int cmap)1427 mapreturn(int cmap)
1428 {
1429 /*
1430 "level1.map", // 4
1431 "level2.map", // 5
1432 "city1.map", // 8
1433
1434 "beach1.map", // 11
1435 "park1.map", // 12
1436 "mid1.map", // 15
1437 "mid2.map", // 16
1438 "mid3.map", // 17
1439
1440 "sewer1.map", // 18
1441 "sewer2.map", // 19
1442 "inds1.map", // 20
1443 "free1.map", // 22
1444 "free2.map", // 23
1445
1446 "ware1.map", // 25
1447 "ware2.map", // 26
1448 "ware3.map", // 27
1449 */
1450 int rv;
1451
1452 switch( cmap ) {
1453 case 4: rv=0; warpretx=-27200; warprety=21500; warpretang= 512; warpretsect= 351; break;
1454 case 5: rv=0; warpretx= 7295; warprety=21500; warpretang= 512; warpretsect= 349; break;
1455 case 8: rv=0; warpretx=-11902; warprety=39300; warpretang=1536; warpretsect= 353; break;
1456 case 11: rv=1; warpretx=-27200; warprety=21500; warpretang= 512; warpretsect= 489; break;
1457 case 12: rv=1; warpretx= 7295; warprety=21500; warpretang= 512; warpretsect= 492; break;
1458 case 15: rv=1; warpretx=-11904; warprety=39300; warpretang=1536; warpretsect= 488; break;
1459 case 16: rv=1; warpretx= 24322; warprety=39300; warpretang=1536; warpretsect= 486; break;
1460 case 17: rv=1; warpretx= 57346; warprety=39300; warpretang=1536; warpretsect= 483; break;
1461 case 18: rv=2; warpretx=-27200; warprety=21500; warpretang= 512; warpretsect= 486; break;
1462 case 19: rv=2; warpretx= 7295; warprety=21500; warpretang= 512; warpretsect= 488; break;
1463 case 20: rv=2; warpretx= 41600; warprety=21500; warpretang= 512; warpretsect= 490; break;
1464 case 22: rv=2; warpretx=-11904; warprety=39300; warpretang=1536; warpretsect= 483; break;
1465 case 23: rv=2; warpretx= 24380; warprety=39300; warpretang=1536; warpretsect= 482; break;
1466 case 25: rv=3; warpretx=-27200; warprety=21500; warpretang= 512; warpretsect= 477; break;
1467 case 26: rv=3; warpretx= 7295; warprety=21500; warpretang= 512; warpretsect= 472; break;
1468 case 27: rv=3; warpretx= 41600; warprety=21500; warpretang= 512; warpretsect= 494; break;
1469 default: rv=-1;break;
1470 }
1471
1472 return(rv);
1473 }
1474
1475 void
newmap(int mapno)1476 newmap(int mapno)
1477 {
1478 int i,sn,p;
1479 int savhealth;
1480 int savestun;
1481 int savereds;
1482 int saveblues;
1483 int saveaccutrk;
1484 int newmap;
1485
1486 if( option[4] != 0 ) {
1487 return;
1488 }
1489 if( mapno >= TOTALMAPS ) {
1490 return;
1491 }
1492
1493 switch( mapno ) {
1494 case 0:
1495 case 1:
1496 case 2:
1497 case 3:
1498 newmap=mapreturn(currentmapno);
1499 if( newmap != mapno ) {
1500 crash("bad return map");
1501 }
1502 break;
1503 }
1504
1505 drawscreen(screenpeek,0);
1506 printext((xdim>>1)-44,(ydim>>1)-32,"LOADING MAP",ALPHABET2,255);
1507 videoNextPage();
1508
1509 initpaletteshifts();
1510 p=screenpeek;
1511
1512 #if 0
1513 switch( currentmapno ) {
1514 case 0:
1515 case 1:
1516 case 2:
1517 case 3:
1518 warpretx=posx[p];
1519 warprety=posy[p];
1520 warpretz=posz[p];
1521 warpretang=ang[p];
1522 warpretsect=cursectnum[p];
1523 break;
1524 default:
1525 break;
1526 }
1527 #endif
1528
1529 savhealth=health[p];
1530 savestun=stun[p];
1531 savereds=invredcards[p];
1532 saveblues=invbluecards[p];
1533 saveaccutrk=invaccutrak[p];
1534
1535 newgame(mapnames[mapno]);
1536
1537 health[p]=savhealth;
1538 stun[p]=savestun;
1539 invredcards[p]=savereds;
1540 invbluecards[p]=saveblues;
1541 invaccutrak[p]=saveaccutrk;
1542
1543 #if 0
1544 switch( mapno ) {
1545 case 0:
1546 case 1:
1547 case 2:
1548 case 3:
1549 sn=playersprite[p];
1550 sprite[sn].x=warpretx;
1551 sprite[sn].y=warprety;
1552 sprite[sn].z=warpretz;
1553 changespritesect(sn,warpretsect);
1554 posx[p]=sprite[sn].x;
1555 posy[p]=sprite[sn].y;
1556 posz[p]=sprite[sn].z;
1557 ang[p]=((warpretang+1024)&2047);
1558 cursectnum[p]=sprite[sn].sectnum;
1559 updatesector(posx[p],posy[p],cursectnum[p]);
1560 break;
1561 default:
1562 break;
1563 }
1564 #endif
1565
1566 switch( mapno ) {
1567 case 0:
1568 case 1:
1569 case 2:
1570 case 3:
1571 sn=playersprite[p];
1572
1573 sprite[sn].x=warpretx;
1574 sprite[sn].y=warprety;
1575 sprite[sn].ang=warpretang;
1576 copybuf(&sprite[sn].x,&osprite[sn].x,3);
1577 changespritesect(sn,warpretsect);
1578
1579 posx[p]=sprite[sn].x;
1580 posy[p]=sprite[sn].y;
1581 ang[p]=sprite[sn].ang;
1582 cursectnum[p]=sprite[sn].sectnum;
1583
1584 //updatesector(posx[p],posy[p],cursectnum[p]);
1585 //pushmove(&posx[p],&posy[p],&posz[p],&cursectnum[p],128L,4<<8,4<<8,CLIPMASK0);
1586 break;
1587 default:
1588 break;
1589 }
1590
1591 vel=0;
1592 svel=0;
1593 angvel=0;
1594
1595 currentmapno=mapno;
1596 strcpy(tektempbuf, mapnames[mapno]);
1597 showmessage(Bstrupr(tektempbuf));
1598
1599 musicfade();
1600 if( mapno <= 3 ) {
1601 menusong(1);
1602 }
1603 else {
1604 startmusic(mission);
1605 }
1606
1607 }
1608
1609 void
getloadsavenames(void)1610 getloadsavenames(void)
1611 {
1612 int fil,i;
1613
1614 for (i=0 ; i < MAXLOADSAVEOPTS ; i++) {
1615 sprintf(tempbuf,"savegam%d.tek",i+1);
1616 if (access(tempbuf,F_OK) == 0) {
1617 fil=open(tempbuf,O_BINARY|O_RDONLY,S_IREAD);
1618 read(fil,&loadsavenames[i],MAXLOADSAVESIZE);
1619 close(fil);
1620 }
1621 else {
1622 strncpy(loadsavenames[i],"-EMPTY-",MAXLOADSAVESIZE);
1623 }
1624 }
1625 }
1626
1627 void
mprintf(short x,short y,char prop,char shade,char palnum,const char * stg,...)1628 mprintf(short x,short y,char prop,char shade,char palnum,const char *stg,...)
1629 {
1630 int i,n,pic,propx;
1631 va_list vargs;
1632
1633 va_start(vargs,stg);
1634 vsprintf(tempbuf,stg,vargs);
1635 va_end(vargs);
1636 Bstrupr(tempbuf);
1637 n=strlen(tempbuf);
1638 if (x == -1) {
1639 if (prop) {
1640 pic=MFONT_A;
1641 propx=0;
1642 for (i=0 ; i < n ; i++) {
1643 if (isalpha(tempbuf[i])) {
1644 pic=MFONT_A+tempbuf[i]-'A';
1645 }
1646 else if (isdigit(tempbuf[i])) {
1647 pic=MFONT_0+tempbuf[i]-'0';
1648 }
1649 else if (tempbuf[i] > ' ' && tempbuf[i] < '0') {
1650 pic=MFONT_SPECIAL1+tempbuf[i]-'!';
1651 }
1652 propx+=tilesiz[pic].x;
1653 }
1654 x=(xdim>>1)-(propx>>1);
1655 }
1656 else {
1657 x=(xdim>>1)-(n<<3);
1658 }
1659 }
1660 if (y == -1) {
1661 y=(ydim>>1)-(MFONTYSTEP>>1);
1662 }
1663 else {
1664 y=MFONTYSTEP*y;
1665 if (ydim >= 400) {
1666 y<<=1;
1667 }
1668 }
1669 pic=MFONT_A;
1670 for (i=0 ; i < n ; i++) {
1671 if (isalpha(tempbuf[i])) {
1672 pic=MFONT_A+tempbuf[i]-'A';
1673 rotatesprite(x<<16, y<<16, 65536l, 0, pic, shade, palnum, 8+16, 0, 0, xdim-1, ydim-1);
1674 }
1675 else if (isdigit(tempbuf[i])) {
1676 pic=MFONT_0+tempbuf[i]-'0';
1677 rotatesprite(x<<16, y<<16, 65536l, 0, pic, shade, palnum, 8+16, 0, 0, xdim-1, ydim-1);
1678 }
1679 else if (tempbuf[i] > ' ' && tempbuf[i] < '0') {
1680 pic=MFONT_SPECIAL1+tempbuf[i]-'!';
1681 rotatesprite(x<<16, y<<16, 65536l, 0, pic, shade, palnum, 8+16, 0, 0, xdim-1, ydim-1);
1682 }
1683 if (prop) {
1684 x+=tilesiz[pic].x;
1685 }
1686 else {
1687 if (tempbuf[i] == ' ') {
1688 x+=8;
1689 }
1690 else {
1691 x+=16;
1692 }
1693 }
1694 }
1695 }
1696
1697 void
showmenu(void)1698 showmenu(void)
1699 {
1700 if (xdim < 640) {
1701 rotatesprite(160<<16,100<<16, 65536, 0, MENUSTATION, 0, 0, 2+8, 0, 0, xdim-1, ydim-1);
1702 rotatesprite(160<<16,100<<16, 65536, 0, MENUGLASS, 0, 0, 1+2+8, 0, 0, xdim-1, ydim-1);
1703 } else {
1704 rotatesprite(160<<16,50<<16, divscale15(200, tilesiz[MENUPANEL4801].y), 0, MENUPANEL4801, 0, 0, 2+8, 0, 0, xdim-1, ydim-1);
1705 rotatesprite(160<<16,150<<16, divscale15(200, tilesiz[MENUPANEL4802].y), 0, MENUPANEL4802, 0, 0, 2+8, 0, 0, xdim-1, ydim-1);
1706 }
1707 }
1708
1709 void
showhelpscreen(void)1710 showhelpscreen(void)
1711 {
1712 if (xdim < 640) {
1713 rotatesprite(160<<16,160<<16, 65536, 0, HELPSCREENPIC, 0, 0, 2+8, 0, 0, xdim-1, ydim-1);
1714 } else {
1715 rotatesprite(160<<16,50<<16, divscale15(200, tilesiz[HELPSCREEN4801].y), 0, HELPSCREEN4801, 0, 0, 2+8, 0, 0, xdim-1, ydim-1);
1716 rotatesprite(160<<16,150<<16, divscale15(200, tilesiz[HELPSCREEN4802].y), 0, HELPSCREEN4802, 0, 0, 2+8, 0, 0, xdim-1, ydim-1);
1717 }
1718 }
1719
1720 void
domenu(void)1721 domenu(void)
1722 {
1723 char pal;
1724 int i,stepy;
1725 int dax,dax2,day,day2;
1726 struct menu *mptr;
1727 static int firstpass,odiff,osoundv,omusicv,omousesens,oheadb;
1728
1729 if (activemenu == HELPSCREEN) {
1730 showhelpscreen();
1731 return;
1732 }
1733 if (firstpass == 0) {
1734 firstpass=1;
1735 getloadsavenames();
1736 odiff=difficulty;
1737 osoundv=soundv;
1738 omusicv=musicv;
1739 omousesens=mousesensitivity;
1740 oheadb=headbobon;
1741 if (headbobon) {
1742 strcpy(headbobstr,"HEAD BOB ON");
1743 }
1744 else {
1745 strcpy(headbobstr,"HEAD BOB OFF");
1746 }
1747 }
1748 if (activemenu == 255) {
1749 #ifdef DYNAMICSAVESETUP
1750 if (odiff != difficulty || osoundv != soundv
1751 || omusicv != musicv || omousesens != mousesensitivity
1752 || oheadb != headbobon) {
1753 teksavesetup();
1754 }
1755 #endif
1756 playsound( S_MENUSOUND2 ,0,0,0,ST_IMMEDIATE);
1757 setup3dscreen();
1758 activemenu=0;
1759 firstpass=0;
1760 return;
1761 }
1762 vel=svel=angvel=0;
1763 mptr=&menu[activemenu][0];
1764 if (redrawborders) {
1765 dax=windowxy1.x;
1766 dax2=windowxy2.x;
1767 day=windowxy1.y;
1768 day2=windowxy2.y;
1769 if (dax2-dax < xdim-1 || day2-day < ydim-1) {
1770 setup3dscreen();
1771 }
1772 redrawborders=0;
1773 }
1774 if (selopt == 0) {
1775 switch (activemenu) {
1776 case MENULOADGAME:
1777 case MENUSAVEGAME:
1778 selopt=1;
1779 break;
1780 }
1781 }
1782 showmenu();
1783 for (i=0 ; i < MAXSUBOPTIONS ; i++) {
1784 if (mptr->label != NULL) {
1785 if (selopt == i) {
1786 pal=4;
1787 }
1788 else {
1789 pal=mptr->pal;
1790 }
1791 mprintf(mptr->x,mptr->y,mptr->proportional,mptr->shade,pal,
1792 mptr->label);
1793 if (mptr->nextopt != NULL) {
1794 mptr=mptr->nextopt;
1795 }
1796 else {
1797 break;
1798 }
1799 }
1800 }
1801 if (activemenu == 5 && loadnewgame) { // select a mission
1802 switch (loadnewgame) {
1803 case 1: // day mission
1804 newgame("city.map");
1805 break;
1806 case 2: // night mission
1807 newgame("hospital.map");
1808 break;
1809 case 3:
1810 newgame("police.map");
1811 break;
1812 case 4:
1813 newgame("warehse.map");
1814 break;
1815 }
1816 loadnewgame=0;
1817 activemenu=255;
1818 }
1819 if (activemenu == 6 || activemenu == 7) { // load/save a game
1820 dax=(xdim>>1)-((MAXLOADSAVESIZE*tilesiz[MFONT_A].x)>>1);
1821 dax-=tilesiz[MFONT_A].x;
1822 for (i=1 ; i <= MAXLOADSAVEOPTS ; i++) {
1823 if (selopt == i) {
1824 pal=4;
1825 if (loctypemode == 0) {
1826 mprintf(dax,2+i,0,0,pal,"%d %s",i,loadsavenames[i-1]);
1827 }
1828 else {
1829 mprintf(dax,2+i,0,0,pal,"%d %s",i,lockeybuf);
1830 if (((int)totalclock) > curblinkclock) {
1831 curblinkclock=((int)totalclock)+(CLKIPS>>2);
1832 curblink^=1;
1833 }
1834 if (curblink) {
1835 day=((2+i)*MFONTYSTEP)+3;
1836 if (ydim >= 400) {
1837 day<<=1;
1838 }
1839 rotatesprite((dax+((strlen(lockeybuf)+1)*16)+5)<<16, day<<16, 65536l, 0, YELLOWLIGHTPIC,
1840 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
1841 }
1842 }
1843 }
1844 else {
1845 pal=1;
1846 mprintf(dax,2+i,0,0,pal,"%d %s",i,loadsavenames[i-1]);
1847 }
1848 }
1849 }
1850 else if (activemenu == 8) { // sound/music volume
1851 dax=(xdim>>1)-(tilesiz[SLIDERBARPIC].x>>1);
1852 day=50;
1853 if (ydim >= 400) {
1854 day<<=1;
1855 }
1856 rotatesprite(dax<<16, day<<16, 65536l, 0, SLIDERBARPIC,
1857 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
1858 rotatesprite((dax+10+(soundv*7))<<16, day<<16, 65536l, 0, SLIDERKNOBPIC,
1859 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
1860 day=86;
1861 if (ydim >= 400) {
1862 day<<=1;
1863 }
1864 rotatesprite(dax<<16, day<<16, 65536l, 0, SLIDERBARPIC,
1865 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
1866 rotatesprite((dax+10+(musicv*7))<<16, day<<16, 65536l, 0, SLIDERKNOBPIC,
1867 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
1868 }
1869 else if (activemenu == 9) { // mouse sensitivity
1870 dax=(xdim>>1)-(tilesiz[SLIDERBARPIC].x>>1);
1871 day=26;
1872 if (ydim >= 400) {
1873 day<<=1;
1874 }
1875 rotatesprite(dax<<16, day<<16, 65536l, 0, SLIDERBARPIC,
1876 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
1877 dax+=(10+(mousesensitivity*7));
1878 rotatesprite(dax<<16, day<<16, 65536l, 0, SLIDERKNOBPIC,
1879 0, 0, 8+16, 0, 0, xdim-1, ydim-1);
1880 }
1881 }
1882
1883 void
domenuinput(void)1884 domenuinput(void)
1885 {
1886 int keystate;
1887 int tries;
1888 struct menu *mptr = 0;
1889
1890 if (activemenu == 255) {
1891 return;
1892 }
1893 if (activemenu == HELPSCREEN) {
1894 if (keystatus[1]) {
1895 keystatus[1]=0;
1896 playsound( S_BEEP ,0,0,0,ST_IMMEDIATE);
1897 if (menudirect) {
1898 activemenu=255;
1899 menudirect=0;
1900 }
1901 }
1902 return;
1903 }
1904 if (loctypemode)
1905 {
1906 // TODO
1907 do
1908 //while (g_keyFIFOpos != g_keyFIFOend)
1909 {
1910 //c= g_keyFIFO[g_keyFIFOpos];
1911 //keystate= g_keyFIFO[(g_keyFIFOpos +1)&(KEYFIFOSIZ-1)];
1912 //g_keyFIFOpos =((g_keyFIFOpos +2)&(KEYFIFOSIZ-1));
1913
1914 //if (keystate != 0)
1915 {
1916 if (keystatus[sc_Escape]) { // ESC key
1917 keystatus[sc_Escape]=0;
1918 locmessagelen=0;
1919 loctypemode=0;
1920 }
1921 if (keystatus[sc_BackSpace]) { // backspace key
1922 keystatus[sc_BackSpace]=0;
1923 if (locmessagelen == 0) {
1924 break;
1925 }
1926 locmessagelen--;
1927 lockeybuf[locmessagelen]=0;
1928 }
1929 if (keystatus[sc_Enter] || keystatus[sc_kpad_Enter]) { // enter keys
1930 keystatus[sc_Enter]=keystatus[sc_kpad_Enter]=0;
1931 if (locmessagelen > 0) {
1932 strncpy(loadsavenames[selopt-1],lockeybuf,
1933 MAXLOADSAVESIZE);
1934 locmessagelen=0;
1935 }
1936 loctypemode=0;
1937 if( option[4] == 0 ) {
1938 savegame(selopt);
1939 }
1940 activemenu=255;
1941 break;
1942 }
1943 #if 0 // TODO
1944 if (locmessagelen < (MAXLOADSAVESIZE-1) && c < 128) {
1945 if (keystatus[sc_LeftShift] || keystatus[sc_RightShift]) {
1946 c=scantoascwithshift[c];
1947 }
1948 else {
1949 c=scantoasc[c];
1950 }
1951 if (c != 0) {
1952 if (isalpha(c) || isdigit(c) || c == ' ') {
1953 lockeybuf[locmessagelen++]=toupper(c);
1954 lockeybuf[locmessagelen]=0;
1955 }
1956 }
1957 }
1958 #endif
1959 }
1960 } while (0);
1961 return;
1962 }
1963 mptr=&menu[activemenu][selopt];
1964 if (keystatus[1]) {
1965 keystatus[1]=0;
1966 playsound( S_BEEP ,0,0,0,ST_IMMEDIATE);
1967 if (menudirect) {
1968 activemenu=255;
1969 menudirect=0;
1970 }
1971 else {
1972 activemenu=mptr->backmenu;
1973 }
1974 selopt=lastselopt[activemenu];
1975 if (activemenu == 0) {
1976 activemenu=255;
1977 }
1978 }
1979 else if (keystatus[keys[0]]) { // up arrow
1980 keystatus[keys[0]]=0;
1981 playsound( S_BOOP ,0,0,0,ST_IMMEDIATE);
1982 tries=0;
1983 while (tries < MAXSUBOPTIONS) {
1984 selopt--;
1985 if (selopt <= 0) {
1986 selopt=5;
1987 }
1988 lastselopt[activemenu]=selopt;
1989 if (menu[activemenu][selopt].label != NULL) {
1990 break;
1991 }
1992 tries++;
1993 }
1994 }
1995 else if (keystatus[keys[1]]) { // down arrow
1996 keystatus[keys[1]]=0;
1997 playsound( S_BOOP ,0,0,0,ST_IMMEDIATE);
1998 tries=0;
1999 while (tries < MAXSUBOPTIONS) {
2000 selopt++;
2001 if (selopt > 5) {
2002 selopt=1;
2003 }
2004 lastselopt[activemenu]=selopt;
2005 if (menu[activemenu][selopt].label != NULL) {
2006 break;
2007 }
2008 tries++;
2009 }
2010 }
2011 else if (activemenu == 4) {
2012 if (keystatus[sc_Y] != 0) { // "Y" key
2013 switch (activemenu) {
2014 case 4:
2015 gameover=1;
2016 //playsound( ??? ,0,0,0,ST_IMMEDIATE);
2017 break;
2018 case 5:
2019 //endgame=1;
2020 activemenu=255;
2021 break;
2022 }
2023 }
2024 else if (keystatus[sc_N] != 0) { // "N" key
2025 activemenu=255;
2026 }
2027 }
2028 else if (keystatus[sc_Enter] || keystatus[sc_kpad_Enter]) { // enter key
2029 keystatus[sc_Enter]=keystatus[sc_kpad_Enter]=0;
2030 playsound( S_MENUSOUND2 ,0,0,0,ST_IMMEDIATE);
2031 if (mptr->tomenu != 0) {
2032 activemenu=mptr->tomenu;
2033 selopt=lastselopt[activemenu];
2034 redrawborders=1;
2035 }
2036 else {
2037 switch (activemenu) {
2038 case 1:
2039 break;
2040 case 2:
2041 difficulty=selopt;
2042 newgame(boardfilename);
2043 activemenu=255;
2044 break;
2045 case 3:
2046 if (selopt == 3) {
2047 if (strcmp(headbobstr,"HEAD BOB ON") == 0) {
2048 strcpy(headbobstr,"HEAD BOB OFF");
2049 headbobon=0;
2050 }
2051 else {
2052 strcpy(headbobstr,"HEAD BOB ON");
2053 headbobon=1;
2054 }
2055 }
2056 break;
2057 case 5: // day/night mission
2058 loadnewgame=selopt;
2059 break;
2060 case 6: // load game
2061 stopallsounds();
2062 if( option[4] == 0 ) {
2063 loadgame(selopt);
2064 }
2065 activemenu=255;
2066 break;
2067 case 7: // save game
2068 keystatus[sc_Enter]=keystatus[sc_kpad_Enter]=0;
2069 loctypemode=1;
2070 // TODO keyfifoplc=keyfifoend;
2071 if (strcmp(loadsavenames[selopt-1],"-EMPTY-") != 0) {
2072 strncpy(lockeybuf,loadsavenames[selopt-1],
2073 MAXLOADSAVESIZE);
2074 locmessagelen=strlen(lockeybuf);
2075 }
2076 else {
2077 memset(lockeybuf,0,sizeof(lockeybuf));
2078 locmessagelen=0;
2079 }
2080 break;
2081 }
2082 }
2083 }
2084 else if (activemenu == 8 || activemenu == 9) {
2085 if (keystatus[sc_kpad_4] || keystatus[sc_LeftArrow]) { // left arrow key
2086 keystatus[sc_kpad_4]=keystatus[sc_LeftArrow]=0;
2087 switch (selopt) {
2088 case 1:
2089 if (activemenu == 8) {
2090 if (soundv > 0) {
2091 soundv--;
2092 soundmastervolume(soundv<<11);
2093 }
2094 }
2095 else {
2096 if (mousesensitivity > 0) {
2097 mousesensitivity--;
2098 }
2099 }
2100 break;
2101 case 2:
2102 if (musicv > 0) {
2103 musicv--;
2104 songmastervolume(musicv<<3);
2105 }
2106 break;
2107 }
2108 playsound( S_MENUSOUND1 ,0,0,0,ST_IMMEDIATE);
2109 }
2110 else if (keystatus[sc_kpad_6] || keystatus[sc_RightArrow]) { // right arrow key
2111 keystatus[sc_kpad_6]=keystatus[sc_RightArrow]=0;
2112 switch (selopt) {
2113 case 1:
2114 if (activemenu == 8) {
2115 if (soundv < 16) {
2116 soundv++;
2117 soundmastervolume(soundv<<11);
2118 }
2119 }
2120 else {
2121 if (mousesensitivity < 16) {
2122 mousesensitivity++;
2123 }
2124 }
2125 break;
2126 case 2:
2127 if (musicv < 16) {
2128 musicv++;
2129 songmastervolume(musicv<<3);
2130 }
2131 break;
2132 }
2133 playsound(S_MENUSOUND1 ,0,0,0,ST_IMMEDIATE);
2134 }
2135 }
2136 else if (keystatus[sc_Q]) {
2137 keystatus[sc_Q]=0;
2138 gameover=1;
2139 }
2140 }
2141
2142 void
rearview(int snum)2143 rearview(int snum)
2144 {
2145 int cposx, cposy, cposz, choriz, czoom;
2146 short cang;
2147 short plrang,plrhoriz;
2148 int oldwx1,oldwx2,oldwy1,oldwy2;
2149
2150 if( toggles[TOGGLE_REARVIEW] == 0 ) {
2151 return;
2152 }
2153
2154 oldwx1=windowxy1.x; oldwx2=windowxy2.x;
2155 oldwy1=windowxy1.y; oldwy2=windowxy2.y;
2156
2157 plrang=ang[snum];
2158 plrhoriz=ohoriz[snum];
2159 videoSetViewableArea(67,9,130,40);
2160
2161 oang[snum]=(plrang+1024)&2047;
2162 ohoriz[snum]=(200-plrhoriz);
2163
2164 cposx = oposx[snum]+mulscale(posx[snum]-oposx[snum],0,16);
2165 cposy = oposy[snum]+mulscale(posy[snum]-oposy[snum],0,16);
2166 cposz = oposz[snum]+mulscale(posz[snum]-oposz[snum],0,16);
2167 if (frameinterpolate == 0)
2168 { cposx = posx[snum]; cposy = posy[snum]; cposz = posz[snum]; }
2169 choriz = ohoriz[snum]+mulscale(horiz[snum]-ohoriz[snum],0,16);
2170 czoom = ozoom[snum]+mulscale(zoom[snum]-ozoom[snum],0,16);
2171 cang = oang[snum]+mulscale(((ang[snum]+1024-oang[snum])&2047)-1024,0,16);
2172
2173 drawrooms(cposx,cposy,cposz,cang,choriz,cursectnum[snum]);
2174 rearviewdraw=1;
2175 analyzesprites(posx[snum],posy[snum]);
2176 rearviewdraw=0;
2177 renderDrawMasks();
2178
2179 oang[snum]=plrang;
2180 ohoriz[snum]=plrhoriz;
2181 videoSetViewableArea(oldwx1,oldwy1, oldwx2,oldwy2);
2182 }
2183
2184 void
usage()2185 usage()
2186 {
2187 printf("\ntekwar [option1] [option2] .... [optionN]\n");
2188 printf("options: practice\n");
2189 printf(" nogore\n");
2190 printf(" nobriefs\n");
2191 printf(" netname [NAME]\n");
2192 printf(" noenemies\n");
2193 }
2194
2195 void
tekargv(int argc,char const * const argv[])2196 tekargv(int argc, char const * const argv[])
2197 {
2198 int p;
2199 char argmatch=0;
2200
2201 if( (argc >= 2) ) {
2202 if( strchr(argv[1],'.') != 0 ) {
2203 strcpy(boardfilename,argv[1]);
2204 if( (strcmp(boardfilename,"matrix.map") == 0) || (strcmp(boardfilename,"MATRIX.MAP") == 0) ) {
2205 mission=7;
2206 }
2207 singlemapmode=1;
2208 nobriefflag=1;
2209 }
2210 }
2211 else {
2212 strcpy(boardfilename,"subway0.map");
2213 }
2214
2215 goreflag=1;
2216
2217 for( p=1 ; p < argc ; p++ ) {
2218 if (Bstrcasecmp(argv[p],"PRACTICE") == 0) {
2219 generalplay=1;
2220 argmatch++;
2221 }
2222 if (Bstrcasecmp(argv[p],"NOVIDEOID") == 0) {
2223 novideoid=1;
2224 argmatch++;
2225 }
2226 if (Bstrcasecmp(argv[p],"NETNAME") == 0) {
2227 bypasscdcheck=1;
2228 if( (p+1) < argc ) {
2229 memset(localname,0,sizeof(localname));
2230 strncpy(localname,argv[p+1],sizeof(localname)-1);
2231 Bstrupr(localname);
2232 }
2233 argmatch++;
2234 }
2235 if (Bstrcasecmp(argv[p],"NOGORE") == 0) {
2236 argmatch++;
2237 goreflag=0;
2238 }
2239 if (Bstrcasecmp(argv[p],"NOENEMIES") == 0) {
2240 argmatch++;
2241 noenemiesflag=1;
2242 }
2243 if (Bstrcasecmp(argv[p],"NOGUARD") == 0) {
2244 argmatch++;
2245 noguardflag=1;
2246 }
2247 if (Bstrcasecmp(argv[p],"NOSTALK") == 0) {
2248 argmatch++;
2249 nostalkflag=1;
2250 }
2251 if (Bstrcasecmp(argv[p],"NOCHASE") == 0) {
2252 argmatch++;
2253 nochaseflag=1;
2254 }
2255 if (Bstrcasecmp(argv[p],"NOSTROLL") == 0) {
2256 argmatch++;
2257 nostrollflag=1;
2258 }
2259 if (Bstrcasecmp(argv[p],"DIGILOOPS") == 0) {
2260 argmatch++;
2261 digiloopflag=1;
2262 }
2263 if (Bstrcasecmp(argv[p],"NOBRIEFS") == 0) {
2264 argmatch++;
2265 nobriefflag=1;
2266 }
2267 if (Bstrcasecmp(argv[p],"DEBUG") == 0) {
2268 argmatch++;
2269 dbgflag=1;
2270 }
2271 if (Bstrcasecmp(argv[p],"COOP") == 0) {
2272 argmatch++;
2273 coopmode=1;
2274 }
2275 if (Bstrcasecmp(argv[p],"SWITCHLEVELS") == 0) {
2276 argmatch++;
2277 switchlevelsflag=1;
2278 }
2279 }
2280
2281 if( singlemapmode ) {
2282 if( access(boardfilename, F_OK) != 0 ) {
2283 printf("\ncant find %s\n", boardfilename);
2284 exit(-1);
2285 }
2286 }
2287
2288 if( (argmatch == 0) && (singlemapmode != 1) && (argc > 1) ) {
2289 usage();
2290 exit(-1);
2291 }
2292 }
2293
2294 void
tekloadmoreoptions(int fil)2295 tekloadmoreoptions(int fil)
2296 {
2297 int rv;
2298
2299 rv=read(fil,&moreoptions[0],MAXMOREOPTIONS);
2300 rv=read(fil,&toggles[0],MAXTOGGLES);
2301 rv=read(fil,&gamestuff[0],MAXGAMESTUFF<<2);
2302
2303 toggles[TOGGLE_GODMODE]=0;
2304 if (toggles[TOGGLE_REARVIEW]) {
2305 rvmoving=1;
2306 }
2307 if (toggles[TOGGLE_UPRT]) {
2308 wpmoving=1;
2309 }
2310 if (toggles[TOGGLE_HEALTH]) {
2311 hcmoving=1;
2312 }
2313 }
2314
2315 void
initmoreoptions()2316 initmoreoptions()
2317 {
2318 difficulty=moreoptions[8];
2319 soundv=moreoptions[9];
2320 musicv=moreoptions[10];
2321 mousesensitivity=moreoptions[11];
2322 headbobon=moreoptions[12];
2323
2324 screensize=gamestuff[2];
2325 brightness=gamestuff[3];
2326 biasthreshhold=gamestuff[4];
2327
2328 if( option[4] != 0 ) {
2329 difficulty=2;
2330 }
2331 }
2332
2333 void
teksavemoreoptions(int fil)2334 teksavemoreoptions(int fil)
2335 {
2336 moreoptions[8]=difficulty;
2337 moreoptions[9]=soundv;
2338 moreoptions[10]=musicv;
2339 moreoptions[11]=mousesensitivity;
2340 moreoptions[12]=headbobon;
2341
2342 gamestuff[0]=-1;
2343 gamestuff[1]=-1;
2344 gamestuff[2]=( int)screensize;
2345 gamestuff[3]=brightness;
2346 gamestuff[4]=biasthreshhold;
2347
2348 write(fil,&moreoptions[0],MAXMOREOPTIONS);
2349 write(fil,&toggles[0],MAXTOGGLES);
2350 write(fil,&gamestuff[0],MAXGAMESTUFF<<2);
2351 }
2352
2353 void
tekendscreen()2354 tekendscreen()
2355 {
2356 if( demowon )
2357 return;
2358
2359 memset(keystatus, 0, sizeof(keystatus));
2360 if( xdim == 640 ) {
2361 videoSetViewableArea(0L,0L,xdim-1,ydim-1);
2362 tileLoad(ES1A_SVGA);
2363 overwritesprite(0L,0L,ES1A_SVGA,0,0,0);
2364 tileLoad(ES1B_SVGA);
2365 overwritesprite(0L,239L,ES1B_SVGA,0,0,0);
2366 videoNextPage();
2367 fadein(0,255,50);
2368 while( (keystatus[1] == 0) && (keystatus[57] == 0) && (keystatus[28] == 0) ) {
2369 }
2370 memset(keystatus, 0, sizeof(keystatus));
2371 tileLoad(ES2A_SVGA);
2372 overwritesprite(0L,0L,ES2A_SVGA,0,0,0);
2373 tileLoad(ES2B_SVGA);
2374 overwritesprite(0L,239L,ES2B_SVGA,0,0,0);
2375 videoNextPage();
2376 while( (keystatus[1] == 0) && (keystatus[57] == 0) && (keystatus[28] == 0) ) {
2377 }
2378 }
2379 else if( xdim == 320 ) {
2380 videoSetViewableArea(0L,0L,xdim-1,ydim-1);
2381 tileLoad(ES1_VGA);
2382 overwritesprite(0L,0L,ES1_VGA,0,0,0);
2383 videoNextPage();
2384 fadein(0,255,50);
2385 while( (keystatus[1] == 0) && (keystatus[57] == 0) && (keystatus[28] == 0) ) {
2386 }
2387 memset(keystatus, 0, sizeof(keystatus));
2388 tileLoad(ES2_VGA);
2389 overwritesprite(0L,0L,ES2_VGA,0,0,0);
2390 videoNextPage();
2391 while( (keystatus[1] == 0) && (keystatus[57] == 0) && (keystatus[28] == 0) ) {
2392 }
2393 }
2394 else {
2395 videoSetViewableArea(0L,0L,xdim-1,ydim-1);
2396 tileLoad(ES1_VGA);
2397 overwritesprite(0,0,ES1_VGA,0,0x02,0);
2398 videoNextPage();
2399 fadein(0,255,50);
2400 while( (keystatus[1] == 0) && (keystatus[57] == 0) && (keystatus[28] == 0) ) {
2401 }
2402 memset(keystatus, 0, sizeof(keystatus));
2403 tileLoad(ES2_VGA);
2404 overwritesprite(0,0,ES2_VGA,0,0x02,0);
2405 videoNextPage();
2406 while( (keystatus[1] == 0) && (keystatus[57] == 0) && (keystatus[28] == 0) ) {
2407 }
2408 }
2409 }
2410
2411 char debrief=0;
2412
2413 int
choosemission()2414 choosemission()
2415 {
2416 int lastmission,before7;
2417 int clock,helpclock;
2418 char nogo,missiondone;
2419 char onlymission8=0;
2420 char cdstopped=0;
2421
2422 if( generalplay ) {
2423 return(choosemap());
2424 }
2425 if( singlemapmode ) {
2426 if( gameover == 1 ) {
2427 return(0);
2428 }
2429 else {
2430 newgame(boardfilename);
2431 return(1);
2432 }
2433 }
2434
2435 musicfade();
2436 stopallsounds();
2437 /*if( cdplaying > 0 ) {
2438 cd_stop();
2439 cdstopped=1;
2440 }*/
2441
2442 if( debrief ) {
2443 debriefing();
2444 debrief=0;
2445 }
2446
2447 fadeout(0,255,0,0,0,25);
2448
2449 if( allsymsdeposited == 1 ) {
2450 smkplayseq("FINALB");
2451 allsymsdeposited=2;
2452 }
2453 if( allsymsdeposited == 2) {
2454 mission=9;
2455 allsymsdeposited=3;
2456 goto donewgame;
2457 }
2458 if( allsymsdeposited == 3) {
2459 if( killedsonny == 1 ) {
2460 smkplayseq("FINALDB");
2461 smkplayseq("CREDITS");
2462 return(0);
2463 }
2464 else {
2465 return(0);
2466 }
2467 }
2468
2469 //playsound(S_TRANSITION,0,0,0,ST_IMMEDIATE);
2470 menusong(0);
2471 smkopenmenu("smkmm.smk");
2472 mission=0;
2473 lastmission=mission;
2474 keystatus[1]=0;
2475 smkmenuframe(1);
2476 activemenu=0;
2477
2478 if( symbols[0] && symbols[1] && symbols[2] && symbols[3] && symbols[4] &&
2479 symbols[5] && symbols[6] ) {
2480 lastmission=mission=7;
2481 onlymission8=1;
2482 }
2483
2484 choosingmission:
2485
2486 if( lastmission != mission ) {
2487 switch( lastmission ) {
2488 case 0: smkmenuframe(3); break;
2489 case 1: smkmenuframe(7); break;
2490 case 2: smkmenuframe(11); break;
2491 case 3: smkmenuframe(15); break;
2492 case 4: smkmenuframe(19); break;
2493 case 5: smkmenuframe(23); break;
2494 case 6: smkmenuframe(27); break;
2495 case 7: smkmenuframe(31); break;
2496 }
2497 }
2498 switch( mission ) {
2499 case 0: smkmenuframe(5); break;
2500 case 1: smkmenuframe(9); break;
2501 case 2: smkmenuframe(13); break;
2502 case 3: smkmenuframe(17); break;
2503 case 4: smkmenuframe(21); break;
2504 case 5: smkmenuframe(25); break;
2505 case 6: smkmenuframe(29); break;
2506 case 7: smkmenuframe(33); break;
2507 }
2508 if( symbols[0] ) {
2509 smkmenuframe(35);
2510 }
2511 if( symbols[1] ) {
2512 smkmenuframe(37);
2513 }
2514 if( symbols[2] ) {
2515 smkmenuframe(39);
2516 }
2517 if( symbols[3] ) {
2518 smkmenuframe(41);
2519 }
2520 if( symbols[4] ) {
2521 smkmenuframe(43);
2522 }
2523 if( symbols[5] ) {
2524 smkmenuframe(45);
2525 }
2526 if( symbols[6] ) {
2527 smkmenuframe(47);
2528 }
2529 lastmission=mission;
2530
2531 helpclock=(int)totalclock;
2532 while( (keystatus[1] == 0) &&
2533 (keystatus[28] == 0) &&
2534 (keystatus[57] == 0) &&
2535 (keystatus[38] == 0) &&
2536 (keystatus[203] == 0) &&
2537 (keystatus[205] == 0) &&
2538 (keystatus[200] == 0) &&
2539 (keystatus[35] == 0) &&
2540 (keystatus[208] == 0) ) {
2541 if( (((int)totalclock) - helpclock) > 1024 ) {
2542 keystatus[35]=1;
2543 }
2544 smkshowmenu();
2545 if (handleevents() && quitevent) {
2546 return 0;
2547 }
2548 };
2549
2550 if( (keystatus[203] != 0) &&(!onlymission8) ) { // LF
2551 playsound(S_MENUSOUND1,0,0,0,ST_IMMEDIATE);
2552 nextmissionleft:
2553 missiondone=0;
2554 mission--;
2555 if( mission < 0 ) mission=6;
2556 switch( mission ) {
2557 case 0: if( symbols[0] ) missiondone=1; break;
2558 case 1: if( symbols[1] ) missiondone=1; break;
2559 case 2: if( symbols[2] ) missiondone=1; break;
2560 case 3: if( symbols[3] ) missiondone=1; break;
2561 case 4: if( symbols[4] ) missiondone=1; break;
2562 case 5: if( symbols[5] ) missiondone=1; break;
2563 case 6: if( symbols[6] ) missiondone=1; break;
2564 }
2565 if( missiondone ) {
2566 goto nextmissionleft;
2567 }
2568 }
2569 else if( (keystatus[205] != 0) && (!onlymission8) ) { // RT
2570 playsound(S_MENUSOUND1,0,0,0,ST_IMMEDIATE);
2571 nextmissionright:
2572 missiondone=0;
2573 mission++;
2574 if( mission > 6 ) mission=0;
2575 switch( mission ) {
2576 case 0: if( symbols[0] ) missiondone=1; break;
2577 case 1: if( symbols[1] ) missiondone=1; break;
2578 case 2: if( symbols[2] ) missiondone=1; break;
2579 case 3: if( symbols[3] ) missiondone=1; break;
2580 case 4: if( symbols[4] ) missiondone=1; break;
2581 case 5: if( symbols[5] ) missiondone=1; break;
2582 case 6: if( symbols[6] ) missiondone=1; break;
2583 }
2584 if( missiondone ) {
2585 goto nextmissionright;
2586 }
2587 }
2588 else if( (keystatus[200] != 0) && (!onlymission8) ) { // UP
2589 if( (symbols[0] == 0) && (symbols[1] == 0) && (symbols[2] == 0) && (symbols[3] == 0) &&
2590 (symbols[4] == 0) && (symbols[5] == 0) && (symbols[6] == 0) ) {
2591 playsound(S_BOOP,0,0,0,ST_IMMEDIATE);
2592 smkmenuframe(53);
2593 clock=(int)totalclock;
2594 while( (((int)totalclock)-clock) < 128 ) {
2595 smkshowmenu();
2596 handleevents();
2597 }
2598 smkmenuframe(1);
2599 smkshowmenu();
2600 }
2601 else {
2602 playsound(S_MENUSOUND1,0,0,0,ST_IMMEDIATE);
2603 before7=lastmission;
2604 mission=7;
2605 }
2606 }
2607 else if( (keystatus[208] != 0) && (!onlymission8) ) { // DN
2608 if( mission == 7 ) {
2609 playsound(S_MENUSOUND1,0,0,0,ST_IMMEDIATE);
2610 mission=before7;
2611 lastmission=7;
2612 }
2613 }
2614 keystatus[203]=0;
2615 keystatus[205]=0;
2616 keystatus[200]=0;
2617 keystatus[208]=0;
2618
2619 #if STATS
2620 if( keystatus[31] != 0 ) {
2621 playsound(S_KEYCARDBLIP,0,0,0,ST_IMMEDIATE);
2622 smkmenuframe(49);
2623 keystatus[31]=0;
2624 while( (keystatus[1] == 0) &&
2625 (keystatus[28] == 0) &&
2626 (keystatus[57] == 0) ) {
2627 smkshowmenu();
2628 writestats();
2629 if (handleevents() && quitevent) {
2630 return 0;
2631 }
2632 }
2633 smkmenuframe(1);
2634 smkshowmenu();
2635 keystatus[1]=0;
2636 keystatus[28]=0;
2637 keystatus[57]=0;
2638 }
2639 #endif
2640
2641 if( keystatus[1] != 0 ) {
2642 playsound(S_PICKUP_BONUS,0,0,0,ST_IMMEDIATE);
2643 smkmenuframe(51);
2644 keystatus[1]=0;
2645 while( (keystatus[1] == 0) &&
2646 (keystatus[21] == 0) &&
2647 (keystatus[49] == 0) ) {
2648 smkshowmenu();
2649 if (handleevents() && quitevent) {
2650 return 0;
2651 }
2652 }
2653 if( (keystatus[49] == 1) || (keystatus[1] == 1) ) {
2654 keystatus[49]=0;
2655 keystatus[1]=0;
2656 smkmenuframe(1);
2657 smkshowmenu();
2658 }
2659 else {
2660 fadeout(0,255,0,0,0,50);
2661 return(0);
2662 }
2663 }
2664
2665 if( keystatus[35] != 0 ) {
2666 playsound(S_PICKUP_BONUS,0,0,0,ST_IMMEDIATE);
2667 keystatus[35]=0;
2668 smkmenuframe(55);
2669 keystatus[1]=0;
2670 helpclock=(int)totalclock;
2671 while( (keystatus[1] == 0) &&
2672 (keystatus[28] == 0) &&
2673 (keystatus[57] == 0) ) {
2674 if( (((int)totalclock)-helpclock) > 2048 ) {
2675 keystatus[1]=1;
2676 }
2677 smkshowmenu();
2678 if (handleevents() && quitevent) {
2679 return 0;
2680 }
2681 }
2682 keystatus[28]=0;
2683 keystatus[57]=0;
2684 keystatus[1]=0;
2685 smkmenuframe(1);
2686 smkshowmenu();
2687 }
2688
2689 if( (keystatus[1] == 0) && (keystatus[28] == 0) &&
2690 (keystatus[57] == 0) && (keystatus[38] == 0) ) {
2691 goto choosingmission;
2692 }
2693
2694 if( keystatus[38] != 0 ) {
2695 mission=8;
2696 keystatus[38]=0;
2697 activemenu=6;
2698 }
2699
2700 nogo=0;
2701 switch( mission ) {
2702 case 0: if( symbols[0] ) nogo=1; break;
2703 case 1: if( symbols[1] ) nogo=1; break;
2704 case 2: if( symbols[2] ) nogo=1; break;
2705 case 3: if( symbols[3] ) nogo=1; break;
2706 case 4: if( symbols[4] ) nogo=1; break;
2707 case 5: if( symbols[5] ) nogo=1; break;
2708 case 6: if( symbols[6] ) nogo=1; break;
2709 }
2710 if( nogo ) {
2711 playsound(S_BEEP,0,0,0,ST_IMMEDIATE);
2712 goto choosingmission;
2713 }
2714
2715 keystatus[1] =0;
2716 keystatus[28]=0;
2717 keystatus[57]=0;
2718 smkclosemenu();
2719
2720 musicfade();
2721 fadeout(0,255,0,0,0,50);
2722
2723 switch( mission ) {
2724 case 2:
2725 smkplayseq("ROSSI1");
2726 strcpy(boardfilename,"subway1.map");
2727 break;
2728 case 1:
2729 smkplayseq("DIMARCO1");
2730 strcpy(boardfilename,"subway0.map");
2731 break;
2732 case 5:
2733 smkplayseq("CONNOR1");
2734 strcpy(boardfilename,"subway2.map");
2735 break;
2736 case 4:
2737 smkplayseq("SONNY1");
2738 strcpy(boardfilename,"subway2.map");
2739 break;
2740 case 6:
2741 smkplayseq("JANUS1");
2742 strcpy(boardfilename,"subway3.map");
2743 break;
2744 case 3:
2745 smkplayseq("LOWELL1");
2746 strcpy(boardfilename,"subway1.map");
2747 break;
2748 case 0:
2749 smkplayseq("DOLLAR1");
2750 strcpy(boardfilename,"subway0.map");
2751 break;
2752 case 8:
2753 strcpy(boardfilename,"load.map");
2754 break;
2755 }
2756
2757 donewgame:
2758
2759 gameover=0;
2760 numlives=0;
2761 civillianskilled=0;
2762 mission_accomplished=0;
2763
2764 fadeout(0,255,0,0,0,50);
2765
2766 videoClearViewableArea(0);
2767 setbrightness(brightness);
2768 videoClearViewableArea(0);
2769 switch( mission ) {
2770 case 0:
2771 case 1:
2772 newgame("subway0.map");
2773 break;
2774 case 2:
2775 case 3:
2776 newgame("subway1.map");
2777 break;
2778 case 4:
2779 case 5:
2780 newgame("subway2.map");
2781 break;
2782 case 6:
2783 newgame("subway3.map");
2784 break;
2785 case 7:
2786 newgame("matrix.map");
2787 locselectedgun=7;
2788 keystatus[keys[6]]=1;
2789 break;
2790 case 8:
2791 newgame("load.map");
2792 break;
2793 case 9:
2794 newgame("final1.map");
2795 break;
2796 }
2797 videoClearViewableArea(0);
2798 //memcpy(palette, palette1, 768);
2799 dofadein=32;
2800 initpaletteshifts();
2801
2802 if( mission == 7 ) {
2803 #ifdef MUSICINMATRIX
2804 startmusic(rand()%7);
2805 #endif
2806 }
2807 else {
2808 menusong(1);
2809 }
2810 /*if( cdstopped ) {
2811 cd_play();
2812 }*/
2813
2814 // if matrix, reset time
2815 if( mission == 7 ) {
2816 seconds=minutes=hours=0;
2817 }
2818
2819 return(1);
2820 }
2821
2822 void
teksavemissioninfo(int fil)2823 teksavemissioninfo(int fil)
2824 {
2825 int rv;
2826
2827 rv=write(fil,symbols,sizeof(symbols));
2828 rv=write(fil,symbolsdeposited,sizeof(symbolsdeposited));
2829 rv=write(fil,&difficulty,sizeof(difficulty));
2830 rv=write(fil,¤tmapno,sizeof(currentmapno));
2831 #if 0
2832 rv=write(fil,&warpretang,sizeof(warpretang));
2833 rv=write(fil,&warpretsect,sizeof(warpretsect));
2834 rv=write(fil,&warpretx,sizeof(warpretx));
2835 rv=write(fil,&warprety,sizeof(warprety));
2836 rv=write(fil,&warpretz,sizeof(warpretz));
2837 #endif
2838 rv=write(fil,&mission,sizeof(mission));
2839 rv=write(fil,&numlives,sizeof(numlives));
2840 rv=write(fil,&mission_accomplished,sizeof(mission_accomplished));
2841 rv=write(fil,&civillianskilled,sizeof(civillianskilled));
2842 rv=write(fil,&generalplay,sizeof(generalplay));
2843 rv=write(fil,&singlemapmode,sizeof(singlemapmode));
2844 rv=write(fil,&allsymsdeposited,sizeof(allsymsdeposited));
2845 rv=write(fil,&killedsonny,sizeof(killedsonny));
2846 }
2847
2848 void
tekloadmissioninfo(int fil)2849 tekloadmissioninfo(int fil)
2850 {
2851 int rv;
2852
2853 musicfade();
2854
2855 rv=read(fil,symbols,sizeof(symbols));
2856 rv=read(fil,symbolsdeposited,sizeof(symbolsdeposited));
2857 rv=read(fil,&difficulty,sizeof(difficulty));
2858 rv=read(fil,¤tmapno,sizeof(currentmapno));
2859 #if 0
2860 rv=read(fil,&warpretang,sizeof(warpretang));
2861 rv=read(fil,&warpretsect,sizeof(warpretsect));
2862 rv=read(fil,&warpretx,sizeof(warpretx));
2863 rv=read(fil,&warprety,sizeof(warprety));
2864 rv=read(fil,&warpretz,sizeof(warpretz));
2865 #endif
2866 rv=read(fil,&mission,sizeof(mission));
2867 rv=read(fil,&numlives,sizeof(numlives));
2868 rv=read(fil,&mission_accomplished,sizeof(mission_accomplished));
2869 rv=read(fil,&civillianskilled,sizeof(civillianskilled));
2870 rv=read(fil,&generalplay,sizeof(generalplay));
2871 rv=read(fil,&singlemapmode,sizeof(singlemapmode));
2872 rv=read(fil,&allsymsdeposited,sizeof(allsymsdeposited));
2873 rv=read(fil,&killedsonny,sizeof(killedsonny));
2874
2875 if( generalplay == 1 ) {
2876 startmusic(rand()%7);
2877 }
2878 else {
2879 startmusic(mission);
2880 }
2881 }
2882
2883 void
teknetmenu()2884 teknetmenu()
2885 {
2886 initpaletteshifts();
2887
2888 //memcpy(palette1, palette, 768);
2889 //memset(palette, 0, 768);
2890
2891 videoClearViewableArea(0);
2892 strcpy(boardfilename,"NET1.MAP");
2893 prepareboard(boardfilename);
2894 precache();
2895
2896 videoClearViewableArea(0);
2897 //memcpy(palette, palette1, 768);
2898 fadein(0,255,16);
2899 }
2900
2901 void
copyrightscreen()2902 copyrightscreen()
2903 {
2904 videoClearViewableArea(0);
2905 smkopenmenu("smkgm.smk");
2906 smkmenuframe(81);
2907 fadein(0,255,10);
2908 while( (keystatus[1] == 0) &&
2909 (keystatus[28] == 0) &&
2910 (keystatus[57] == 0) &&
2911 (keystatus[38] == 0) &&
2912 (keystatus[203] == 0) &&
2913 (keystatus[205] == 0) &&
2914 (keystatus[200] == 0) &&
2915 (keystatus[31] == 0) &&
2916 (keystatus[35] == 0) &&
2917 (keystatus[208] == 0) ) {
2918 smkshowmenu();
2919 if (handleevents() && quitevent) {
2920 break;
2921 }
2922 };
2923 smkclosemenu();
2924 }
2925
2926 int
choosemap()2927 choosemap()
2928 {
2929 int lastmap,map,set;
2930 int clock,helpclock,stall;
2931
2932 musicfade();
2933
2934 fadeout(0,255,0,0,0,25);
2935
2936 stopallsounds();
2937 menusong(0);
2938
2939 smkopenmenu("smkgm.smk");
2940 lastmap=map=0;
2941 keystatus[1]=0;
2942 activemenu=0;
2943 set=0;
2944 smkmenuframe(1);
2945
2946 choosingmap:
2947
2948 if( lastmap != map ) {
2949 if( set == 0 ) {
2950 switch( lastmap ) {
2951 case 0: smkmenuframe( 5); break;
2952 case 1: smkmenuframe( 9); break;
2953 case 2: smkmenuframe(13); break;
2954 case 3: smkmenuframe(17); break;
2955 case 4: smkmenuframe(21); break;
2956 case 5: smkmenuframe(25); break;
2957 case 6: smkmenuframe(29); break;
2958 case 7: smkmenuframe(33); break;
2959 case 8: smkmenuframe(37); break;
2960 }
2961 }
2962 else {
2963 switch( lastmap ) {
2964 case 0: smkmenuframe(41); break;
2965 case 1: smkmenuframe(45); break;
2966 case 2: smkmenuframe(49); break;
2967 case 3: smkmenuframe(53); break;
2968 case 4: smkmenuframe(57); break;
2969 case 5: smkmenuframe(61); break;
2970 case 6: smkmenuframe(65); break;
2971 case 7: smkmenuframe(69); break;
2972 case 8: smkmenuframe(73); break;
2973 }
2974 }
2975 }
2976 if( set == 0 ) {
2977 switch( map ) {
2978 case 0: smkmenuframe( 7); break;
2979 case 1: smkmenuframe(11); break;
2980 case 2: smkmenuframe(15); break;
2981 case 3: smkmenuframe(19); break;
2982 case 4: smkmenuframe(23); break;
2983 case 5: smkmenuframe(27); break;
2984 case 6: smkmenuframe(31); break;
2985 case 7: smkmenuframe(35); break;
2986 case 8: smkmenuframe(39); break;
2987 }
2988 }
2989 else {
2990 switch( map ) {
2991 case 0: smkmenuframe(43); break;
2992 case 1: smkmenuframe(47); break;
2993 case 2: smkmenuframe(51); break;
2994 case 3: smkmenuframe(55); break;
2995 case 4: smkmenuframe(59); break;
2996 case 5: smkmenuframe(63); break;
2997 case 6: smkmenuframe(67); break;
2998 case 7: smkmenuframe(71); break;
2999 case 8: smkmenuframe(75); break;
3000 }
3001 }
3002 smkshowmenu();
3003 lastmap=map;
3004
3005 helpclock=(int)totalclock;
3006 while( (keystatus[1] == 0) &&
3007 (keystatus[28] == 0) &&
3008 (keystatus[57] == 0) &&
3009 (keystatus[38] == 0) &&
3010 (keystatus[203] == 0) &&
3011 (keystatus[205] == 0) &&
3012 (keystatus[200] == 0) &&
3013 (keystatus[31] == 0) &&
3014 (keystatus[35] == 0) &&
3015 (keystatus[208] == 0) ) {
3016 if( (((int)totalclock) - helpclock) > 1024 ) {
3017 keystatus[35]=1;
3018 }
3019 };
3020
3021 if( keystatus[203] != 0 ) { // LF
3022 map--;
3023 if( map < 0 ) {
3024 map=8;
3025 }
3026 playsound(S_MENUSOUND1,0,0,0,ST_IMMEDIATE);
3027 }
3028 else if( keystatus[205] != 0 ) { // RT
3029 map++;
3030 if( map > 8 ) {
3031 map=0;
3032 }
3033 playsound(S_MENUSOUND1,0,0,0,ST_IMMEDIATE);
3034 }
3035 else if( keystatus[200] != 0 ) { // UP
3036 switch( map ) {
3037 case 0: map=6; break;
3038 case 3: map=0; break;
3039 case 6: map=3; break;
3040 case 1: map=7; break;
3041 case 4: map=1; break;
3042 case 7: map=4; break;
3043 case 2: map=8; break;
3044 case 5: map=2; break;
3045 case 8: map=5; break;
3046 }
3047 playsound(S_MENUSOUND1,0,0,0,ST_IMMEDIATE);
3048 }
3049 else if( keystatus[208] != 0 ) { // DN
3050 switch( map ) {
3051 case 0: map=3; break;
3052 case 3: map=6; break;
3053 case 6: map=0; break;
3054 case 1: map=4; break;
3055 case 4: map=7; break;
3056 case 7: map=1; break;
3057 case 2: map=5; break;
3058 case 5: map=8; break;
3059 case 8: map=2; break;
3060 }
3061 playsound(S_MENUSOUND1,0,0,0,ST_IMMEDIATE);
3062 }
3063
3064 keystatus[203]=0;
3065 keystatus[205]=0;
3066 keystatus[200]=0;
3067 keystatus[208]=0;
3068
3069 if( keystatus[1] != 0 ) {
3070 playsound(S_PICKUP_BONUS,0,0,0,ST_IMMEDIATE);
3071 smkmenuframe(77);
3072 smkshowmenu();
3073 keystatus[1]=0;
3074 while( (keystatus[1] == 0) &&
3075 (keystatus[21] == 0) &&
3076 (keystatus[49] == 0) ) {
3077 }
3078 if( (keystatus[49] == 1) || (keystatus[1] == 1) ) {
3079 keystatus[49]=0;
3080 keystatus[1]=0;
3081 switch( set ) {
3082 case 0: smkmenuframe(1); break;
3083 case 1: smkmenuframe(3); break;
3084 }
3085 smkshowmenu();
3086 }
3087 else {
3088 fadeout(0,255,0,0,0,50);
3089 return(0);
3090 }
3091 }
3092
3093 if( keystatus[35] != 0 ) {
3094 playsound(S_PICKUP_BONUS,0,0,0,ST_IMMEDIATE);
3095 keystatus[35]=0;
3096 smkmenuframe(79);
3097 smkshowmenu();
3098 keystatus[1]=0;
3099 helpclock=(int)totalclock;
3100 while( (keystatus[1] == 0) &&
3101 (keystatus[28] == 0) &&
3102 (keystatus[57] == 0) ) {
3103 if( (((int)totalclock)-helpclock) > 2048 ) {
3104 keystatus[1]=1;
3105 }
3106 }
3107 keystatus[28]=0;
3108 keystatus[57]=0;
3109 keystatus[1]=0;
3110 switch( set ) {
3111 case 0: smkmenuframe(1); break;
3112 case 1: smkmenuframe(3); break;
3113 }
3114 smkshowmenu();
3115 }
3116
3117 if( (keystatus[1] == 0) && (keystatus[28] == 0) &&
3118 (keystatus[57] == 0) && (keystatus[38] == 0) ) {
3119 goto choosingmap;
3120 }
3121 if( (keystatus[57] != 0) || (keystatus[28] != 0) ) {
3122 switch( map ) {
3123 case 4:
3124 stall=(int)totalclock;
3125 while( (((int)totalclock)-stall) < 32 )
3126 ;
3127 if( set == 0 ) {
3128 set=1;
3129 smkmenuframe(3);
3130 smkshowmenu();
3131 }
3132 else {
3133 set=0;
3134 smkmenuframe(1);
3135 smkshowmenu();
3136 }
3137 goto choosingmap;
3138 default:
3139 break;
3140 }
3141 }
3142
3143 smkclosemenu();
3144
3145 gameover=0;
3146 numlives=0;
3147 civillianskilled=0;
3148 mission_accomplished=0;
3149
3150 fadeout(0,255,0,0,0,50);
3151
3152 videoClearViewableArea(0);
3153
3154 if( set == 0 ) {
3155 switch( map ) {
3156 case 0: newgame("level1.map"); break;
3157 case 1: newgame("level2.map"); break;
3158 case 2: newgame("city1.map"); break;
3159 case 3: newgame("beach1.map"); break;
3160
3161 case 5: newgame("park1.map"); break;
3162 case 6: newgame("mid1.map"); break;
3163 case 7: newgame("mid2.map"); break;
3164 case 8: newgame("mid3.map"); break;
3165 default: crash("chsmp: bad map num");
3166 }
3167 }
3168 else {
3169 switch( map ) {
3170 case 0: newgame("sewer1.map"); break;
3171 case 1: newgame("sewer2.map"); break;
3172 case 2: newgame("inds1.map"); break;
3173 case 3: newgame("free1.map"); break;
3174
3175 case 5: newgame("free2.map"); break;
3176 case 6: newgame("ware1.map"); break;
3177 case 7: newgame("ware2.map"); break;
3178 case 8: newgame("ware3.map"); break;
3179 default: crash("chsmp: bad map num");
3180 }
3181 }
3182
3183 videoClearViewableArea(0);
3184 dofadein=32;
3185 initpaletteshifts();
3186
3187 musicfade();
3188 startmusic(rand()%7);
3189
3190 return(1);
3191 }
3192
3193 void
missionaccomplished(int sn)3194 missionaccomplished(int sn)
3195 {
3196 int ext;
3197 char results=0;
3198
3199 if( option[4] != 0 ) {
3200 return;
3201 }
3202
3203 ext=sprptr[sn]->extra;
3204 if( !validext(ext) ) {
3205 return;
3206 }
3207
3208 if( sprXTptr[ext]->classification == CLASS_CIVILLIAN ) {
3209 civillianskilled++;
3210 }
3211 if( sprXTptr[ext]->classification != CLASS_TEKLORD ) {
3212 return;
3213 }
3214
3215 switch( sprXTptr[ext]->deathpic ) {
3216 case WINGDEATHPIC:
3217 symbols[0]=1;
3218 mission_accomplished=1;
3219 gameover=1;
3220 break;
3221 case DIDEATHPIC:
3222 symbols[1]=1;
3223 mission_accomplished=1;
3224 gameover=1;
3225 break;
3226 case SFRODEATHPIC:
3227 symbols[2]=1;
3228 mission_accomplished=1;
3229 gameover=1;
3230 break;
3231 case ANTDEATHPIC:
3232 symbols[3]=1;
3233 mission_accomplished=1;
3234 gameover=1;
3235 break;
3236 case SGOLDEATHPIC:
3237 symbols[4]=1;
3238 mission_accomplished=1;
3239 gameover=1;
3240 break;
3241 case SUNGDEATHPIC:
3242 symbols[5]=1;
3243 mission_accomplished=1;
3244 gameover=1;
3245 break;
3246 case REDHDEATHPIC:
3247 symbols[6]=1;
3248 mission_accomplished=1;
3249 gameover=1;
3250 break;
3251 case SSALDEATHPIC:
3252 killedsonny=1;
3253 mission_accomplished=1;
3254 gameover=1;
3255 break;
3256 }
3257 }
3258
3259 void
depositsymbol(int snum)3260 depositsymbol(int snum)
3261 {
3262 int i,findpic;
3263 int sym=sector[cursectnum[snum]].hitag;
3264
3265 switch( sym ) {
3266 case 0: findpic=3600; break;
3267 case 1: findpic=3604; break;
3268 case 2: findpic=3608; break;
3269 case 3: findpic=3612; break;
3270 case 4: findpic=3592; break;
3271 case 5: findpic=3596; break;
3272 case 6: findpic=3616; break;
3273 }
3274
3275 if( symbols[sym] ) {
3276 for( i=0; i<MAXSPRITES; i++ ) {
3277 if( sprptr[i]->picnum == findpic ) {
3278 sprptr[i]->picnum=findpic+1;
3279 symbolsdeposited[sym]=1;
3280 break;
3281 }
3282 }
3283 }
3284
3285 if( symbolsdeposited[0] &&
3286 symbolsdeposited[1] &&
3287 symbolsdeposited[2] &&
3288 symbolsdeposited[3] &&
3289 symbolsdeposited[4] &&
3290 symbolsdeposited[5] &&
3291 symbolsdeposited[6] ) {
3292 allsymsdeposited=1;
3293 gameover=1;
3294 }
3295 }
3296
3297 int
missionfailed()3298 missionfailed()
3299 {
3300 if( option[4] != 0 ) {
3301 return(0);
3302 }
3303
3304 numlives++;
3305
3306 switch( difficulty ) {
3307 case 0:
3308 case 1:
3309 if( numlives < 6 )
3310 return(0);
3311 break;
3312 case 2:
3313 if( numlives < 4 )
3314 return(0);
3315 break;
3316 default:
3317 if( numlives < 2 )
3318 return(0);
3319 break;
3320 }
3321
3322 mission_accomplished=0;
3323 gameover=1;
3324 return(1);
3325 }
3326
3327 void
debriefing()3328 debriefing()
3329 {
3330 if( mission_accomplished ) {
3331 if( civillianskilled == 0 ) {
3332 switch( mission ) {
3333 case 2:
3334 smkplayseq("ROSSI2");
3335 break;
3336 case 1:
3337 smkplayseq("DIMARCO2");
3338 break;
3339 case 5:
3340 smkplayseq("CONNOR2");
3341 break;
3342 case 4:
3343 smkplayseq("SONNY2");
3344 break;
3345 case 6:
3346 smkplayseq("JANUS2");
3347 break;
3348 case 3:
3349 smkplayseq("LOWELL2");
3350 break;
3351 case 0:
3352 smkplayseq("DOLLAR2");
3353 break;
3354 }
3355 }
3356 else {
3357 switch( mission ) {
3358 case 2:
3359 smkplayseq("ROSSI3");
3360 break;
3361 case 1:
3362 smkplayseq("DIMARCO3");
3363 break;
3364 case 5:
3365 smkplayseq("CONNOR3");
3366 break;
3367 case 4:
3368 smkplayseq("SONNY3");
3369 break;
3370 case 6:
3371 smkplayseq("JANUS3");
3372 break;
3373 case 3:
3374 smkplayseq("LOWELL3");
3375 break;
3376 case 0:
3377 smkplayseq("DOLLAR3");
3378 break;
3379 }
3380 }
3381 }
3382 else {
3383 if( civillianskilled == 0 ) {
3384 switch( mission ) {
3385 case 2:
3386 smkplayseq("ROSSI4");
3387 break;
3388 case 1:
3389 smkplayseq("DIMARCO4");
3390 break;
3391 case 5:
3392 smkplayseq("CONNOR4");
3393 break;
3394 case 4:
3395 smkplayseq("SONNY4");
3396 break;
3397 case 6:
3398 smkplayseq("JANUS4");
3399 break;
3400 case 3:
3401 smkplayseq("LOWELL4");
3402 break;
3403 case 0:
3404 smkplayseq("DOLLAR4");
3405 break;
3406 }
3407 }
3408 else {
3409 switch( mission ) {
3410 case 2:
3411 smkplayseq("ROSSI5");
3412 break;
3413 case 1:
3414 smkplayseq("DIMARCO5");
3415 break;
3416 case 5:
3417 smkplayseq("CONNOR5");
3418 break;
3419 case 4:
3420 smkplayseq("SONNY5");
3421 break;
3422 case 6:
3423 smkplayseq("JANUS5");
3424 break;
3425 case 3:
3426 smkplayseq("LOWELL5");
3427 break;
3428 case 0:
3429 smkplayseq("DOLLAR5");
3430 break;
3431 }
3432 }
3433 }
3434 }
3435
3436