Annotation of src/tekmsc.c, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.