Annotation of src/whmenu.c, revision 1.1.1.1

1.1       root        1: /*********************************************************************
                      2: *
                      3: *   WHMENU.C - menu code for Witchaven game
                      4: *
                      5: *********************************************************************/
                      6: 
                      7: #include "icorp.h"
                      8: //#define NOTFIXED return;
                      9: #define NOTFIXED
                     10: #define FULLSCREEN 0
                     11: 
                     12: #define SCOTTSPEED 20L
                     13: 
                     14: 
                     15: //** Les 01/17/96   - START
                     16: // Raf for swift support extern declarations
                     17: #include "swift.h"
                     18: #include <memcheck.h>
                     19: //** Les 01/17/96   - END
                     20: 
                     21: //** Les 01/17/96   - START
                     22: // Raf extern vals from whinp.c
                     23: extern int wingmanflag,
                     24:      wingmanyawsens,
                     25:      wingmanpitchsens,
                     26:      wingmanrollsens,
                     27:      wingmanzsens,
                     28:      wingmanzreverse;
                     29: 
                     30: extern SWIFT_3DStatus wingmaninfo;
                     31: 
                     32: extern short wingmankeys[];
                     33: //** Les 01/17/96   - END
                     34: 
                     35: 
                     36: int  loopinstuff;                  // here it is
                     37: extern int mousxspeed,
                     38:      mousyspeed;
                     39: 
                     40: extern int vampiretime;
                     41: extern int musiclevel;
                     42: extern int digilevel;
                     43: 
                     44: extern short gbrightness;
                     45: 
                     46: //JSA 4_27 cart and elevator sound variables
                     47: extern int cartsnd,
                     48:      gratesnd,
                     49:      lavasnd,
                     50:      batsnd;
                     51: 
                     52: extern int gameactivated;
                     53: extern int escapetomenu;
                     54: 
                     55: extern int difficulty;
                     56: extern int mapon;
                     57: 
                     58: extern int currweapon;
                     59: extern int selectedgun;
                     60: extern int currentpotion;
                     61: extern int helmettime;
                     62: extern int shadowtime;
                     63: extern int nightglowtime;
                     64: extern short brightness;
                     65: extern int strongtime;
                     66: extern int invisibletime;
                     67: extern int manatime;
                     68: extern int thunderflash;
                     69: extern int thundertime;
                     70: extern int currentorb;
                     71: extern int currweaponfired;
                     72: extern int currweaponanim;
                     73: extern int currweaponattackstyle;
                     74: extern int currweaponflip;
                     75: 
                     76: int  goreon = 1;
                     77: int  loadedgame = 0;
                     78: int  loadgo = 0;
                     79: int  musicoverride = -1;
                     80: 
                     81: char typemessage[162],
                     82:      typemessageleng = 0,
                     83:      typemode = 0;
                     84: 
                     85: char scantoasc[128] = {
                     86:      0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 0, 0,
                     87:      'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', 0, 0, 'a', 's',
                     88:      'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', 39, '`', 0, 92, 'z', 'x', 'c', 'v',
                     89:      'b', 'n', 'm', ',', '.', '/', 0, '*', 0, 32, 0, 0, 0, 0, 0, 0,
                     90:      0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1',
                     91:      '2', '3', '0', '.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                     92:      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                     93:      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                     94: };
                     95: 
                     96: char scantoascwithshift[128] = {
                     97:      0, 0, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 0, 0,
                     98:      'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', 0, 0, 'A', 'S',
                     99:      'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', 34, '~', 0, '|', 'Z', 'X', 'C', 'V',
                    100:      'B', 'N', 'M', '<', '>', '?', 0, '*', 0, 32, 0, 0, 0, 0, 0, 0,
                    101:      0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1',
                    102:      '2', '3', '0', '.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    103:      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    104:      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    105: };
                    106: 
                    107: extern int frames;
                    108: #define MAXSAVEDGAMES 8
                    109: 
                    110: struct savedgame {
                    111:      char name[20];
                    112: };
                    113: 
                    114: struct savedgame savedgamenames[MAXSAVEDGAMES];
                    115: struct savedgame quicksavedgame;
                    116: 
                    117: int  quicksaveflag;
                    118: 
                    119: extern int gameactivated;
                    120: 
                    121: void
                    122: loadsavetoscreen(void)
                    123: {
                    124:      if (svga == 0)
                    125:           permanentwritesprite(0L, 0L, ZLOADSAVE, 0, 0L, 0L, 319L, 199L, 0);
                    126:      else {
                    127:           rotatesprite(0L << 16, 0L << 16, 65536L, 0, VLOAD, 0, 0, 8 + 16, 0L, 0L, xdim - 1L, ydim - 1L);
                    128:           rotatesprite(0L << 16, 240L << 16, 65536L, 0, VSAVE, 0, 0, 8 + 16, 0L, 0L, xdim - 1L, ydim - 1L);
                    129:      }
                    130: 
                    131: }
                    132: 
                    133: void
                    134: menutoscreen(void)
                    135: {
                    136:      if (svga == 0)
                    137:           permanentwritesprite(0L, 0L, THEMAINMENUWITH, 0, 0L, 0L, 319L, 199L, 0);
                    138:      else
                    139:           rotatesprite(0L << 16, 0L << 16, 65536L, 0, VMAIN, 0, 0, 8 + 16, 0L, 0L, xdim - 1L, ydim - 1L);
                    140: 
                    141: }
                    142: 
                    143: void
                    144: menutoscreenblank(void)
                    145: {
                    146:      permanentwritesprite(0L, 0L, THEMAINMENU, 0, 0L, 0L, 319L, 199L, 0);
                    147: }
                    148: 
                    149: void
                    150: itemtoscreen(long x, long y, short dapic, signed char dashade, char dapal)
                    151: {
                    152:      permanentwritesprite(x, y, dapic, dashade, x, y, xdim - 1, ydim - 1, dapal);
                    153: }
                    154: //
                    155: // fancy font
                    156: //
                    157: // to use this function you will need to name the starting letter
                    158: // the function will then scan the string and display its chars
                    159: 
                    160: 
                    161: char fancy[41] = {'a', 'b', 'c', 'd', 'e',
                    162:      'f', 'g', 'h', 'i', 'j',
                    163:      'k', 'l', 'm', 'n', 'o',
                    164:      'p', 'q', 'r', 's', 't',
                    165:      'u', 'v', 'w', 'x', 'y',
                    166:      'z', '0', '1', '2', '3',
                    167:      '4', '5', '6', '7', '8',
                    168: '9', '!', '?', '-', ':', ' '};
                    169: 
                    170: 
                    171: void
                    172: fancyfont(long x, long y, short tilenum, char *string, char pal)
                    173: {
                    174: 
                    175:      int  i,
                    176:           j;
                    177:      int  len;
                    178:      int  incr = 0;
                    179:      int  exit = 0;
                    180:      int  number;
                    181:      char temp[40];
                    182: 
                    183:      strlwr(string);
                    184:      len = strlen(string);
                    185:      strcpy(temp, string);
                    186: 
                    187:      for (i = 0; i < len; i++) {
                    188:           tempbuf[i] = temp[i];
                    189:           for (j = 0; j < 40; j++) {
                    190:                if (tempbuf[i] == fancy[j]) {
                    191:                     number = j;
                    192:                }
                    193:           }
                    194:           if (i == 0) {
                    195:                itemtoscreen(x, y, tilenum + number, 0, pal);
                    196:                incr += tilesizx[tilenum + number] + 1;
                    197:           }
                    198:           else if (tempbuf[i] != ' ') {
                    199:                itemtoscreen(x + incr, y, tilenum + number, 0, pal);
                    200:                incr += tilesizx[tilenum + number] + 1;
                    201:           }
                    202:           else {
                    203:                incr += 8;
                    204:           }
                    205:      }
                    206: 
                    207: }
                    208: 
                    209: 
                    210: 
                    211: void
                    212: fancyfontscreen(long x, long y, short tilenum, char *string)
                    213: {
                    214: 
                    215:      int  i,
                    216:           j;
                    217:      int  len;
                    218:      int  incr = 0;
                    219:      int  exit = 0;
                    220:      int  number;
                    221:      char temp[40];
                    222: 
                    223:      strlwr(string);
                    224:      len = strlen(string);
                    225:      strcpy(temp, string);
                    226: 
                    227:      for (i = 0; i < len; i++) {
                    228:           tempbuf[i] = temp[i];
                    229:           for (j = 0; j < 40; j++) {
                    230:                if (tempbuf[i] == fancy[j]) {
                    231:                     number = j;
                    232:                }
                    233:           }
                    234:           if (i == 0) {
                    235:                overwritesprite(x, y, tilenum + number, 0, 0x02, 7);
                    236:                incr += tilesizx[tilenum + number] + 1;
                    237:           }
                    238:           else if (tempbuf[i] != ' ') {
                    239:                overwritesprite(x + incr, y, tilenum + number, 0, 0x02, 7);
                    240:                incr += tilesizx[tilenum + number] + 1;
                    241:           }
                    242:           else
                    243:                incr += 8;
                    244:      }
                    245: 
                    246: }
                    247: 
                    248: 
                    249: int
                    250: menuscreen(struct player * plr)
                    251: {
                    252: 
                    253:      struct {
                    254:           long x;
                    255:           long y;
                    256:      }    redpic[5] = {
                    257:           {
                    258:                94, 8
                    259:           },
                    260:           {
                    261:                88, 39
                    262:           },
                    263:           {
                    264:                95, 67
                    265:           },
                    266:           {
                    267:                114, 101
                    268:           },
                    269:           {
                    270:                112, 120
                    271:           }
                    272:      };
                    273: 
                    274:      struct {
                    275:           long x;
                    276:           long y;
                    277:      }    sredpic[5] = {
                    278:           {
                    279:                209, 102
                    280:           },
                    281:           {
                    282:                206, 136
                    283:           },
                    284:           {
                    285:                213, 177
                    286:           },
                    287:           {
                    288:                235, 208
                    289:           },
                    290:           {
                    291:                222, 242
                    292:           }
                    293:      };
                    294: 
                    295: 
                    296:      int  exit = 0;
                    297:      int  select = 0;
                    298:      short redpicnum;
                    299:      long goaltime;
                    300:      int  i;
                    301:      int  cnt = 0;
                    302: 
                    303:      // clearview(0L);  //Clear screen to specified color
                    304: 
                    305:      if (netgame) {
                    306:           return (0);
                    307: //        netkillme();
                    308:      }
                    309: 
                    310: //JSA BLORB
                    311:      SND_CheckLoops();
                    312: 
                    313:      redpicnum = THENEWGAME;
                    314: 
                    315:      keystatus[1] = keystatus[0x1c] = keystatus[0x9c] = 0;
                    316: 
                    317:      goaltime = totalclock + SCOTTSPEED;
                    318: 
                    319:      if (svga == 1) {
                    320:           setview(0L, 0L, 639L, 479L);
                    321:           rotatesprite(0L << 16, 0L << 16, 65536L, 0, VMAIN, 0,
                    322:                        0, 8 + 16, 0L, 0L, xdim - 1L, ydim - 1L);
                    323:      }
                    324: 
                    325:      while (!exit) {
                    326: 
                    327:           menutoscreen();
                    328: 
                    329:           if (select < 5) {
                    330:                if (svga == 0) {
                    331:                     switch (cnt) {
                    332:                     case 0:
                    333:                          redpicnum = THENEWGAME + select;
                    334:                          break;
                    335:                     case 1:
                    336:                          redpicnum = ZFLASHER1 + select;
                    337:                          break;
                    338:                     case 2:
                    339:                          redpicnum = ZFLASHER2 + select;
                    340:                          break;
                    341:                     }
                    342:                     itemtoscreen(redpic[select].x, redpic[select].y, redpicnum, 0, 0);
                    343:                }
                    344:                else {
                    345:                     switch (cnt) {
                    346:                     case 0:
                    347:                          redpicnum = VNEW + select;
                    348:                          break;
                    349:                     case 1:
                    350:                          redpicnum = SFLASH1 + select;
                    351:                          break;
                    352:                     case 2:
                    353:                          redpicnum = SFLASH2 + select;
                    354:                          break;
                    355:                     }
                    356:                     rotatesprite((sredpic[select].x) << 16, (sredpic[select].y) << 16, 65536L, 0,
                    357:                        redpicnum, 0, 0, 8 + 16, 0L, 0L, xdim - 1L, ydim - 1L);
                    358:                }
                    359:           }
                    360: 
                    361:           nextpage();
                    362:           if (totalclock >= goaltime) {
                    363:                goaltime = totalclock + SCOTTSPEED;
                    364:                cnt++;
                    365:                if (cnt > 2)
                    366:                     cnt = 0;
                    367:                if (keystatus[0xd0] || keystatus[0x50]) {
                    368:                     TEMPSND();
                    369:                     select++;
                    370:                     if (select > 4)
                    371:                          select = 0;
                    372:                }
                    373:                if (keystatus[0xc8] || keystatus[0x48]) {
                    374:                     TEMPSND();
                    375:                     select--;
                    376:                     if (select < 0)
                    377:                          select = 4;
                    378:                }
                    379:                if (keystatus[1] > 0) {
                    380:                     TEMPSND();
                    381:                     if (gameactivated == 1) {
                    382:                          // select=5;
                    383:                          lockclock = totalclock;
                    384:                          exit = 1;
                    385:                     }
                    386:                     else
                    387:                          select = 4;
                    388:                     keystatus[1] = 0;
                    389:                }
                    390:                if (keystatus[0x1c] > 0 || keystatus[0x9c] > 0) {
                    391:                     keystatus[0x1c] = keystatus[0x9c] = 0;
                    392:                     keystatus[1] = 0;
                    393:                     switch (select) {
                    394:                     case 0:        // ok
                    395:                          gameactivated = 0;
                    396:                          srand(totalclock & 30000);
                    397:                          // tille maps are finished
                    398:                          // if(loadedgame == 0 && netgame == 0)
                    399:                          // mapon=1;
                    400: #if 0
                    401:                          if (netgame) {
                    402:                               netpickmonster();
                    403:                               exit = 1;
                    404:                               break;
                    405:                          }
                    406: #endif
                    407:                          SND_Sound(S_WARP);
                    408:                          startnewgame(plr);
                    409:                          gameactivated = 1;
                    410:                          exit = 1;
                    411:                          keystatus[0x1c] = keystatus[0x9c] = 0;
                    412:                          keystatus[1] = 0;
                    413:                          break;
                    414:                     case 1:
                    415:                          TEMPSND();
                    416:                          loadsave(plr);
                    417:                          if (loadgo == 1)
                    418:                               exit = 1;
                    419:                          loadgo = 0;
                    420:                          keystatus[0x1c] = keystatus[0x9c] = 0;
                    421:                          keystatus[1] = 0;
                    422:                          break;
                    423:                     case 2:
                    424:                          TEMPSND();
                    425:                          optionspage();
                    426:                          keystatus[0x1c] = keystatus[0x9c] = 0;
                    427:                          keystatus[1] = 0;
                    428:                          break;
                    429:                     case 3:
                    430:                          TEMPSND();
                    431:                          help();
                    432:                          break;
                    433:                     case 4:
                    434:                          TEMPSND();
                    435:                          quit();
                    436:                          break;
                    437:                     case 5:
                    438:                          lockclock = totalclock;
                    439:                          exit = 1;
                    440:                          updatepics();
                    441:                          break;
                    442:                     }              // switch
                    443:                }                   // if
                    444:           }                        // the delay
                    445:      }                             // while
                    446: 
                    447:      escapetomenu = 0;
                    448: 
                    449: //      if (netgame) {
                    450: //          netreviveme();
                    451: //      }
                    452: 
                    453:      return (0);
                    454: }
                    455: 
                    456: //JUNE8
                    457: #define  MAXHELPSCREENS   10
                    458: 
                    459: void
                    460: help(void)
                    461: {
                    462: 
                    463:      int thenames[MAXHELPSCREENS] = {
                    464:           ZWEAPON,
                    465:           ZSPELL,
                    466:           ZPOTION,
                    467:           ZMOVE,
                    468:           ZMOVE2,
                    469:           ZKEN,
                    470:           ZCREDITS,
                    471:           ZCREDITS2,
                    472:           ZARTIST,
                    473:           ZCREDITS3
                    474:      }, sthenames[MAXHELPSCREENS] = {
                    475:           1064,1063,1060,1059,1061,VCREDIT1,1057,1062,1056,1058
                    476:      };
                    477: 
                    478:      int  select = 0;
                    479:      long goaltime;
                    480:      int  exit = 0;
                    481: 
                    482:      while (!exit) {
                    483:           if (totalclock >= goaltime) {
                    484: 
                    485:                if (svga == 0) {
                    486:                     menutoscreenblank();
                    487:                     itemtoscreen(0L, 0L, thenames[select], 0, 0);
                    488:                }
                    489:                else {
                    490:                     rotatesprite(0L << 16, 0L << 16, 65536L, 0, VMAINBLANK, 0,
                    491:                                  0, 8 + 16, 0L, 0L, xdim - 1L, ydim - 1L);
                    492:                     rotatesprite(0L << 16, 0L << 16, 65536L, 0,
                    493:                                  sthenames[select], 0, 0, 8 + 16, 0L, 0L,
                    494:                                  xdim - 1L, ydim - 1L);
                    495:                }
                    496: 
                    497:                nextpage();
                    498:                goaltime = totalclock + SCOTTSPEED;
                    499:                if (keystatus[0xd0]
                    500:                    || keystatus[keys[KEYRIGHT]]
                    501:                    || keystatus[RDN]
                    502:                    || keystatus[keys[KEYBACK]]
                    503:                    || keystatus[RRIGHT]) {
                    504:                     TEMPSND();
                    505:                     select++;
                    506:                     if (select > 9)
                    507:                          select = 9;
                    508:                }
                    509:                if (keystatus[0xc8]
                    510:                    || keystatus[keys[KEYLEFT]]
                    511:                    || keystatus[RUP]
                    512:                    || keystatus[keys[KEYFWD]]
                    513:                    || keystatus[RLEFT]) {
                    514:                     TEMPSND();
                    515:                     select--;
                    516:                     if (select < 0)
                    517:                          select = 0;
                    518:                }
                    519:                if (keystatus[1] > 0) {
                    520:                     exit = 1;
                    521:                     keystatus[1] = 0;
                    522:                }
                    523:                if (keystatus[0x1c] > 0 || keystatus[0x9c] > 0) {
                    524:                     exit = 2;
                    525:                     keystatus[0x1c] = keystatus[0x9c] = 0;
                    526:                }
                    527:           }
                    528:      }
                    529:      keystatus[1] = keystatus[0x1c] = keystatus[0x9c] = 0;
                    530: 
                    531: }
                    532: 
                    533: //JUNE6
                    534: void
                    535: loadsave(struct player * plr)
                    536: {
                    537: 
                    538:      int  exit = 0;
                    539:      int  select = 0;
                    540:      long goaltime;
                    541:      int  cnt = 0;
                    542:      short redpicnum;
                    543: 
                    544:      struct {
                    545:           long x;
                    546:           long y;
                    547:      }    spic[2] = {{
                    548:                229, 152
                    549:      },
                    550:      {
                    551:           233, 190
                    552:      }
                    553:      };
                    554: 
                    555:      goaltime = totalclock + SCOTTSPEED;
                    556: 
                    557:      while (!exit) {
                    558:           loadsavetoscreen();
                    559:           if (svga == 0) {
                    560:                if (select == 0) {
                    561:                     switch (cnt) {
                    562:                     case 0:
                    563:                          itemtoscreen(109L, 46L, DALOAD, 0, 0);
                    564:                          break;
                    565:                     case 1:
                    566:                          itemtoscreen(109L, 46L, ZFLASHER1 + 8, 0, 0);
                    567:                          break;
                    568:                     case 2:
                    569:                          itemtoscreen(109L, 46L, ZFLASHER2 + 8, 0, 0);
                    570:                          break;
                    571:                     }
                    572:                }
                    573:                else {
                    574:                     switch (cnt) {
                    575:                     case 0:
                    576:                          itemtoscreen(112L, 77L, DASAVE, 0, 0);
                    577:                          break;
                    578:                     case 1:
                    579:                          itemtoscreen(112L, 77L, ZFLASHER1 + 9, 0, 0);
                    580:                          break;
                    581:                     case 2:
                    582:                          itemtoscreen(112L, 77L, ZFLASHER2 + 9, 0, 0);
                    583:                          break;
                    584:                     }
                    585:                }
                    586:           }
                    587:           else {
                    588:                if (select == 0) {
                    589:                     switch (cnt) {
                    590:                     case 0:
                    591:                          redpicnum = SFLASH3 + select;
                    592:                          break;
                    593:                     case 1:
                    594:                          redpicnum = SFLASH1 + 5 + select;
                    595:                          break;
                    596:                     case 2:
                    597:                          redpicnum = SFLASH2 + 5 + select;
                    598:                          break;
                    599:                     }
                    600:                }
                    601:                else {
                    602:                     switch (cnt) {
                    603:                     case 0:
                    604:                          redpicnum = SFLASH3 + select;
                    605:                          break;
                    606:                     case 1:
                    607:                          redpicnum = SFLASH1 + 5 + select;
                    608:                          break;
                    609:                     case 2:
                    610:                          redpicnum = SFLASH2 + 5 + select;
                    611:                          break;
                    612:                     }
                    613:                }
                    614:                rotatesprite((spic[select].x) << 16, (spic[select].y) << 16, 65536L, 0,
                    615:                        redpicnum, 0, 0, 8 + 16, 0L, 0L, xdim - 1L, ydim - 1L);
                    616:           }
                    617:           if (totalclock >= goaltime) {
                    618:                goaltime = totalclock + SCOTTSPEED;
                    619:                cnt++;
                    620:                if (cnt > 2)
                    621:                     cnt = 0;
                    622:                if (keystatus[keys[KEYBACK]] || keystatus[RDN]) {
                    623:                     TEMPSND();
                    624:                     select = 1;
                    625:                }
                    626:                if (keystatus[keys[KEYFWD]] || keystatus[RUP]) {
                    627:                     TEMPSND();
                    628:                     select = 0;
                    629:                }
                    630:                if (keystatus[1] > 0) {
                    631:                     exit = 1;
                    632:                     keystatus[1] = 0;
                    633:                }
                    634:                if (keystatus[0x1c] > 0 || keystatus[0x9c] > 0) {
                    635:                     exit = 2;
                    636:                     keystatus[0x1c] = keystatus[0x9c] = 0;
                    637:                }
                    638:           }
                    639:           nextpage();
                    640:      }
                    641: 
                    642:      keystatus[1] = 0;
                    643: 
                    644:      if (exit == 2)
                    645:           switch (select) {
                    646:           case 0:                  // ok
                    647:                loadgame(plr);
                    648:                break;
                    649:           case 1:                  // ok
                    650:                if (gameactivated == 1)
                    651:                     savegame(plr);
                    652:                break;
                    653:           }
                    654: 
                    655: }
                    656: 
                    657: //JUNE6
                    658: void
                    659: quit(void)
                    660: {
                    661: 
                    662:      int  exit = 0;
                    663:      long goaltime;
                    664:      char temp[20];
                    665: 
                    666:      if (svga == 0) {
                    667:           menutoscreenblank();
                    668:           itemtoscreen(102L, 76L, ZSURE, 0, 0);
                    669:      }
                    670:      else {
                    671:           rotatesprite(0L << 16, 0L << 16, 65536L, 0, VMAINBLANK, 0,
                    672:                        0, 8 + 16, 0L, 0L, xdim - 1L, ydim - 1L);
                    673:           itemtoscreen((xdim>>1)-58, (ydim>>1)-24, ZSURE, 0, 0);
                    674:      }
                    675: 
                    676:      nextpage();
                    677: 
                    678:      while (!exit) {
                    679: 
                    680:           if (keystatus[0x9c] > 0 || keystatus[0x1c] > 0 || keystatus[0x15] > 0) {
                    681:                exit = 1;
                    682:                keystatus[0x1c] = keystatus[0x9c] = 0;
                    683:           }
                    684: 
                    685: 
                    686:           if (keystatus[1] > 0 || keystatus[0x31] > 0) {
                    687:                exit = 2;
                    688:                keystatus[1] = 0;
                    689:           }
                    690:      }
                    691: 
                    692:      if (exit == 2) {
                    693:           keystatus[1] = 0;
                    694:      }
                    695:      else {
                    696:           if (svga == 1) {
                    697:                permanentwritesprite(0, 0, STHEORDER, 0, 0, 0, 639, 239, 0);
                    698:                permanentwritesprite(0, 240, STHEORDER + 1, 0, 0, 240, 639, 479, 0);
                    699:                nextpage();
                    700:                exit = 0;
                    701:                while (!exit) {
                    702:                     if (keystatus[0x39] > 0 || keystatus[1] > 0)
                    703:                          exit = 1;
                    704:                }
                    705:                keystatus[0x39] = 0;
                    706:                keystatus[1] = 0;
                    707:           }
                    708:           else {
                    709:                keystatus[0x39] = 0;
                    710:                keystatus[1] = 0;
                    711:                exit = 0;
                    712:                while (!exit) {
                    713:                     if (keystatus[0x39] > 0 || keystatus[1] > 0)
                    714:                          exit = 1;
                    715:                     // overwritesprite(0,0,ORDER1,0,0,0);
                    716:                     // overwritesprite(0,0,ORDER1,0,4,0);
                    717:                     itemtoscreen(0L, 0L, THEORDER, 0, 0);
                    718:                     nextpage();
                    719:                }
                    720:                keystatus[0x39] = 0;
                    721:                keystatus[1] = 0;
                    722:                exit = 0;
                    723:                /* while( !exit ){ if(keystatus[0x39] > 0 || keystatus[1] > 0)
                    724:                 * exit=1; //overwritesprite(0,0,ORDER2,0,0,0);
                    725:                 * //overwritesprite(0,0,ORDER2,0,4,0);
                    726:                 * itemtoscreen(0L,0L,ORDER2,0,0); nextpage(); }
                    727:                 * keystatus[0x39]=0; keystatus[1]=0; exit=0; */
                    728:           }
                    729:           shutdown();
                    730:      }
                    731: 
                    732: }
                    733: 
                    734: void
                    735: thedifficulty(void)
                    736: {
                    737: 
                    738:      struct {
                    739:           int  x;
                    740:           int  y;
                    741:      }    redpic[4] = {
                    742:           {
                    743:                152, 131 + 5
                    744:           },
                    745:           {
                    746:                184, 131 + 5
                    747:           },
                    748:           {
                    749:                219, 129 + 5
                    750:           },
                    751:           {
                    752:                261, 128 + 5
                    753:           }
                    754:      };
                    755: 
                    756: 
                    757: 
                    758:      int  exit = 0;
                    759:      int  selected;
                    760:      int  select;
                    761:      int  select2 = 0;
                    762:      int  select3 = goreon;
                    763:      int  redpicnum;
                    764:      int  pickone = 0;
                    765:      long goaltime;
                    766:      int  cnt = 0;
                    767: 
                    768:      struct player *plr;
                    769: 
                    770:      plr = &player[0];
                    771: 
                    772:      select = difficulty - 1;
                    773:      keystatus[1] = 0;
                    774:      keystatus[0x1c] = 0;
                    775:      keystatus[0x9c] = 0;
                    776: 
                    777:      if (svga == 0) {
                    778:           permanentwritesprite(0L, 0L, ZZGORE, 0, 0L, 0L, 319L, 199L, 0);
                    779:           itemtoscreen(66L, 9L, ZZBLOOD, 0, 0);
                    780:      }
                    781:      else {
                    782:           permanentwritesprite(0L, 0L, VGOREA, 0, 0L, 0L, xdim-1L, ydim-1L, 0);
                    783:           permanentwritesprite(0L, 240L, VGOREB, 0, 0L, 0L, xdim-1L, ydim-1L, 0);
                    784:           itemtoscreen((xdim>>1)-160L+37L, (ydim>>1)-100L-1L, 3702, 0, 0);
                    785:      }
                    786: 
                    787:      if (goreon == 1) {
                    788:           itemtoscreen((long) ((xdim - tilesizx[NOGORESHADOW]) >> 1),
                    789:                        (svga == 0) ? (ydim >> 1) - 100L + 72L :
                    790:                                      (ydim >> 1) - 100L + 80L,
                    791:                        NOGORESHADOW, 0, 0);
                    792:           itemtoscreen((long) ((xdim - tilesizx[GORESOLID]) >> 1),
                    793:                        (svga == 0) ? (ydim >> 1) - 100L + 69L :
                    794:                                      (ydim >> 1) - 100L + 77L,
                    795:                        GORESOLID, 0, 0);
                    796:      }
                    797:      else {
                    798:           itemtoscreen((long) ((xdim - tilesizx[NOGORESOLID]) >> 1),
                    799:                        (svga == 0) ? (ydim >> 1) - 100L + 72L :
                    800:                                      (ydim >> 1) - 100L + 80L,
                    801:                        NOGORESOLID, 0, 0);
                    802:           itemtoscreen((long) ((xdim - tilesizx[GORESHADOW]) >> 1),
                    803:                        (svga == 0) ? (ydim >> 1) - 100L + 69L :
                    804:                                      (ydim >> 1) - 100L + 77L,
                    805:                        GORESHADOW, 0, 0);
                    806:      }
                    807: 
                    808:      goaltime = totalclock + SCOTTSPEED;
                    809: 
                    810:      while (!exit) {
                    811: 
                    812:           if (totalclock >= goaltime) {
                    813:                goaltime = totalclock + SCOTTSPEED;
                    814:                cnt++;
                    815:                if (cnt > 2)
                    816:                     cnt = 0;
                    817: 
                    818:                if (keystatus[keys[KEYFWD]] > 0 || keystatus[RUP] > 0) {
                    819:                     TEMPSND();
                    820:                     select2 = 0;
                    821:                }
                    822:                if (keystatus[keys[KEYBACK]] > 0 || keystatus[RDN] > 0) {
                    823:                     TEMPSND();
                    824:                     select2 = 1;
                    825:                }
                    826:                if (select2 == 0)
                    827:                     pickone = 0;
                    828:                else
                    829:                     pickone = 1;
                    830: 
                    831:                redpicnum = HORNYSKULL1 + select;
                    832: 
                    833:                if (svga == 0) {
                    834:                     permanentwritesprite(0L, 0L, ZZGORE, 0,
                    835:                                          0L, 0L, 319L, 199L, 0);
                    836:                }
                    837:                else {
                    838:                     permanentwritesprite(0L, 0L, VGOREA, 0,
                    839:                                          0L, 0L, xdim-1L, ydim-1L, 0);
                    840:                     permanentwritesprite(0L, 240L, VGOREB, 0,
                    841:                                          0L, 0L, xdim-1L, ydim-1L, 0);
                    842:                }
                    843: 
                    844:                if (select2 == 0) {
                    845:                     switch (cnt) {
                    846:                     case 0:
                    847:                          itemtoscreen((svga == 0) ? (xdim >> 1) - 160L + 66L :
                    848:                                                     (xdim >> 1) - 160L + 37L,
                    849:                                       (svga == 0) ? (ydim >> 1) - 100L + 9L :
                    850:                                                     (ydim >> 1) - 100L - 1L,
                    851:                                       (svga == 0) ? ZZBLOOD : 3690,
                    852:                                       0, 0);
                    853:                          break;
                    854:                     case 1:
                    855:                          itemtoscreen((svga == 0) ? (xdim >> 1) - 160L + 66L :
                    856:                                                     (xdim >> 1) - 160L + 37L,
                    857:                                       (svga == 0) ? (ydim >> 1) - 100L + 9L :
                    858:                                                     (ydim >> 1) - 100L - 1L,
                    859:                                       (svga == 0) ? ZFLASHER1 + 10 : 3702,
                    860:                                       0, 0);
                    861:                          break;
                    862:                     case 2:
                    863:                          itemtoscreen((svga == 0) ? (xdim >> 1) - 160L + 66L :
                    864:                                                     (xdim >> 1) - 160L + 37L,
                    865:                                       (svga == 0) ? (ydim >> 1) - 100L + 9L :
                    866:                                                     (ydim >> 1) - 100L - 1L,
                    867:                                       (svga == 0) ? ZFLASHER2 + 10 : 3709,
                    868:                                       0, 0);
                    869:                          break;
                    870:                     }
                    871: 
                    872:                }
                    873:                else {
                    874:                     switch (cnt) {
                    875:                     case 0:
                    876:                          itemtoscreen((svga == 0) ? (xdim >> 1) - 160L + 72L :
                    877:                                                     (xdim >> 1) - 160L + 48L,
                    878:                                       (svga == 0) ? (ydim >> 1) - 100L + 74L :
                    879:                                                     (ydim >> 1) - 100L + 74L,
                    880:                                       (svga == 0) ? ZZDIFFICULTY : 3691,
                    881:                                       0, 0);
                    882:                          break;
                    883:                     case 1:
                    884:                          itemtoscreen((svga == 0) ? (xdim >> 1) - 160L + 72L :
                    885:                                                     (xdim >> 1) - 160L + 48L,
                    886:                                       (svga == 0) ? (ydim >> 1) - 100L + 74L :
                    887:                                                     (ydim >> 1) - 100L + 74L,
                    888:                                       (svga == 0) ? ZFLASHER1 + 11 : 3703,
                    889:                                       0, 0);
                    890:                          break;
                    891:                     case 2:
                    892:                          itemtoscreen((svga == 0) ? (xdim >> 1) - 160L + 72L :
                    893:                                                     (xdim >> 1) - 160L + 48L,
                    894:                                       (svga == 0) ? (ydim >> 1) - 100L + 74L :
                    895:                                                     (ydim >> 1) - 100L + 74L,
                    896:                                       (svga == 0) ? ZFLASHER2 + 11 : 3710,
                    897:                                       0, 0);
                    898:                          break;
                    899:                     }
                    900:                }
                    901: 
                    902:                itemtoscreen((long) ((xdim - tilesizx[HORNYBACK]) >> 1),
                    903:                                    (svga == 0) ? (ydim >> 1) - 100L + 136L :
                    904:                                                  (ydim >> 1) - 100L + 144L,
                    905:                                    HORNYBACK, 0, 0);
                    906:                itemtoscreen((long) (xdim >> 1) - 160L + (redpic[select].x - 64),
                    907:                                    (svga == 0) ?
                    908:                                    (ydim >> 1)-100L+(redpic[select].y+3) :
                    909:                                    (ydim >> 1)-100L+(redpic[select].y+3)+8L,
                    910:                                    redpicnum, 0, 0);
                    911: 
                    912:                if (goreon == 1) {
                    913:                     itemtoscreen((long) (xdim >> 1) - 160L + (160 - 64),
                    914:                                         (svga == 0) ? (ydim >> 1)-100L+72L :
                    915:                                                       (ydim >> 1)-100L+80L,
                    916:                                         NOGORESHADOW, 0, 0);
                    917:                     itemtoscreen((long) (xdim >> 1) - 160L + (160 + 32),
                    918:                                         (svga == 0) ? (ydim >> 1)-100L+69L :
                    919:                                                       (ydim >> 1)-100L+77L,
                    920:                                         GORESOLID, 0, 0);
                    921:                }
                    922:                else {
                    923:                     itemtoscreen((long) (xdim >> 1) - 160L + (160 - 64),
                    924:                                         (svga == 0) ? (ydim >> 1)-100L+72L :
                    925:                                                       (ydim >> 1)-100L+80L,
                    926:                                         NOGORESOLID, 0, 0);
                    927:                     itemtoscreen((long) (xdim >> 1) - 160L + (160 + 32),
                    928:                                         (svga == 0) ? (ydim >> 1)-100L+69L :
                    929:                                                       (ydim >> 1)-100L+77L,
                    930:                                         GORESHADOW, 0, 0);
                    931:                }
                    932: 
                    933:                if (pickone == 1) {
                    934:                     if (keystatus[keys[KEYLEFT]] > 0 || keystatus[RLEFT] > 0) {
                    935:                          TEMPSND();
                    936:                          select--;
                    937:                          if (select < 0)
                    938:                               select = 0;
                    939:                     }
                    940:                     if (keystatus[keys[KEYRIGHT]] > 0 || keystatus[RRIGHT] > 0) {
                    941:                          TEMPSND();
                    942:                          select++;
                    943:                          if (select > 3)
                    944:                               select = 3;
                    945:                     }
                    946:                     selected = select;
                    947:                }
                    948:                else {
                    949:                     if (keystatus[keys[KEYLEFT]] > 0 || keystatus[RLEFT] > 0) {
                    950:                          TEMPSND();
                    951:                          select3 = 0;
                    952:                     }
                    953:                     if (keystatus[keys[KEYRIGHT]] > 0 || keystatus[RRIGHT] > 0) {
                    954:                          TEMPSND();
                    955:                          select3 = 1;
                    956:                     }
                    957:                     if (select3 == 0)
                    958:                          goreon = 0;
                    959:                     else
                    960:                          goreon = 1;
                    961:                }
                    962:                if (keystatus[0x1c] > 0 || keystatus[0x9c] > 0) {
                    963:                     exit = 1;
                    964:                     keystatus[0x1c] = keystatus[0x9c] = 0;
                    965:                }
                    966:                if (keystatus[1] > 0) {
                    967:                     exit = 2;
                    968:                     keystatus[1] = 0;
                    969:                }
                    970:                nextpage();
                    971:           }                        // IF
                    972: 
                    973:      }                             // WHILE
                    974: 
                    975:      if (exit == 1) {
                    976:           switch (selected) {
                    977:           case 0:
                    978:                difficulty = 1;
                    979:                break;
                    980:           case 1:
                    981:                difficulty = 2;
                    982:                break;
                    983:           case 2:
                    984:                difficulty = 3;
                    985:                break;
                    986:           case 3:
                    987:                difficulty = 4;
                    988:                break;
                    989:           }
                    990:      }
                    991: 
                    992: 
                    993: }
                    994: 
                    995: extern
                    996: int  justteleported,
                    997:      mapflag,
                    998:      nobreakflag,
                    999:      show2dobjectsflag,
                   1000:      show2dmapflag;
                   1001: 
                   1002: void
                   1003: startnewgame(struct player * plr)
                   1004: {
                   1005: 
                   1006:      char temp[20];
                   1007:      char tempshow2dsector[MAXSECTORS >> 3];
                   1008:      char tempshow2dwall[MAXWALLS >> 3];
                   1009:      char tempshow2dsprite[MAXSPRITES >> 3];
                   1010:      int  i;
                   1011: 
                   1012:      justteleported=0;
                   1013:      if (netgame) {
                   1014:           // dolevelmusic(0);
                   1015:           // SND_StartMusic(mapon-1);
                   1016:           goto skip;
                   1017:      }
                   1018:      if (loadedgame == 0) {
                   1019:           if (mapflag == 0) {
                   1020:                mapon = 1;
                   1021:           }
                   1022:           strcpy(boardname, "level");
                   1023:           itoa(mapon, temp, 10);
                   1024:           strcat(boardname, temp);
                   1025:           strcat(boardname, ".map");
                   1026:           setupboard(boardname);
                   1027:           initplayersprite();
                   1028:           cleanup();
                   1029:           if (musicoverride == -1) {
                   1030:                dolevelmusic(mapon - 1);
                   1031:           }
                   1032:      }
                   1033:      else if (loadedgame == 1) {
                   1034:           setupboard(boardname);
                   1035:           loadplayerstuff();
                   1036:           initplayersprite();
                   1037: #if 0
                   1038:           for (i = 0; i < (MAXSECTORS >> 3); i++)
                   1039:                tempshow2dsector[i] = show2dsector[i];
                   1040:           for (i = 0; i < (MAXWALLS >> 3); i++)
                   1041:                tempshow2dwall[i] = show2dwall[i];
                   1042:           for (i = 0; i < (MAXSPRITES >> 3); i++)
                   1043:                tempshow2dsprite[i] = show2dsprite[i];
                   1044:           for (i = 0; i < (MAXSECTORS >> 3); i++)
                   1045:                show2dsector[i] = tempshow2dsector[i];
                   1046:           for (i = 0; i < (MAXWALLS >> 3); i++)
                   1047:                show2dwall[i] = tempshow2dwall[i];
                   1048:           for (i = 0; i < (MAXSPRITES >> 3); i++)
                   1049:                show2dsprite[i] = tempshow2dsprite[i];
                   1050: #endif
                   1051:           loadedgame = 0;
                   1052:           if (musicoverride == -1) {
                   1053:                dolevelmusic(mapon - 1);
                   1054:           }
                   1055:      }
                   1056: skip:
                   1057:      godmode=0;
                   1058:      nobreakflag=0;
                   1059:      show2dobjectsflag=0;
                   1060:      show2dmapflag=0;
                   1061:      if (plr->screensize < 320)
                   1062:           permanentwritesprite(0L, 0L, BACKGROUND, 0, 0L, 0L, 319L, 199L, 0);
                   1063: 
                   1064:      if (plr->screensize <= 320) {
                   1065:           permanentwritesprite(0L, 154L, NEWSTATUSBAR, 0, 0L, 0L, 319L, 199L, 0);
                   1066:      }
                   1067:      updatepics();
                   1068: 
                   1069: }
                   1070: 
                   1071: void
                   1072: loadgame(struct player * plr)
                   1073: {
                   1074: 
                   1075:      int  select = 0;
                   1076:      int  exit = 0;
                   1077:      int  gn,
                   1078:           i,
                   1079:           step = 0;
                   1080:      char temp[20];
                   1081:      long goaltime;
                   1082: 
                   1083:      if (quicksaveflag) {
                   1084:           select=10;
                   1085:           exit=2;
                   1086:           goto quickloadlabel;
                   1087:      }
                   1088: 
                   1089:      goaltime = totalclock + SCOTTSPEED;
                   1090: 
                   1091:      for (i = 0; i < MAXSAVEDGAMES; i++)
                   1092:           if (!savedgamedat(i))
                   1093:                strcpy(savedgamenames[i].name, "empty");
                   1094: 
                   1095:      while (!exit) {
                   1096:           if (svga == 0) {
                   1097:                permanentwritesprite(0L, 0L, ZLOAD, 0, 0L, 0L, 319L, 199L, 0);
                   1098:           }
                   1099:           else {
                   1100:                rotatesprite(0L << 16, 0L << 16,
                   1101:                             65536L, 0, VMAINBLANK, 0, 0, 8 + 16,
                   1102:                             0L, 0L, xdim - 1L, ydim - 1L);
                   1103:                rotatesprite(((xdim>>1)-160L)<<16, ((ydim>>1)-100L)<<16,
                   1104:                             65536L, 0, ZLOAD, 0, 0, 1 + 16,
                   1105:                             (xdim>>1)-160L,(ydim>>1)-100L,
                   1106:                             (xdim>>1)+160L-1L,(ydim>>1)+100L-1L);
                   1107:           }
                   1108:           for (i = 0; i < MAXSAVEDGAMES; i++) {
                   1109:                if (i == select) {
                   1110:                     rotatesprite(((xdim>>1)-135L)<<16,
                   1111:                                  (((ydim>>1)-69L)+(i * 19))<<16,
                   1112:                                  16384L, 0, HELMET + step,
                   1113:                                  0, 0, 8 + 16,
                   1114:                                  0L, 0L, xdim-1L, ydim-1L);
                   1115:                }
                   1116:                fancyfont((xdim>>1)-83, ((ydim>>1)-69)+(i * 19),
                   1117:                          DAFONT, savedgamenames[i].name, 0);
                   1118:           }
                   1119: 
                   1120:           nextpage();
                   1121: 
                   1122:           if (totalclock >= goaltime) {
                   1123:                goaltime = totalclock + SCOTTSPEED;
                   1124:                step=(step+1)%8;
                   1125:           }
                   1126: 
                   1127:           if (keystatus[keys[KEYFWD]] > 0 || keystatus[RUP] > 0) {
                   1128:                select--;
                   1129:                if (select < 0)
                   1130:                     select = MAXSAVEDGAMES-1;
                   1131:                keystatus[keys[KEYFWD]] = 0;
                   1132:                keystatus[RUP] = 0;
                   1133:           }
                   1134:           if (keystatus[keys[KEYBACK]] > 0 || keystatus[RDN] > 0) {
                   1135:                select++;
                   1136:                if (select > MAXSAVEDGAMES-1)
                   1137:                     select = 0;
                   1138:                keystatus[keys[KEYBACK]] = 0;
                   1139:                keystatus[RDN] = 0;
                   1140:           }
                   1141: 
                   1142:           if (keystatus[1] > 0) {
                   1143:                exit = 1;
                   1144:                keystatus[1] = 0;
                   1145:           }
                   1146: 
                   1147:           if (keystatus[0x1c] > 0 || keystatus[0x9c] > 0) {
                   1148:                keystatus[0x1c] = keystatus[0x9c] = 0;
                   1149:                if (strcmp(savedgamenames[select].name, "empty") == 0)
                   1150:                     exit = 0;
                   1151:                else {
                   1152:                     exit = 2;
                   1153:                     loadgo = 1;
                   1154:                }
                   1155:           }
                   1156:      }
                   1157: quickloadlabel:
                   1158:      if (exit == 2) {
                   1159:           keystatus[1] = keystatus[0x1c] = keystatus[0x9c] = 0;
                   1160:           strcpy(boardname, "svgm");
                   1161:           itoa(select, temp, 10);
                   1162:           strcat(boardname, temp);
                   1163:           strcpy(loadgamename, "svgn");
                   1164:           strcat(loadgamename, temp);
                   1165:           strcat(loadgamename, ".dat");
                   1166:           strcat(boardname, ".map");
                   1167:           if (access(boardname,F_OK) != 0) {
                   1168:                return;
                   1169:           }
                   1170:           if (access(loadgamename,F_OK) != 0) {
                   1171:                return;
                   1172:           }
                   1173:           loadedgame = 1;
                   1174:           gameactivated = 1;
                   1175:           startnewgame(plr);
                   1176:      }
                   1177: }
                   1178: 
                   1179: void
                   1180: savegame(struct player * plr)
                   1181: {
                   1182: 
                   1183:      int  exit = 0;
                   1184:      int  gn,
                   1185:           i,
                   1186:           step = 0;
                   1187:      int  select = 0;
                   1188:      char temp[20];
                   1189:      long goaltime;
                   1190: 
                   1191: 
                   1192:      if (quicksaveflag) {
                   1193:           strcpy(quicksavedgame.name,"QUICKSAVE");
                   1194:           strcpy(tempbuf,"svgm10.map");
                   1195:           saveboard(tempbuf, &plr->x, &plr->y, &plr->z, &plr->ang, &plr->sector);
                   1196:           savedgamename(10);
                   1197:           return;
                   1198:      }
                   1199:      for (i = 0; i < MAXSAVEDGAMES; i++)
                   1200:           if (!savedgamedat(i))
                   1201:                strcpy(savedgamenames[i].name, "EMPTY");
                   1202: 
                   1203:      goaltime = totalclock + SCOTTSPEED;
                   1204: 
                   1205:      while (!exit) {
                   1206:           if (svga == 0) {
                   1207:                permanentwritesprite(0L, 0L, ZSAVE, 0, 0L, 0L, 319L, 199L, 0);
                   1208:           }
                   1209:           else {
                   1210:                rotatesprite(0L << 16, 0L << 16,
                   1211:                             65536L, 0, VMAINBLANK, 0, 0, 8 + 16,
                   1212:                             0L, 0L, xdim - 1L, ydim - 1L);
                   1213:                rotatesprite(((xdim>>1)-160L)<<16, ((ydim>>1)-100L)<<16,
                   1214:                             65536L, 0, ZSAVE, 0, 0, 1 + 16,
                   1215:                             (xdim>>1)-160L,(ydim>>1)-100L,
                   1216:                             (xdim>>1)+160L-1L,(ydim>>1)+100L-1L);
                   1217:           }
                   1218:           for (i = 0; i < MAXSAVEDGAMES; i++) {
                   1219:                if (i == select) {
                   1220:                     rotatesprite(((xdim>>1)-135L)<<16,
                   1221:                                  (((ydim>>1)-69L)+(i * 19))<<16,
                   1222:                                  16384L, 0, HELMET + step,
                   1223:                                  0, 0, 8 + 16,
                   1224:                                  0L, 0L, xdim-1L, ydim-1L);
                   1225:                }
                   1226:                fancyfont((xdim>>1)-83,((ydim>>1)-69)+(i * 19),
                   1227:                          DAFONT, savedgamenames[i].name, 0);
                   1228:           }
                   1229: 
                   1230:           nextpage();
                   1231: 
                   1232:           if (totalclock >= goaltime) {
                   1233:                goaltime = totalclock + SCOTTSPEED;
                   1234: 
                   1235:                step = (step + 1) % 8;
                   1236:           }
                   1237: 
                   1238:           if (keystatus[keys[KEYFWD]] > 0 || keystatus[RUP] > 0) {
                   1239:                select--;
                   1240:                if (select < 0)
                   1241:                     select = MAXSAVEDGAMES-1;
                   1242:                keystatus[keys[KEYFWD]] = 0;
                   1243:                keystatus[RUP] = 0;
                   1244:           }
                   1245: 
                   1246:           if (keystatus[keys[KEYBACK]] > 0 || keystatus[RDN] > 0) {
                   1247:                select++;
                   1248:                if (select > MAXSAVEDGAMES-1)
                   1249:                     select = 0;
                   1250:                keystatus[keys[KEYBACK]] = 0;
                   1251:                keystatus[RDN] = 0;
                   1252:           }
                   1253: 
                   1254:           if (keystatus[1] > 0) {
                   1255:                exit = 1;
                   1256:                keystatus[1] = 0;
                   1257:           }
                   1258: 
                   1259:           if (keystatus[0x1c] > 0 || keystatus[0x9c] > 0) {
                   1260:                exit = 2;
                   1261:                typemessageleng = 0;
                   1262:                keystatus[0x1c] = keystatus[0x9c] = 0;
                   1263:                savegametext(select);
                   1264:           }
                   1265:      }
                   1266: 
                   1267: }
                   1268: 
                   1269: void 
                   1270: savegametext(int select)
                   1271: {
                   1272: 
                   1273:      struct player *plr;
                   1274: 
                   1275:      int  exit = 0;
                   1276:      int  i,
                   1277:           len,
                   1278:           j;
                   1279:      char temp[40];
                   1280:      char temp1[40];
                   1281:      char temp2[40];
                   1282:      char temp3[40];
                   1283:      int  typemessageleng = 0;
                   1284: 
                   1285:      plr = &player[pyrn];
                   1286: 
                   1287:      keystatus[0x1c] = keystatus[0x9c] = 0;
                   1288: 
                   1289:      for (i = 0; i < 128; i++)
                   1290:           keystatus[i] = 0;
                   1291: 
                   1292:      if (strcmp(savedgamenames[select].name,"empty") == 0) {
                   1293:           strcpy(temp,"");
                   1294:      }
                   1295:      else {
                   1296:           sprintf(temp,"%s",savedgamenames[select].name);
                   1297:      }
                   1298:      typemessageleng=strlen(temp);
                   1299: 
                   1300:      while (!exit) {
                   1301: 
                   1302:           if (svga == 0) {
                   1303:                permanentwritesprite(0L, 0L, ZSAVE, 0, 0L, 0L, 319L, 199L, 0);
                   1304:           }
                   1305:           else {
                   1306:                rotatesprite(0L << 16, 0L << 16,
                   1307:                             65536L, 0, VMAINBLANK, 0, 0, 8 + 16,
                   1308:                             0L, 0L, xdim - 1L, ydim - 1L);
                   1309:                rotatesprite(((xdim>>1)-160L)<<16, ((ydim>>1)-100L)<<16,
                   1310:                             65536L, 0, ZSAVE, 0, 0, 1 + 16,
                   1311:                             (xdim>>1)-160L,(ydim>>1)-100L,
                   1312:                             (xdim>>1)+160L-1L,(ydim>>1)+100L-1L);
                   1313:           }
                   1314:           for (i = 0; i < MAXSAVEDGAMES; i++) {
                   1315:                if (i == select) {
                   1316:                     fancyfont((xdim>>1)-77, (ydim>>1)-100+31+(i * 19),
                   1317:                               DAFONT, temp, 7);
                   1318:                }
                   1319:                else {
                   1320:                     strcpy(tempbuf, savedgamenames[i].name);
                   1321:                     fancyfont((xdim>>1)-77, (ydim>>1)-100+31+(i * 19),
                   1322:                               DAFONT, tempbuf, 0);
                   1323:                }
                   1324:           }
                   1325: 
                   1326:           if (keystatus[0xe] > 0) {// backspace
                   1327:                if (typemessageleng > 0) {
                   1328:                     temp[typemessageleng] = '\0';
                   1329:                     typemessageleng--;
                   1330:                     temp[typemessageleng] = '\0';
                   1331:                }
                   1332:                else {
                   1333:                     strcpy(temp, "-");
                   1334:                     typemessageleng = 0;
                   1335:                }
                   1336:                keystatus[0xe] = 0;
                   1337:           }
                   1338: 
                   1339: 
                   1340: 
                   1341: 
                   1342:           if (typemessageleng < 10) {
                   1343:                for (i = 0; i < 128; i++) {
                   1344:                     if (keystatus[i] > 0
                   1345:                         && keystatus[0x0e] == 0   // keypressed not
                   1346:                         && keystatus[1] == 0 // esc
                   1347:                         && keystatus[0x1c] == 0   // enter l or r
                   1348:                         && keystatus[0x9c] == 0) {     // backspace
                   1349:                          for (j = 0; j < 41; j++) {
                   1350:                               if (scantoasc[i] == ' ') {
                   1351:                                    continue;
                   1352:                               }
                   1353:                               else if (scantoasc[i] == fancy[j]) {
                   1354:                                    temp[typemessageleng] = fancy[j];
                   1355:                                    typemessageleng++;
                   1356:                                    temp[typemessageleng] = '\0';
                   1357:                                    keystatus[i] = 0;
                   1358:                               }
                   1359:                               else
                   1360:                                    keystatus[i] = 0;
                   1361:                          }
                   1362:                     }
                   1363:                }
                   1364:           }
                   1365:           if (keystatus[1] > 0) {
                   1366:                exit = 1;
                   1367:                keystatus[1] = 0;
                   1368:           }
                   1369:           if (keystatus[0x1c] > 0 || keystatus[0x9c] > 0) {
                   1370:                if (typemessageleng > 0) {
                   1371:                     strcpy(savedgamenames[select].name, temp);
                   1372:                     strcpy(tempbuf, "svgm");
                   1373:                     itoa(select, temp2, 10);
                   1374:                     strcat(tempbuf, temp2);
                   1375:                     strcat(tempbuf, ".map");
                   1376:                     saveboard(tempbuf, &plr->x, &plr->y, &plr->z, &plr->ang, &plr->sector);
                   1377:                     savedgamename(select);
                   1378:                }
                   1379:                else {
                   1380:                     strcpy(tempbuf, "svgm");
                   1381:                     itoa(select, temp2, 10);
                   1382:                     strcat(tempbuf, temp2);
                   1383:                     strcat(tempbuf, ".map");
                   1384:                     saveboard(tempbuf, &plr->x, &plr->y, &plr->z, &plr->ang, &plr->sector);
                   1385:                     savedgamename(select);
                   1386:                }
                   1387:                exit = 2;
                   1388:                keystatus[0x1c] = keystatus[0x9c] = 0;
                   1389:           }
                   1390:           nextpage();
                   1391:      }
                   1392: 
                   1393:      if (exit == 2) {
                   1394:           keystatus[0x1c] = keystatus[0x9c] = 0;
                   1395:      }
                   1396: 
                   1397: }
                   1398: #if 0
                   1399: void
                   1400: savegametext(int select)
                   1401: {
                   1402: 
                   1403:      struct player *plr;
                   1404: 
                   1405:      int  exit = 0;
                   1406:      int  i,
                   1407:           len,
                   1408:           j;
                   1409:      char temp[40];
                   1410:      char temp1[40];
                   1411:      char temp2[40];
                   1412: 
                   1413:      int  typemessageleng = 0;
                   1414: 
                   1415:      plr = &player[pyrn];
                   1416: 
                   1417:      keystatus[0x1c] = keystatus[0x9c] = 0;
                   1418: 
                   1419:      for (i = 0; i < 128; i++)
                   1420:           keystatus[i] = 0;
                   1421: 
                   1422:      strcpy(temp, "-");
                   1423: 
                   1424:      while (!exit) {
                   1425: 
                   1426:           permanentwritesprite(0L, 0L, ZSAVE, 0, 0L, 0L, 319L, 199L, 0);
                   1427: 
                   1428:           for (i = 0; i < MAXSAVEDGAMES; i++) {
                   1429:                if (i == select) {
                   1430:                     strcpy(tempbuf, temp);
                   1431:                     fancyfont(77, 31 + (i * 19), DAFONT, tempbuf, 7);
                   1432:                }
                   1433:                else {
                   1434:                     strcpy(tempbuf, savedgamenames[i].name);
                   1435:                     fancyfont(77, 31 + (i * 19), DAFONT, tempbuf, 0);
                   1436:                }
                   1437:           }
                   1438:           if (keystatus[0xe] > 0) {// backspace
                   1439:                if (typemessageleng > 0) {
                   1440:                     temp[typemessageleng] = '\0';
                   1441:                     typemessageleng--;
                   1442:                     temp[typemessageleng] = '\0';
                   1443:                }
                   1444:                else {
                   1445:                     strcpy(temp, "-");
                   1446:                     typemessageleng = 0;
                   1447:                }
                   1448:                keystatus[0xe] = 0;
                   1449:           }
                   1450:           if (typemessageleng < 10) {
                   1451:                for (i = 0; i < 128; i++) {
                   1452:                     if (keystatus[i] > 0
                   1453:                         && keystatus[0x0e] == 0   // keypressed not
                   1454:                         && keystatus[1] == 0 // esc
                   1455:                         && keystatus[0x1c] == 0   // enter l or r
                   1456:                         && keystatus[0x9c] == 0) {     // backspace
                   1457: 
                   1458:                          for (j = 0; j < 41; j++) {
                   1459:                               if (scantoasc[i] == ' ') {
                   1460:                                    continue;
                   1461:                               }
                   1462:                               else if (scantoasc[i] == fancy[j]) {
                   1463:                                    temp[typemessageleng] = fancy[j];
                   1464:                                    typemessageleng++;
                   1465:                                    temp[typemessageleng] = '\0';
                   1466:                                    keystatus[i] = 0;
                   1467:                               }
                   1468:                               else
                   1469:                                    keystatus[i] = 0;
                   1470:                          }
                   1471:                     }
                   1472:                }
                   1473:           }
                   1474:           if (keystatus[1] > 0) {
                   1475:                exit = 1;
                   1476:                keystatus[1] = 0;
                   1477:           }
                   1478:           if (keystatus[0x1c] > 0 || keystatus[0x9c] > 0) {
                   1479:                if (typemessageleng > 0) {
                   1480:                     strcpy(savedgamenames[select].name, temp);
                   1481:                     strcpy(tempbuf, "svgm");
                   1482:                     itoa(select, temp2, 10);
                   1483:                     strcat(tempbuf, temp2);
                   1484:                     strcat(tempbuf, ".map");
                   1485:                     saveboard(tempbuf, &plr->x, &plr->y, &plr->z, &plr->ang, &plr->sector);
                   1486:                     savedgamename(select);
                   1487:                }
                   1488:                else {
                   1489:                     strcpy(tempbuf, "svgm");
                   1490:                     itoa(select, temp2, 10);
                   1491:                     strcat(tempbuf, temp2);
                   1492:                     strcat(tempbuf, ".map");
                   1493:                     saveboard(tempbuf, &plr->x, &plr->y, &plr->z, &plr->ang, &plr->sector);
                   1494:                     savedgamename(select);
                   1495:                }
                   1496:                exit = 2;
                   1497:                keystatus[0x1c] = keystatus[0x9c] = 0;
                   1498:           }
                   1499:           nextpage();
                   1500:      }
                   1501: 
                   1502:      if (exit == 2) {
                   1503:           keystatus[0x1c] = keystatus[0x9c] = 0;
                   1504:      }
                   1505: 
                   1506: }
                   1507: #endif
                   1508: 
                   1509: extern
                   1510: int  treasurescnt,
                   1511:      treasuresfound,
                   1512:      killcnt,
                   1513:      kills,
                   1514:      expgained;
                   1515: 
                   1516: int
                   1517: savedgamename(int gn)
                   1518: {
                   1519: 
                   1520:      struct player *plr;
                   1521:      int  file;
                   1522:      int  i;
                   1523:      char temp[3];
                   1524: 
                   1525:      plr = &player[0];
                   1526: 
                   1527:      if (svga == 1)
                   1528:           plr->screensize = 320;
                   1529:      else
                   1530:           plr->screensize = 320;
                   1531: 
                   1532:      strcpy(tempbuf, "svgn");
                   1533:      itoa(gn, temp, 10);
                   1534:      strcat(tempbuf, temp);
                   1535:      strcat(tempbuf, ".dat");
                   1536: 
                   1537:      file = open(tempbuf, O_BINARY | O_TRUNC | O_CREAT | O_WRONLY, S_IWRITE);
                   1538: 
                   1539:      if (file != -1) {
                   1540:           if (gn == 10) {
                   1541:                write(file, quicksavedgame.name, sizeof(struct savedgame));
                   1542:           }
                   1543:           else {
                   1544:                write(file, savedgamenames[gn].name, sizeof(struct savedgame));
                   1545:           }
                   1546:           write(file, &player[0], sizeof(struct player));
                   1547:           write(file, &currweapon, sizeof(currweapon));
                   1548:           write(file, &selectedgun, sizeof(selectedgun));
                   1549:           write(file, &currentpotion, sizeof(currentpotion));
                   1550:           write(file, &helmettime, sizeof(helmettime));
                   1551:           write(file, &shadowtime, sizeof(shadowtime));
                   1552:           write(file, &nightglowtime, sizeof(nightglowtime));
                   1553:           write(file, &visibility, sizeof(visibility));
                   1554:           write(file, &brightness, sizeof(brightness));
                   1555:           write(file, &strongtime, sizeof(strongtime));
                   1556:           write(file, &invisibletime, sizeof(invisibletime));
                   1557:           write(file, &manatime, sizeof(manatime));
                   1558:           write(file, &thunderflash, sizeof(thunderflash));
                   1559:           write(file, &thundertime, sizeof(thundertime));
                   1560: 
                   1561:           write(file, &currentorb, sizeof(currentorb));
                   1562:           write(file, &currweaponfired, sizeof(currweaponfired));
                   1563:           write(file, &currweaponanim, sizeof(currweaponanim));
                   1564:           write(file, &currweaponattackstyle, sizeof(currweaponattackstyle));
                   1565:           write(file, &currweaponflip, sizeof(currweapon));
                   1566:           write(file, &mapon, sizeof(mapon));
                   1567: 
                   1568:           write(file, &totalclock, sizeof(totalclock));
                   1569:           write(file, &lockclock, sizeof(lockclock));
                   1570:           write(file, &synctics, sizeof(synctics));
                   1571: 
                   1572:           // Warning: only works if all pointers are in sector structures!
                   1573:           for (i = MAXANIMATES - 1; i >= 0; i--)
                   1574:                animateptr[i] = (long *) (animateptr[i] - ((long) sector));
                   1575: 
                   1576:           write(file, animateptr, MAXANIMATES << 2);
                   1577: 
                   1578:           for (i = MAXANIMATES - 1; i >= 0; i--)
                   1579:                animateptr[i] = (long *) (animateptr[i] + ((long) sector));
                   1580: 
                   1581:           write(file, animategoal, MAXANIMATES << 2);
                   1582:           write(file, animatevel, MAXANIMATES << 2);
                   1583:           write(file, &animatecnt, 4);
                   1584: 
                   1585:           write(file, show2dsector, MAXSECTORS >> 3);
                   1586:           write(file, show2dwall, MAXWALLS >> 3);
                   1587:           write(file, show2dsprite, MAXSPRITES >> 3);
                   1588:           write(file, &automapping, 1);
                   1589:           write(file, &shieldpoints, 2);
                   1590:           write(file, &vampiretime, 2);
                   1591:           write(file, &poisoned, 2);
                   1592:           write(file, &poisontime, 2);
                   1593: 
                   1594:           write(file, &sparksx, sizeof(sparksx));
                   1595:           write(file, &sparksy, sizeof(sparksy));
                   1596:           write(file, &sparksz, sizeof(sparksz));
                   1597: 
                   1598:           write(file, &treasurescnt, sizeof(treasurescnt));
                   1599:           write(file, &treasuresfound, sizeof(treasuresfound));
                   1600:           write(file, &killcnt, sizeof(killcnt));
                   1601:           write(file, &kills, sizeof(kills));
                   1602:           write(file, &expgained, sizeof(expgained));
                   1603: 
                   1604:           close(file);
                   1605:           return 1;
                   1606:      }
                   1607:      else
                   1608:           return 0;
                   1609: 
                   1610: 
                   1611: 
                   1612: }
                   1613: 
                   1614: int
                   1615: savedgamedat(int gn)
                   1616: {
                   1617: 
                   1618:      int  fh = 0,
                   1619:           nr = 0;
                   1620:      char fname[20];
                   1621:      char fsname[20];
                   1622:      char savedgame[40];
                   1623:      char temp[20];
                   1624: 
                   1625:      itoa(gn, temp, 10);
                   1626:      strcpy(fname, "svgm");
                   1627:      strcat(fname, temp);
                   1628:      strcat(fname, ".map");
                   1629: 
                   1630:      itoa(gn, temp, 10);
                   1631:      strcpy(fsname, "svgn");
                   1632:      strcat(fsname, temp);
                   1633:      strcat(fsname, ".dat");
                   1634: 
                   1635:      if (access(fname, F_OK) != 0)
                   1636:           return 0;
                   1637: 
                   1638:      if (access(fsname, F_OK) != 0)
                   1639:           return 0;
                   1640: 
                   1641:      fh = open(fsname, O_RDONLY | O_BINARY);
                   1642: 
                   1643:      if (fh < 0)
                   1644:           return 0;
                   1645: 
                   1646:      if (gn == 10) {
                   1647:           nr = read(fh, quicksavedgame.name, sizeof(struct savedgame));
                   1648:      }
                   1649:      else {
                   1650:           nr = read(fh, savedgamenames[gn].name, sizeof(struct savedgame));
                   1651:      }
                   1652: 
                   1653:      close(fh);
                   1654: 
                   1655:      if (nr != sizeof(struct savedgame))
                   1656:           return 0;
                   1657: 
                   1658:      return 1;
                   1659: 
                   1660: }
                   1661: 
                   1662: void
                   1663: loadplayerstuff(void)
                   1664: {
                   1665: 
                   1666:      int  fh;
                   1667:      int  i;
                   1668:      char temp[40];
                   1669: 
                   1670:      fh = open(loadgamename, O_RDONLY | O_BINARY);
                   1671: 
                   1672:      read(fh, savedgamenames[0].name, sizeof(struct savedgame));
                   1673:      read(fh, &player[0], sizeof(struct player));
                   1674:      read(fh, &currweapon, sizeof(currweapon));
                   1675:      read(fh, &selectedgun, sizeof(selectedgun));
                   1676:      read(fh, &currentpotion, sizeof(currentpotion));
                   1677:      read(fh, &helmettime, sizeof(helmettime));
                   1678:      read(fh, &shadowtime, sizeof(shadowtime));
                   1679:      read(fh, &nightglowtime, sizeof(nightglowtime));
                   1680:      read(fh, &visibility, sizeof(visibility));
                   1681:      read(fh, &brightness, sizeof(brightness));
                   1682:      read(fh, &strongtime, sizeof(strongtime));
                   1683:      read(fh, &invisibletime, sizeof(invisibletime));
                   1684:      read(fh, &manatime, sizeof(manatime));
                   1685:      read(fh, &thunderflash, sizeof(thunderflash));
                   1686:      read(fh, &thundertime, sizeof(thundertime));
                   1687: 
                   1688:      read(fh, &currentorb, sizeof(currentorb));
                   1689:      read(fh, &currweaponfired, sizeof(currweaponfired));
                   1690:      read(fh, &currweaponanim, sizeof(currweaponanim));
                   1691:      read(fh, &currweaponattackstyle, sizeof(currweaponattackstyle));
                   1692:      read(fh, &currweaponflip, sizeof(currweaponflip));
                   1693:      read(fh, &mapon, sizeof(mapon));
                   1694: 
                   1695:      read(fh, &totalclock, sizeof(totalclock));
                   1696:      read(fh, &lockclock, sizeof(lockclock));
                   1697:      read(fh, &synctics, sizeof(synctics));
                   1698: 
                   1699:      // Warning: only works if all pointers are in sector structures!
                   1700:      for (i = MAXANIMATES - 1; i >= 0; i--)
                   1701:           animateptr[i] = (long *) (animateptr[i] - ((long) sector));
                   1702: 
                   1703:      read(fh, animateptr, MAXANIMATES << 2);
                   1704: 
                   1705:      for (i = MAXANIMATES - 1; i >= 0; i--)
                   1706:           animateptr[i] = (long *) (animateptr[i] + ((long) sector));
                   1707: 
                   1708:      read(fh, animategoal, MAXANIMATES << 2);
                   1709:      read(fh, animatevel, MAXANIMATES << 2);
                   1710:      read(fh, &animatecnt, 4);
                   1711: 
                   1712: 
                   1713:      read(fh, show2dsector, MAXSECTORS >> 3);
                   1714:      read(fh, show2dwall, MAXWALLS >> 3);
                   1715:      read(fh, show2dsprite, MAXSPRITES >> 3);
                   1716:      read(fh, &automapping, 1);
                   1717:      read(fh, &shieldpoints, 2);
                   1718:      read(fh, &vampiretime, 2);
                   1719:      read(fh, &poisoned, 2);
                   1720:      read(fh, &poisontime, 2);
                   1721: 
                   1722:      read(fh, &sparksx, sizeof(sparksx));
                   1723:      read(fh, &sparksy, sizeof(sparksy));
                   1724:      read(fh, &sparksz, sizeof(sparksz));
                   1725: 
                   1726:      read(fh, &treasurescnt, sizeof(treasurescnt));
                   1727:      read(fh, &treasuresfound, sizeof(treasuresfound));
                   1728:      read(fh, &killcnt, sizeof(killcnt));
                   1729:      read(fh, &kills, sizeof(kills));
                   1730:      read(fh, &expgained, sizeof(expgained));
                   1731: 
                   1732:      close(fh);
                   1733: 
                   1734: }
                   1735: 
                   1736: void
                   1737: optionspage(void)
                   1738: {
                   1739: 
                   1740:      int  which = 0;
                   1741:      int  exit = 0;
                   1742:      int  i;
                   1743:      long goaltime;
                   1744:      int  cnt = 0;
                   1745: 
                   1746:      struct thenames {
                   1747:           long x;
                   1748:           long y;
                   1749:           short thename;
                   1750:      }    danames[3] = {{
                   1751:                107L, 35L, DASOUND
                   1752:      },
                   1753:      {
                   1754:           97L, 72L, DAGAMEPLAY
                   1755:      },
                   1756:      {
                   1757:           101L, 108L, DACONTROLS
                   1758:      }
                   1759:      };
                   1760: 
                   1761:      struct sthenames {
                   1762:           long x;
                   1763:           long y;
                   1764:           short thename;
                   1765:      }    sdanames[3] = {{
                   1766:                254, 145, SFLASH4
                   1767:      },
                   1768:      {
                   1769:           235, 183, SFLASH4 + 1
                   1770:      },
                   1771:      {
                   1772:           253, 242, SFLASH4 + 2
                   1773:      }
                   1774:      };
                   1775: 
                   1776:      goaltime = totalclock + SCOTTSPEED;
                   1777: 
                   1778:      while (!exit) {
                   1779: 
                   1780:           if (svga == 0)
                   1781:                permanentwritesprite(0L, 0L, ZOPS, 0, 0L, 0L, 319L, 199L, 0);
                   1782:           else {
                   1783:                rotatesprite(0L << 16, 0L << 16, 65536L, 0, VSOUNDA, 0, 0, 8 + 16, 0L, 0L, xdim - 1L, ydim - 1L);
                   1784:                rotatesprite(0L << 16, 240L << 16, 65536L, 0, VSOUNDB, 0, 0, 8 + 16, 0L, 0L, xdim - 1L, ydim - 1L);
                   1785:           }
                   1786: 
                   1787:           for (i = 0; i < 3; i++) {
                   1788:                if (svga == 0) {
                   1789:                     if (which == i) {
                   1790:                          switch (cnt) {
                   1791:                          case 0:
                   1792:                               itemtoscreen(danames[which].x, danames[which].y,
                   1793:                                            danames[which].thename, 0, 0);
                   1794:                               break;
                   1795:                          case 1:
                   1796:                               itemtoscreen(danames[which].x, danames[which].y,
                   1797:                                            ZFLASHER1 + 5 + which, 0, 0);
                   1798:                               break;
                   1799:                          case 2:
                   1800:                               itemtoscreen(danames[which].x, danames[which].y,
                   1801:                                            ZFLASHER2 + 5 + which, 0, 0);
                   1802:                               break;
                   1803:                          }
                   1804:                     }
                   1805:                }
                   1806:                else {
                   1807:                     switch (cnt) {
                   1808:                     case 0:
                   1809:                          itemtoscreen(sdanames[which].x, sdanames[which].y,
                   1810:                                       sdanames[which].thename, 0, 0);
                   1811:                          break;
                   1812:                     case 1:
                   1813:                          itemtoscreen(sdanames[which].x, sdanames[which].y,
                   1814:                                       SFLASH1 + 7 + which, 0, 0);
                   1815:                          break;
                   1816:                     case 2:
                   1817:                          itemtoscreen(sdanames[which].x, sdanames[which].y,
                   1818:                                       SFLASH2 + 7 + which, 0, 0);
                   1819:                          break;
                   1820:                     }
                   1821:                }
                   1822:           }
                   1823: 
                   1824:           nextpage();
                   1825: 
                   1826:           if (totalclock >= goaltime) {
                   1827: 
                   1828:                goaltime = totalclock + SCOTTSPEED;
                   1829:                cnt++;
                   1830:                if (cnt > 2)
                   1831:                     cnt = 0;
                   1832: 
                   1833:                if (keystatus[keys[KEYFWD]] > 0 || keystatus[RUP] > 0) {
                   1834:                     which--;
                   1835:                     if (which < 0)
                   1836:                          which = 2;
                   1837:                }
                   1838: 
                   1839:                if (keystatus[keys[KEYBACK]] > 0 || keystatus[RDN] > 0) {
                   1840:                     which++;
                   1841:                     if (which > 2)
                   1842:                          which = 0;
                   1843:                }
                   1844: 
                   1845:                if (keystatus[1] > 0) {
                   1846:                     exit = 1;
                   1847:                     keystatus[1] = 0;
                   1848:                }
                   1849: 
                   1850:                if (keystatus[0x1c] > 0 || keystatus[0x9c] > 0) {
                   1851:                     keystatus[0x1c] = keystatus[0x9c] = 0;
                   1852:                     switch (which) {
                   1853:                     case 0:
                   1854:                          TEMPSND();
                   1855:                          thesound();
                   1856:                          break;
                   1857:                     case 1:
                   1858:                          TEMPSND();
                   1859:                          thedifficulty();
                   1860:                          break;
                   1861:                     case 2:
                   1862:                          TEMPSND();
                   1863:                          thecontrols();
                   1864:                          break;
                   1865:                     }
                   1866:                }
                   1867:           }
                   1868:      }
                   1869: 
                   1870: 
                   1871: }
                   1872: 
                   1873: 
                   1874: 
                   1875: void
                   1876: thesound(void)
                   1877: {
                   1878: 
                   1879:      int  exit = 0;
                   1880:      long goaltime;
                   1881:      long bitchtime;
                   1882:      long waittime;
                   1883:      int  which = 0;
                   1884:      int  musicslider = 0,
                   1885:           fxslider = 0,
                   1886:           playing = 0,
                   1887:           stoped = 0,
                   1888:           shuffle = 0;
                   1889:      int  forward, track = 0;
                   1890:      long dax1, dax2;
                   1891:      long x1,
                   1892:           y1;
                   1893:      long cnt = tilesizy[KATIEASS];
                   1894:      long xbase,ybase,xlen,ylen,xoff,yoff;
                   1895:      short incr = 0, dapic, pic2;
                   1896: 
                   1897:      struct template {
                   1898:           long x;
                   1899:           long y;
                   1900:           short daname;
                   1901:      }    dastuff[22] = {{
                   1902:                66L, 45L, CDMUVOL
                   1903:      },
                   1904:      {
                   1905:           71L, 79L, CDMUVOL + 1
                   1906:      },
                   1907:      {
                   1908:           184L, 23L, CDMUVOL + 2
                   1909:      },
                   1910:      {
                   1911:           229L, 24L, CDMUVOL + 3
                   1912:      },
                   1913:      {
                   1914:           216L, 76L, CDMUVOL + 4
                   1915:      },
                   1916:      {
                   1917:           184L, 40L, CDMUVOL + 5
                   1918:      },
                   1919:      {
                   1920:           225L, 40L, CDMUVOL + 6
                   1921:      },
                   1922:      {
                   1923:           57L, 105L, CDMUVOL + 7
                   1924:      },
                   1925:      {
                   1926:           57L, 117L, CDMUVOL + 8
                   1927:      },
                   1928:      {
                   1929:           57L, 129L, CDMUVOL + 9
                   1930:      },
                   1931:      {
                   1932:           57L, 141L, CDMUVOL + 10
                   1933:      },
                   1934:      {
                   1935:           57L, 153L, CDMUVOL + 11
                   1936:      },
                   1937:      {
                   1938:           142L, 105L, CDMUVOL + 12
                   1939:      },
                   1940:      {
                   1941:           142L, 117L, CDMUVOL + 13
                   1942:      },
                   1943:      {
                   1944:           142L, 129L, CDMUVOL + 14
                   1945:      },
                   1946:      {
                   1947:           142L, 141L, CDMUVOL + 15
                   1948:      },
                   1949:      {
                   1950:           142L, 153L, CDMUVOL + 16
                   1951:      },
                   1952:      {
                   1953:           216L, 105L, CDMUVOL + 17
                   1954:      },
                   1955:      {
                   1956:           216L, 117L, CDMUVOL + 18
                   1957:      },
                   1958:      {
                   1959:           216L, 129L, CDMUVOL + 19
                   1960:      },
                   1961:      {
                   1962:           216L, 141L, CDMUVOL + 20
                   1963:      },
                   1964:      {
                   1965:           216L, 153L, CDMUVOL + 21
                   1966:      }
                   1967:      };
                   1968: 
                   1969:      musiclevel = (wMIDIVol >> 3);
                   1970:      digilevel = (wDIGIVol >> 11);
                   1971: 
                   1972:      dax2 = (long) (digilevel * 5);
                   1973:      dax1 = (long) (musiclevel * 5);
                   1974: 
                   1975:      goaltime = totalclock + 10L;
                   1976:      bitchtime = totalclock + 10L;
                   1977:      waittime = totalclock + 720L;
                   1978: 
                   1979:      dapic = KATIEAT + 2;
                   1980: 
                   1981:      if (svga == 0) {
                   1982:           pic2 = ZCDPLAYER;
                   1983:           xlen = tilesizx[ZCDPLAYER];
                   1984:           ylen = tilesizy[ZCDPLAYER];
                   1985:           xoff = 0;
                   1986:           yoff = 0;
                   1987:      }
                   1988:      else {
                   1989:           pic2 = 1228;
                   1990:           xlen = tilesizx[1228];
                   1991:           ylen = tilesizy[1228];
                   1992:           xoff = -40;
                   1993:           yoff = -16;
                   1994:      }
                   1995:      xbase = (xdim >> 1) - (xlen >> 1);
                   1996:      ybase = (ydim >> 1) - (ylen >> 1);
                   1997: 
                   1998:      while (!exit) {
                   1999:           rotatesprite(0L << 16, 240L << 16, 65536L, 0, VSOUNDB, 0, 0, 8 + 16,
                   2000:                        0L, 0L, xdim - 1L, ydim - 1L);
                   2001:           permanentwritesprite(xbase, ybase, pic2, 0,
                   2002:                                0L, 0L, xdim-1L, ydim-1L, 0);
                   2003:           itemtoscreen(xbase + dastuff[which].x + xoff,
                   2004:                        ybase + dastuff[which].y + yoff,
                   2005:                        dastuff[which].daname, 0, 0);
                   2006: 
                   2007:           itemtoscreen(xbase + 60L + dax1 + xoff,
                   2008:                        ybase + 25L + yoff, DASLIDER, 0, 0);
                   2009:           itemtoscreen(xbase + 60L + dax2 + xoff,
                   2010:                        ybase + 60L + yoff, DASLIDER, 0, 0);
                   2011: 
                   2012:           if (playing) {
                   2013:                itemtoscreen(xbase + dastuff[5].x + xoff,
                   2014:                             ybase + dastuff[5].y + yoff,
                   2015:                             REDSHUFFLE + 1, 0, 0);
                   2016:           }
                   2017:           if (stoped) {
                   2018:                itemtoscreen(xbase + dastuff[6].x + xoff,
                   2019:                             ybase + dastuff[6].y + yoff,
                   2020:                             REDSHUFFLE + 2, 0, 0);
                   2021:           }
                   2022:           if (shuffle) {
                   2023:                itemtoscreen(xbase + dastuff[4].x + xoff,
                   2024:                             ybase + dastuff[4].y + yoff,
                   2025:                             REDSHUFFLE, 0, 0);
                   2026:           }
                   2027:           if (track) {
                   2028:                itemtoscreen(xbase + dastuff[track].x + xoff,
                   2029:                             ybase + dastuff[track].y + yoff,
                   2030:                             REDSHUFFLE + track - 4, 0, 0);
                   2031: 
                   2032:                if (cnt) {
                   2033:                     x1 = (long) (((xdim >> 1) - tilesizx[KATIEASS]) >> 1);
                   2034:                     y1 = (long) (ydim - tilesizy[KATIEASS]);
                   2035:                }
                   2036:                else {
                   2037:                     x1 = (long) (((xdim >> 1) - tilesizx[dapic]) >> 1);
                   2038:                     y1 = (long) (ydim - tilesizy[dapic]);
                   2039:                }
                   2040: 
                   2041:                if (which == 9 && track == 9) {
                   2042:                     if (totalclock > waittime) {
                   2043:                          if (cnt) {
                   2044:                               rotatesprite(xbase + (x1 << 16) + xoff,
                   2045:                                            ybase + ((y1 + cnt) << 16) + yoff,
                   2046:                                            65536L, 0, KATIEASS + incr, 0,
                   2047:                                            0, 8 + 16,
                   2048:                                            0L, 0L, xdim - 1L, ydim - 1L);
                   2049:                               cnt--;
                   2050:                               if (cnt % 8 == 0) {
                   2051:                                    incr++;
                   2052:                                    if (incr == 5) {
                   2053:                                         incr = 0;
                   2054:                                    }
                   2055:                               }
                   2056:                          }
                   2057:                          else {
                   2058:                               rotatesprite(xbase + (x1 << 16) + xoff,
                   2059:                                            ybase + (y1 << 16) + yoff,
                   2060:                                            65536L, 0, dapic, 0,
                   2061:                                            0, 8 + 16,
                   2062:                                            0L, 0L, xdim - 1L, ydim - 1L);
                   2063:                          }
                   2064:                     }
                   2065:                }
                   2066: 
                   2067:                if (totalclock > bitchtime) {
                   2068:                     bitchtime = totalclock + 10L;
                   2069:                     if (forward) {
                   2070:                          if (dapic < KATIEAT + 6) {
                   2071:                               dapic++;
                   2072:                          }
                   2073:                          else {
                   2074:                               forward = 0;
                   2075:                          }
                   2076:                     }
                   2077:                     else {
                   2078:                          if (dapic == KATIEAT + 2) {
                   2079:                               forward = 1;
                   2080:                               dapic = KATIEAT + 2;
                   2081:                          }
                   2082:                          else {
                   2083:                               dapic--;
                   2084:                          }
                   2085:                     }
                   2086:                }
                   2087:           }
                   2088: 
                   2089:           if (totalclock > goaltime) {
                   2090:                goaltime = totalclock + 10L;
                   2091: 
                   2092:                switch (which) {
                   2093:                case 0:
                   2094:                     musicslider = 1;
                   2095:                     fxslider = 0;
                   2096:                     break;
                   2097:                case 1:
                   2098:                     musicslider = 0;
                   2099:                     fxslider = 1;
                   2100:                     break;
                   2101:                default:
                   2102:                     musicslider = 0;
                   2103:                     fxslider = 0;
                   2104:                     break;
                   2105:                }
                   2106: 
                   2107:                if (keystatus[keys[KEYFWD]] > 0 || keystatus[RUP] > 0) {
                   2108:                     which--;
                   2109:                     if (which == 5 || which == 6)
                   2110:                          which = 4;
                   2111:                     if (which < 0)
                   2112:                          which = 21;
                   2113:                }
                   2114: 
                   2115:                if (keystatus[keys[KEYBACK]] > 0 || keystatus[RDN] > 0) {
                   2116:                     which++;
                   2117:                     if (which == 5 || which == 6)
                   2118:                          which = 7;
                   2119:                     if (which > 21)
                   2120:                          which = 0;
                   2121:                }
                   2122: 
                   2123:                if (fxslider) {
                   2124:                     if (keystatus[keys[KEYRIGHT]] > 0) {
                   2125:                          dax2 += 5L;
                   2126:                          digilevel++;
                   2127:                          keystatus[keys[KEYRIGHT]] = 0;
                   2128:                          if (dax2 > 80L)
                   2129:                               dax2 = 80L;
                   2130:                          if (digilevel > 16)
                   2131:                               digilevel = 16;
                   2132:                          SND_Mixer(0, digilevel);
                   2133:                          SND_Sound(S_LOUDCHAINWALK);
                   2134:                     }
                   2135:                     if (keystatus[keys[KEYLEFT]] > 0) {
                   2136:                          dax2 -= 5L;
                   2137:                          digilevel--;
                   2138:                          keystatus[keys[KEYLEFT]] = 0;
                   2139:                          if (dax2 < 0L)
                   2140:                               dax2 = 0L;
                   2141:                          if (digilevel < 0)
                   2142:                               digilevel = 0;
                   2143:                          SND_Mixer(0, digilevel);
                   2144:                          SND_Sound(S_LOUDCHAINWALK);
                   2145:                     }
                   2146:                }
                   2147: 
                   2148:                else if (musicslider) {
                   2149:                     if (keystatus[keys[KEYRIGHT]] > 0) {
                   2150:                          dax1 += 5L;
                   2151:                          musiclevel++;
                   2152:                          keystatus[keys[KEYRIGHT]] = 0;
                   2153:                          if (dax1 > 80L)
                   2154:                               dax1 = 80L;
                   2155:                          if (musiclevel > 16)
                   2156:                               musiclevel = 16;
                   2157:                          SND_Mixer(1, musiclevel);
                   2158:                     }
                   2159:                     if (keystatus[keys[KEYLEFT]] > 0) {
                   2160:                          dax1 -= 5L;
                   2161:                          musiclevel--;
                   2162:                          keystatus[keys[KEYLEFT]] = 0;
                   2163:                          if (dax1 < 0L)
                   2164:                               dax1 = 0L;
                   2165:                          if (musiclevel < 0)
                   2166:                               musiclevel = 0;
                   2167:                          SND_Mixer(1, musiclevel);
                   2168:                     }
                   2169:                }
                   2170:                if (keystatus[1] > 0) {
                   2171:                     exit = 1;
                   2172:                }
                   2173:                else if (keystatus[0x1c] > 0 || keystatus[0x9c] > 0) {
                   2174:                     keystatus[0x1c] = keystatus[0x9c] = 0;
                   2175:                     switch (which) {
                   2176:                     case 2:
                   2177:                          playing = 1;
                   2178:                          stoped = 0;
                   2179:                          shuffle = 0;
                   2180:                          track = 0;
                   2181:                          break;
                   2182:                     case 3:
                   2183:                          playing = 0;
                   2184:                          stoped = 1;
                   2185:                          shuffle = 0;
                   2186:                          track = 0;
                   2187:                          musicoverride = -1;
                   2188:                          break;
                   2189:                     case 4:
                   2190:                          playing = 0;
                   2191:                          stoped = 0;
                   2192:                          shuffle = 1;
                   2193:                          track = 0;
                   2194:                          dolevelmusic(rand() % 10);
                   2195:                          // SND_StartMusic(rand()%25);
                   2196:                          break;
                   2197:                     }
                   2198:                     if (which > 6 && which < 22) {
                   2199:                          track = which;
                   2200:                          dolevelmusic(track - 7);
                   2201:                          forward = 1;
                   2202:                          // SND_StartMusic(track);
                   2203:                          if (which != 9) {
                   2204:                               waittime = totalclock + 720L;
                   2205:                               cnt = tilesizy[KATIEASS];
                   2206:                          }
                   2207:                          musicoverride = track - 7;
                   2208:                     }
                   2209:                     else {
                   2210:                          track = 0;
                   2211:                          musicoverride = -1;
                   2212:                     }
                   2213:                }
                   2214:           }
                   2215:           nextpage();
                   2216:      }
                   2217: 
                   2218: }
                   2219: 
                   2220: void
                   2221: thecontrols(void)
                   2222: {
                   2223:      int  i;
                   2224:      int  exit = 0;
                   2225:      int  which = 0;
                   2226:      long goaltime;
                   2227:      int  reverse = 0;
                   2228: 
                   2229:      struct dastuff {
                   2230:           long x;
                   2231:           long y;
                   2232:           short daname;
                   2233:           long val;
                   2234:           long off;
                   2235:           long off2;
                   2236:      }    dacontrols[14] = {{
                   2237:                25L, 36L, ZCONTROLS + 1, 0L, 77L, 77L
                   2238:      },
                   2239:      {
                   2240:           25L, 52L, ZCONTROLS + 2, 0L, 77L, 77L
                   2241:      },
                   2242: 
                   2243:      {
                   2244:           22L, 107L, ZCONTROLS + 3, 0L, 99L, 99L
                   2245:      },
                   2246:      {
                   2247:           26L, 124L, ZCONTROLS + 4, 0L, 99L, 99L
                   2248:      },
                   2249:      {
                   2250:           27L, 138L, ZCONTROLS + 5, 0L, 99L, 99L
                   2251:      },
                   2252:      {
                   2253:           28L, 152L, ZCONTROLS + 6, 0L, 99L, 99L
                   2254:      },
                   2255:      {
                   2256:           28L, 166L, ZCONTROLS + 7, 0L, 99L, 99L
                   2257:      },
                   2258:      {
                   2259:           28L, 180L, ZCONTROLS + 8, 0L, 99L, 99L
                   2260:      },
                   2261: 
                   2262:      {
                   2263:           177L, 68L, ZCONTROLS + 9, 0L, 255L, 255L
                   2264:      },
                   2265:      {
                   2266:           177L, 81L, ZCONTROLS + 10, 0L, 255L, 255L
                   2267:      },
                   2268:      {
                   2269:           177L, 95L, ZCONTROLS + 11, 0L, 255L, 255L
                   2270:      },
                   2271:      {
                   2272:           178L, 110L, ZCONTROLS + 12, 0L, 255L, 255L
                   2273:      },
                   2274:      {
                   2275:           235L, 125L, ZZON, 0L, 255L, 255L
                   2276:      },
                   2277:      {
                   2278:           262L, 125L, ZZOFF, 0L, 255L, 255L
                   2279:      }
                   2280:      };
                   2281: 
                   2282:      goaltime = totalclock + 10L;
                   2283: 
                   2284:      // set the controls values
                   2285:      // for the mouse
                   2286:      dacontrols[0].val = mousxspeed;
                   2287:      dacontrols[1].val = mousyspeed;
                   2288:      // for the avenger
                   2289: 
                   2290:      // for the wingman
                   2291:      if (wingmanflag) {
                   2292:           dacontrols[8].val = wingmanyawsens;
                   2293:           dacontrols[9].val = wingmanpitchsens;
                   2294:           dacontrols[10].val = wingmanrollsens;
                   2295:           dacontrols[11].val = wingmanzsens;
                   2296:           dacontrols[12].val = wingmanzreverse;
                   2297:      }
                   2298: 
                   2299: 
                   2300:      // for the mouse
                   2301:      dacontrols[0].off2 = dacontrols[0].off + (dacontrols[0].val * 3);
                   2302:      dacontrols[1].off2 = dacontrols[1].off + (dacontrols[1].val * 3);
                   2303:      // for the avenger
                   2304: 
                   2305:      // for the wingman
                   2306:      if (wingmanflag) {
                   2307:           dacontrols[8].off2 = dacontrols[8].off + (dacontrols[8].val * 3);
                   2308:           dacontrols[9].off2 = dacontrols[9].off + (dacontrols[9].val * 3);
                   2309:           dacontrols[10].off2 = dacontrols[10].off + (dacontrols[10].val * 3);
                   2310:           dacontrols[11].off2 = dacontrols[11].off + (dacontrols[11].val * 3);
                   2311:           dacontrols[12].off2 = dacontrols[12].off + (dacontrols[12].val * 3);
                   2312:      }
                   2313: 
                   2314:      while (!exit) {
                   2315:           permanentwritesprite((xdim>>1)-160L, (ydim>>1)-100L,
                   2316:                                ZCONTROLS, 0,
                   2317:                                (xdim>>1)-160L, (ydim>>1)-100L,
                   2318:                                (xdim>>1)+160L-1L, (ydim>>1)+100L-1L, 0);
                   2319:           for (i = 0; i < 14; i++) {
                   2320:                if (i == which) {
                   2321:                     itemtoscreen((xdim>>1)-160L+dacontrols[i].x,
                   2322:                                  (ydim>>1)-100L+dacontrols[i].y,
                   2323:                                  dacontrols[i].daname, 0, 0);
                   2324:                }
                   2325:                if (i < 12) {
                   2326:                     itemtoscreen((xdim>>1)-160L+dacontrols[i].off2,
                   2327:                                  (ydim>>1)-100L+dacontrols[i].y,
                   2328:                                  ZZSLIDER, 0, 0);
                   2329:                }
                   2330: #if 0
                   2331:                if (reverse == 0) {
                   2332:                     itemtoscreen(dacontrols[i].x, dacontrols[i].y, ZZON, 0, 0);
                   2333:                }
                   2334:                else {
                   2335:                     itemtoscreen(dacontrols[i].x, dacontrols[i].y, ZZOFF, 0, 0);
                   2336:                }
                   2337: #endif
                   2338:           }
                   2339:           nextpage();
                   2340:           if (totalclock > goaltime) {
                   2341:                goaltime = totalclock + 10L;
                   2342:                if (keystatus[keys[KEYFWD]] > 0 || keystatus[RUP] > 0) {
                   2343:                     which--;
                   2344:                     if (which < 0)
                   2345:                          which = 13;
                   2346:                }
                   2347:                if (keystatus[keys[KEYBACK]] > 0 || keystatus[RDN] > 0) {
                   2348:                     which++;
                   2349:                     if (which > 13)
                   2350:                          which = 0;
                   2351:                }
                   2352:                if (which < 12) {
                   2353:                     if (keystatus[keys[KEYRIGHT]] > 0) {
                   2354:                          dacontrols[which].val++;
                   2355:                          keystatus[keys[KEYRIGHT]] = 0;
                   2356:                          if (dacontrols[which].val > 10)
                   2357:                               dacontrols[which].val = 10;
                   2358:                     }
                   2359:                     if (keystatus[keys[KEYLEFT]] > 0) {
                   2360:                          dacontrols[which].val--;
                   2361:                          keystatus[keys[KEYRIGHT]] = 0;
                   2362:                          if (dacontrols[which].val < 0)
                   2363:                               dacontrols[which].val = 0;
                   2364:                     }
                   2365:                }
                   2366:                else {
                   2367:                     if (keystatus[keys[KEYRIGHT]] > 0) {
                   2368:                          reverse = 1;
                   2369:                          keystatus[keys[KEYRIGHT]] = 0;
                   2370:                     }
                   2371:                     if (keystatus[keys[KEYLEFT]] > 0) {
                   2372:                          reverse = 0;
                   2373:                          keystatus[keys[KEYRIGHT]] = 0;
                   2374:                     }
                   2375:                }
                   2376:                dacontrols[which].off2 = dacontrols[which].off + (dacontrols[which].val * 3);
                   2377:                if (keystatus[1] > 0) {
                   2378:                     exit = 1;
                   2379:                }
                   2380:                else if (keystatus[0x1c] > 0 || keystatus[0x9c] > 0) {
                   2381:                     // exit=2;
                   2382:                     if (which == 12 || which == 13) {
                   2383: 
                   2384:                     }
                   2385:                }
                   2386:           }
                   2387:      }
                   2388:      mousxspeed = dacontrols[0].val;
                   2389:      mousyspeed = dacontrols[1].val;
                   2390: 
                   2391:      if (wingmanflag) {
                   2392:           wingmanyawsens = dacontrols[8].val;
                   2393:           wingmanpitchsens = dacontrols[9].val;
                   2394:           wingmanrollsens = dacontrols[10].val;
                   2395:           wingmanzsens = dacontrols[11].val;
                   2396:           wingmanzreverse = dacontrols[12].val;
                   2397:      }
                   2398: 
                   2399: 
                   2400: }
                   2401: 
                   2402: 
                   2403: /***************************************************************************
                   2404:  *   TEKERR    - crirical error handler for TEKWAR                         *
                   2405:  *                                                                         *
                   2406:  *                                                     12/15/94 Jeff S.    *
                   2407:  ***************************************************************************/
                   2408: 
                   2409: int  criterr_flag;
                   2410: 
                   2411: int  __far
                   2412: cehndlr(unsigned deverr, unsigned errcode, unsigned far * devhdr)
                   2413: {
                   2414:      criterr_flag = errcode;
                   2415:      return (_HARDERR_IGNORE);
                   2416: }
                   2417: 
                   2418: 
                   2419: void
                   2420: installcrerrhndlr(void)
                   2421: {
                   2422:      _harderr(cehndlr);
                   2423: 
                   2424:      return;
                   2425: }
                   2426: 
                   2427: 
                   2428: 
                   2429: /***************************************************************************
                   2430:  *   screen effects for TEKWAR follow...fades, palette stuff, etc..        *
                   2431:  *                                                                         *
                   2432:  *                                                     12/15/94 Jeff S.    *
                   2433:  ***************************************************************************/
                   2434: 
                   2435: 
                   2436: 
                   2437: #define   MESSIAHRANDOMKEY    215
                   2438: #define   LEDRANDOMKEY        10
                   2439: 
                   2440: char forcemessiah = 0;
                   2441: long messcnt;
                   2442: long ledcnt;
                   2443: char ledflash;
                   2444: char tremors;
                   2445: char dofadein = 0;
                   2446: 
                   2447: #define   DEADTIME       2   // # minutes of nothing happening
                   2448: #define   FLASHINTERVAL  20
                   2449: 
                   2450: long passlock,
                   2451:      lastastep,
                   2452:      lastbstep,
                   2453:      astep,
                   2454:      bstep;
                   2455: 
                   2456: extern char pee;
                   2457: extern char flashflag;
                   2458: 
                   2459: void 
                   2460: screenfx(struct player * plr)
                   2461: {
                   2462: 
                   2463:      updatepaletteshifts();
                   2464: 
                   2465:      return;
                   2466: }
                   2467: 
                   2468: 
                   2469: #define   MAXSTRLEN      30
                   2470: 
                   2471: //
                   2472: // (extern asm template)
                   2473: //
                   2474: // extern int near asm_main (int *parmeter1, int parameter2);
                   2475: // Extern must be EXACT prototype.
                   2476: //
                   2477:  //  #pragma aux asm_main "*_"             /* Define the auxilary function. */ \
                   2478:  //    parm caller     [eax] [ebx]         /* Calling parameters.           */ \
                   2479:  //    value           [eax]               /* Return value.                 */ \
                   2480: //    modify          [ecx]; // Non parameter registers that will be altered.
                   2481: 
                   2482: extern void near asmwaitvrt(int parm1);
                   2483: #pragma aux asmwaitvrt  "*_"       \
                   2484: parm caller[ecx] \
                   2485:      modify[eax edx];
                   2486: 
                   2487: extern void near asmsetpalette(char *pal);
                   2488: #pragma aux asmsetpalette "*_"     \
                   2489: parm caller[esi] \
                   2490:      modify[eax ecx edx];
                   2491: 
                   2492: void
                   2493: clearpal(void)
                   2494: {
                   2495:      short i;
                   2496: 
                   2497:      outp(PEL_WRITE_ADR, 0);
                   2498:      for (i = 0; i < 768; i++)
                   2499:           outp(PEL_DATA, 0x00);
                   2500: 
                   2501:      return;
                   2502: }
                   2503: 
                   2504: 
                   2505: char palette1[256][3],
                   2506:      palette2[256][3];
                   2507: 
                   2508: void
                   2509: getpalette(char *palette)
                   2510: {
                   2511:      int  i;
                   2512: 
                   2513:      outp(PEL_READ_ADR, 0);
                   2514:      for (i = 0; i < 768; i++)
                   2515:           *palette++ = inp(PEL_DATA);
                   2516: }
                   2517: 
                   2518: void
                   2519: fillpalette(int red, int green, int blue)
                   2520: {
                   2521:      int  i;
                   2522: 
                   2523:      outp(PEL_WRITE_ADR, 0);
                   2524:      for (i = 0; i < 256; i++) {
                   2525:           outp(PEL_DATA, red);
                   2526:           outp(PEL_DATA, green);
                   2527:           outp(PEL_DATA, blue);
                   2528:      }
                   2529: }
                   2530: 
                   2531: 
                   2532: char foggy = 0;
                   2533: 
                   2534: void
                   2535: fadeout(int start, int end, int red, int green, int blue, int steps)
                   2536: {
                   2537:      int  i,
                   2538:           j,
                   2539:           orig,
                   2540:           delta;
                   2541:      char *origptr,
                   2542:          *newptr;
                   2543: 
                   2544:      asmwaitvrt(1);
                   2545:      getpalette(&palette1[0][0]);
                   2546:      memcpy(palette2, palette1, 768);
                   2547: 
                   2548:      for (i = 0; i < steps; i++) {
                   2549:           origptr = &palette1[start][0];
                   2550:           newptr = &palette2[start][0];
                   2551:           for (j = start; j <= end; j++) {
                   2552:                orig = *origptr++;
                   2553:                delta = red - orig;
                   2554:                *newptr++ = orig + delta * i / steps;
                   2555:                orig = *origptr++;
                   2556:                delta = green - orig;
                   2557:                *newptr++ = orig + delta * i / steps;
                   2558:                orig = *origptr++;
                   2559:                delta = blue - orig;
                   2560:                *newptr++ = orig + delta * i / steps;
                   2561:           }
                   2562: 
                   2563:           asmwaitvrt(1);
                   2564:           asmsetpalette(&palette2[0][0]);
                   2565:      }
                   2566: 
                   2567:      if (foggy == 0)
                   2568:           fillpalette(red, green, blue);
                   2569: 
                   2570:      return;
                   2571: }
                   2572: 
                   2573: 
                   2574: void
                   2575: fadein(int start, int end, int steps)
                   2576: {
                   2577:      int  i,
                   2578:           j,
                   2579:           delta;
                   2580: 
                   2581:      if (steps == 0) {
                   2582:           return;
                   2583:      }
                   2584: 
                   2585:      asmwaitvrt(1);
                   2586:      getpalette(&palette1[0][0]);
                   2587:      memcpy(&palette2[0][0], &palette1[0][0], sizeof(palette1));
                   2588: 
                   2589:      start *= 3;
                   2590:      end = end * 3 + 2;
                   2591: 
                   2592:      // fade through intermediate frames
                   2593:      for (i = 0; i < steps; i++) {
                   2594:           for (j = start; j <= end; j++) {
                   2595:                delta = palette[j] - palette1[0][j];
                   2596:                palette2[0][j] = palette1[0][j] + delta * i / steps;
                   2597:           }
                   2598: 
                   2599:           asmwaitvrt(1);
                   2600:           asmsetpalette(&palette2[0][0]);
                   2601:      }
                   2602: 
                   2603:      // final color
                   2604:      asmsetpalette(palette);
                   2605: 
                   2606:      dofadein = 0;
                   2607:      // clearkeys();
                   2608: }
                   2609: 
                   2610: 
                   2611: void
                   2612: fog1(void)
                   2613: {
                   2614:      if (foggy == 0) {
                   2615:           foggy = 1;
                   2616:           fadeout(1, 254, 8, 8, 10, 2);
                   2617:      }
                   2618:      else {
                   2619:           foggy = 0;
                   2620:           fadein(0, 255, 2);
                   2621:      }
                   2622: }
                   2623: 
                   2624: 
                   2625: void
                   2626: fog2(void)
                   2627: {
                   2628:      char *lookptr;
                   2629: 
                   2630:      lookptr = palookup[0];
                   2631:      palookup[0] = palookup[1];
                   2632:      palookup[1] = lookptr;
                   2633: }
                   2634: 
                   2635: void
                   2636: makefxlookups(void)
                   2637: {
                   2638:      char palbuf[256];
                   2639:      short i;
                   2640: 
                   2641:      for (i = 0; i < 256; i++)
                   2642:           palbuf[i] = *(palookup[0] + i);
                   2643: 
                   2644:      // makepalookup(1, palbuf, 60,60,60,1);
                   2645:      makepalookup(1, palbuf, 60, 10, 10, 1);
                   2646: }
                   2647: 
                   2648: 
                   2649: 
                   2650: #define   NUMWHITESHIFTS      3
                   2651: #define   WHITESTEPS          20
                   2652: #define   WHITETICS           6
                   2653: 
                   2654: #define   NUMREDSHIFTS        4
                   2655: #define   REDSTEPS            8
                   2656: 
                   2657: #define   NUMGREENSHIFTS      4
                   2658: #define   GREENSTEPS          8
                   2659: 
                   2660: #define   NUMBLUESHIFTS       4
                   2661: #define   BLUESTEPS           8
                   2662: 
                   2663: char whiteshifts[NUMREDSHIFTS][768];
                   2664: char redshifts[NUMREDSHIFTS][768];
                   2665: char greenshifts[NUMGREENSHIFTS][768];
                   2666: char blueshifts[NUMBLUESHIFTS][768];
                   2667: 
                   2668: int  redcount,
                   2669:      whitecount,
                   2670:      greencount,
                   2671:      bluecount;
                   2672: char palshifted;
                   2673: 
                   2674: extern char palette[];
                   2675: 
                   2676: void
                   2677: initpaletteshifts(void)
                   2678: {
                   2679:      char *workptr,
                   2680:          *baseptr;
                   2681:      int  i,
                   2682:           j,
                   2683:           delta;
                   2684: 
                   2685:      for (i = 1; i <= NUMREDSHIFTS; i++) {
                   2686:           workptr = (char *) &redshifts[i - 1][0];
                   2687:           baseptr = &palette[0];
                   2688:           for (j = 0; j <= 255; j++) {
                   2689:                delta = 64 - *baseptr;
                   2690:                *workptr++ = *baseptr++ + delta * i / REDSTEPS;
                   2691:                delta = -*baseptr;
                   2692:                *workptr++ = *baseptr++ + delta * i / REDSTEPS;
                   2693:                delta = -*baseptr;
                   2694:                *workptr++ = *baseptr++ + delta * i / REDSTEPS;
                   2695:           }
                   2696:      }
                   2697: 
                   2698:      for (i = 1; i <= NUMWHITESHIFTS; i++) {
                   2699:           workptr = (char *) &whiteshifts[i - 1][0];
                   2700:           baseptr = &palette[0];
                   2701:           for (j = 0; j <= 255; j++) {
                   2702:                delta = 64 - *baseptr;
                   2703:                *workptr++ = *baseptr++ + delta * i / WHITESTEPS;
                   2704:                delta = 62 - *baseptr;
                   2705:                *workptr++ = *baseptr++ + delta * i / WHITESTEPS;
                   2706:                delta = 0 - *baseptr;
                   2707:                *workptr++ = *baseptr++ + delta * i / WHITESTEPS;
                   2708:           }
                   2709:      }
                   2710: 
                   2711:      for (i = 1; i <= NUMGREENSHIFTS; i++) {
                   2712:           workptr = (char *) &greenshifts[i - 1][0];
                   2713:           baseptr = &palette[0];
                   2714:           for (j = 0; j <= 255; j++) {
                   2715:                delta = -*baseptr;
                   2716:                *workptr++ = *baseptr++ + delta * i / GREENSTEPS;
                   2717:                delta = 64 - *baseptr;
                   2718:                *workptr++ = *baseptr++ + delta * i / GREENSTEPS;
                   2719:                delta = -*baseptr;
                   2720:                *workptr++ = *baseptr++ + delta * i / GREENSTEPS;
                   2721:           }
                   2722:      }
                   2723: 
                   2724:      for (i = 1; i <= NUMBLUESHIFTS; i++) {
                   2725:           workptr = (char *) &blueshifts[i - 1][0];
                   2726:           baseptr = &palette[0];
                   2727:           for (j = 0; j <= 255; j++) {
                   2728:                delta = -*baseptr;
                   2729:                *workptr++ = *baseptr++ + delta * i / BLUESTEPS;
                   2730:                delta = -*baseptr;
                   2731:                *workptr++ = *baseptr++ + delta * i / BLUESTEPS;
                   2732:                delta = 64 - *baseptr;
                   2733:                *workptr++ = *baseptr++ + delta * i / BLUESTEPS;
                   2734:           }
                   2735:      }
                   2736: 
                   2737: 
                   2738:      return;
                   2739: }
                   2740: 
                   2741: void
                   2742: startgreenflash(int greentime)
                   2743: {
                   2744:      greencount = 0;
                   2745: 
                   2746:      NOTFIXED
                   2747: 
                   2748:           greencount += greentime;
                   2749: 
                   2750:      if (greencount < 0) {
                   2751:           greencount = 0;
                   2752:      }
                   2753: 
                   2754: }
                   2755: 
                   2756: void
                   2757: startblueflash(int bluetime)
                   2758: {
                   2759:      bluecount = 0;
                   2760: 
                   2761:      NOTFIXED
                   2762: 
                   2763:           bluecount += bluetime;
                   2764: 
                   2765:      if (bluecount < 0) {
                   2766:           bluecount = 0;
                   2767:      }
                   2768: 
                   2769: }
                   2770: 
                   2771: 
                   2772: void
                   2773: startredflash(int damage)
                   2774: {
                   2775: 
                   2776: 
                   2777:      redcount = 0;
                   2778: 
                   2779:      NOTFIXED
                   2780: 
                   2781:           redcount += damage;
                   2782: 
                   2783:      if (redcount < 0) {
                   2784:           redcount = 0;
                   2785:      }
                   2786: }
                   2787: 
                   2788: void
                   2789: startwhiteflash(int bonus)
                   2790: {
                   2791: 
                   2792:      whitecount = 0;
                   2793: 
                   2794:      NOTFIXED
                   2795: 
                   2796:           whitecount += bonus;
                   2797: 
                   2798:      if (whitecount < 0) {
                   2799:           whitecount = 0;
                   2800:      }
                   2801: 
                   2802: }
                   2803: 
                   2804: 
                   2805: void
                   2806: updatepaletteshifts(void)
                   2807: {
                   2808:      int  red,
                   2809:           white,
                   2810:           green,
                   2811:           blue;
                   2812: 
                   2813:      if (whitecount) {
                   2814:           white = whitecount / WHITETICS + 1;
                   2815:           if (white > NUMWHITESHIFTS)
                   2816:                white = NUMWHITESHIFTS;
                   2817:           whitecount -= synctics;
                   2818:           if (whitecount < 0)
                   2819:                whitecount = 0;
                   2820:      }
                   2821:      else {
                   2822:           white = 0;
                   2823:      }
                   2824: 
                   2825:      if (redcount) {
                   2826:           red = redcount / 10 + 1;
                   2827:           if (red > NUMREDSHIFTS)
                   2828:                red = NUMREDSHIFTS;
                   2829:           redcount -= synctics;
                   2830:           if (redcount < 0)
                   2831:                redcount = 0;
                   2832:      }
                   2833:      else {
                   2834:           red = 0;
                   2835:      }
                   2836: 
                   2837:      if (greencount) {
                   2838:           green = greencount / 10 + 1;
                   2839:           if (green > NUMGREENSHIFTS)
                   2840:                green = NUMGREENSHIFTS;
                   2841:           greencount -= synctics;
                   2842:           if (greencount < 0)
                   2843:                greencount = 0;
                   2844:      }
                   2845:      else {
                   2846:           green = 0;
                   2847:      }
                   2848: 
                   2849:      if (bluecount) {
                   2850:           blue = bluecount / 10 + 1;
                   2851:           if (blue > NUMBLUESHIFTS)
                   2852:                blue = NUMBLUESHIFTS;
                   2853:           bluecount -= synctics;
                   2854:           if (bluecount < 0)
                   2855:                bluecount = 0;
                   2856:      }
                   2857:      else {
                   2858:           blue = 0;
                   2859:      }
                   2860: 
                   2861:      if (red) {
                   2862:           asmwaitvrt(1);
                   2863:           asmsetpalette(redshifts[red - 1]);
                   2864:           palshifted = 1;
                   2865:      }
                   2866:      else if (white) {
                   2867:           asmwaitvrt(1);
                   2868:           asmsetpalette(whiteshifts[white - 1]);
                   2869:           palshifted = 1;
                   2870:      }
                   2871:      else if (green) {
                   2872:           asmwaitvrt(1);
                   2873:           asmsetpalette(greenshifts[green - 1]);
                   2874:           palshifted = 1;
                   2875:      }
                   2876:      else if (blue) {
                   2877:           asmwaitvrt(1);
                   2878:           asmsetpalette(blueshifts[blue - 1]);
                   2879:           palshifted = 1;
                   2880:      }
                   2881: 
                   2882:      else if (palshifted) {
                   2883:           asmwaitvrt(1);
                   2884:           asmsetpalette(&palette[0]);   // back to normal
                   2885:           // setbrightness(gbrightness);
                   2886:           setbrightness(brightness, (char *) &palette[0]);
                   2887:           palshifted = 0;
                   2888:      }
                   2889: 
                   2890:      return;
                   2891: }
                   2892: 
                   2893: 
                   2894: void
                   2895: finishpaletteshifts(void)
                   2896: {
                   2897:      if (palshifted == 1) {
                   2898:           palshifted = 0;
                   2899:           asmwaitvrt(1);
                   2900:           asmsetpalette(&palette[0]);
                   2901:      }
                   2902: 
                   2903:      return;
                   2904: }
                   2905: 
                   2906: #if 0
                   2907: void 
                   2908: clearkeys(void)
                   2909: {
                   2910: 
                   2911:      memset(keystatus, 0, sizeof(keystatus));
                   2912: 
                   2913:      // return;
                   2914: }
                   2915: #endif
                   2916: 
                   2917: 
                   2918: //JUST USING THIS FOR NOW
                   2919: void 
                   2920: TEMPSND(void)
                   2921: {
                   2922:      SND_Sound(rand() % 145);
                   2923: }
                   2924: 
                   2925: void 
                   2926: cleanup(void)
                   2927: {
                   2928: 
                   2929:      currweapon = 4;
                   2930:      selectedgun = 4;
                   2931:      currentpotion = 0;
                   2932:      helmettime = -1;
                   2933:      shadowtime = -1;
                   2934:      nightglowtime = -1;
                   2935:      strongtime = -1;
                   2936:      invisibletime = -1;
                   2937:      manatime = -1;
                   2938:      currentorb = 0;
                   2939:      currweaponfired = 3;
                   2940:      currweaponanim = 0;
                   2941:      currweaponattackstyle = 0;
                   2942:      currweaponflip = 0;
                   2943: 
                   2944: }

unix.superglobalmegacorp.com

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