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,&currentmapno,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,&currentmapno,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