home *** CD-ROM | disk | FTP | other *** search
/ Arcade Explosion / ae.mdf / arcexp / descent / editors / dsge / dsge.c next >
C/C++ Source or Header  |  1995-03-12  |  32KB  |  1,315 lines

  1. #include <mem.h>
  2. #include <conio.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. #define mmx1        4    /* Main menu X1 coordinate */
  9. #define mmy1        2    /* Main menu Y1 coordinate */
  10. #define mmx2        42    /* Main menu X2 coordinate */
  11. #define mmy2        24    /* Main menu Y2 coordinate */
  12. #define imx1        45    /* Info menu X1 coordinate */
  13. #define imy1        3    /* Info menu Y1 coordinate */
  14. #define imx2        77    /* Info menu X2 coordinate */
  15. #define imy2        10    /* Info menu Y2 coordinate */
  16. #define omx1            45    /* Other menu X1 coordinate */
  17. #define omy1            12    /* Other menu Y1 coordinate */
  18. #define omx2            77    /* Other menu X2 coordinate */
  19. #define omy2            16      /* Other menu Y2 coordinate */
  20. #define HeaderLen    7    /* Length of header string */
  21. #define MaxMenuItems    19    /* Maximum items on the main menu */
  22. #define MaxOMenuItems    1    /* Maximum items on the other menu */
  23. #define PlayerHeader "RLPD\x04\x00\x10\x00"  /* Header for player file */
  24.  
  25. FILE *File;
  26. unsigned int VideoSeg;          /* Video Segment */
  27. struct text_info ti;            /* Screen info */
  28. char  ScrnBuff[0xFA0];        /* Screen size (80x25) */
  29. char  SaveGame[25];        /* Name of current save game */
  30. char  MiscMenuBuff[0xFA0];    /* Miscelaneous screen buffer */
  31. char *MMenuItem[MaxMenuItems];  /* Items on the main menu */
  32. char *OMenuItem[MaxOMenuItems];    /* Items on the other menu */
  33. char  MainMenuBuff[0xFA0];    /* Menu screen */
  34. char  FileBuff[2212];        /* File buffer */
  35. char *FileName;            /* Take a guess */
  36. char  MiscMenuItem[16][26];    /* Miscelaneous items on menus */
  37. char *TempStr;            /* Miscelaneous string variable */
  38. char  PlayerName[7];        /* Name of player */
  39. char  input;            /* Main input variable */
  40. int   BaseInfo, error, I, bytes, OMItem = 0,  MMItem = 0;              /* Color Definitions */
  41.  
  42. int FgColor =       0;    /* Edit box foreground color */
  43. int BgColor =       7;    /* Edit box background color */
  44. int DesktopFg =     1;    /* Desktop foreground color */
  45. int DesktopBg =     7;    /* Desktop background color */
  46. int HighlightFg =  15;    /* Submenu highlighter bar fg color */
  47. int HighlightBg =   0;    /* Submenu highlighter bar bg color */
  48. int InfoColorFg =   0;    /* Information field foreground color */
  49. int InfoColorBg =   7;    /* Information field background color */
  50. int IMForeColor =  15;    /* Info menu foreground color */
  51. int IMBackColor =   2;    /* Info menu background color */
  52. int MMForeColor =  15;    /* Main menu foreground color */
  53. int MMBackColor =   1;    /* Main menu background color */
  54. int MMHighlightFg = 1;    /* Main menu highlighter bar fg color */
  55. int MMHighlightBg = 7;    /* Main menu highlighter bar bg color */
  56. int OMForeColor =  15;    /* Other menu foreground color */
  57. int OMBackColor =   1;    /* Other menu background color */
  58. int OMHighlightFg = 1;    /* Other menu highlighter bar fg color */
  59. int OMHighlightBg = 7;    /* Other menu highlighter bar bg color */
  60.  
  61. void AboutScreen(void);
  62. void ChCurLevel(void);
  63. void ChCurPrim(void);
  64. void ChCurSec(void);
  65. void ChLazerStr(void);
  66. void ChLazerT(void);
  67. void ChMaxLevel(void);
  68. void ChNumConcl(void);
  69. void ChNumHom(void);
  70. void ChNumLives(void);
  71. void ChNumMega(void);
  72. void ChNumProx(void);
  73. void ChNumSmart(void);
  74. void ChSaveGame(void);
  75. void ChSaveName(void);
  76. void ChSheildStr(void);
  77. void ChSkillLevel(void);
  78. void Toggles(void);
  79. void cursor(short OnOff);
  80. void drawbox(int x1, int y1, int x2, int y2, int fc, int bc, char *msg);
  81. void getinp(unsigned int *Num, unsigned int deflt);
  82. void getvidseg(void);
  83. void mainmenu(void);
  84. void othermenu(void);
  85. void setvars(void);
  86.  
  87. void main(int argc, char *argv[]) {
  88.   if (argc != 2) {
  89.     printf("Syntax:  DSGE <player.plr>\n\r");
  90.     exit(1);
  91.   }
  92.   FileName = argv[1];
  93.   if ((File = fopen(FileName, "r+b")) == NULL) {
  94.     printf("Error opening %s\n\r", FileName);
  95.     exit(1);
  96.   }
  97.   fread(FileBuff, sizeof(FileBuff), 1, File);
  98.   for (I = 0;  I <= HeaderLen;  I++)
  99.     if (FileBuff[I] != PlayerHeader[I]) {
  100.       printf("Invalid player file\n\r");
  101.       exit(1);
  102.     }
  103.  
  104.   getvidseg();
  105.   directvideo = 1;
  106.   movedata(VideoSeg, 0x0, _DS, (unsigned) ScrnBuff, sizeof(ScrnBuff));
  107.   gettextinfo(&ti);
  108.   if (VideoSeg == 0xB800)
  109.     textmode(C80);
  110.   else
  111.     textmode(MONO);
  112.   cursor(0);
  113.  
  114.   BaseInfo = 0x14;
  115.   textcolor(DesktopFg);
  116.   textbackground(DesktopBg);
  117.   clrscr();
  118.   setvars();
  119.   gotoxy(1, 2);
  120.   for (I = 1;  I <= 1840;  I++)
  121.     cprintf("%c", 176);
  122.   textcolor(InfoColorFg);
  123.   textbackground(InfoColorBg);
  124.   gotoxy(4, 1);
  125.   cprintf("DSGE v1.00");
  126.   gotoxy(57, 1);
  127.   cprintf("Written by Andrew Pye");
  128.   drawbox(omx1, omy1, omx2, omy2, OMForeColor, OMBackColor, "\x0");
  129.   for (I = 0;  I <= (MaxOMenuItems - 1);  I++) {
  130.     gotoxy(omx1 + 1, omy1 + (I + 2));
  131.     cprintf("   %s", OMenuItem[I]);
  132.   }
  133.   mainmenu();
  134.  
  135.   movedata(_DS, (unsigned) ScrnBuff, VideoSeg, 0x0, sizeof(ScrnBuff));
  136.   textmode(ti.currmode);
  137.   gotoxy(ti.curx, ti.cury);
  138.   cursor(1);
  139. }
  140.  
  141. void AboutScreen(void) {
  142.   drawbox(20, 10, 60, 15, FgColor, BgColor, "About      ");
  143.   gotoxy(37, 10);
  144.   cprintf(" About ");
  145.   gotoxy(35, 12);
  146.   cprintf("DSGE v1.00");
  147.   gotoxy(30, 13);
  148.   cprintf("Written by Andrew Pye");
  149.   getch();
  150. }
  151.  
  152. void ChCurLevel(void) {
  153.   char tmp, tmp1;
  154.  
  155.   drawbox(33, 11, 48, 14, FgColor, BgColor, "Change Current Level  (1 - 7)");
  156.   gotoxy(35, 12);
  157.   cprintf("Current: %i", FileBuff[BaseInfo + 0xA6]);
  158.   tmp1 = FileBuff[BaseInfo + 0xA6];
  159.   gotoxy(35, 13);
  160.   cprintf("New    : ");
  161.   do {
  162.     do
  163.       tmp = getch();
  164.     while ((tmp != 13 && tmp != 27) && (tmp > 0x37 || tmp < 0x30));
  165.     if (tmp != 13 && tmp != 27) {
  166.       gotoxy(44, 13);
  167.       cprintf("%c", tmp);
  168.       tmp -= 0x30;
  169.       FileBuff[BaseInfo + 0xA6] = tmp;
  170.     }
  171.   } while (tmp != 13 && tmp != 27);
  172.   if (tmp == 27)
  173.     FileBuff[BaseInfo + 0xA6] = tmp1;
  174. }
  175.  
  176. void ChCurPrim(void) {
  177.   char Inp;
  178.   int  CItem = FileBuff[BaseInfo + 0x92];
  179.  
  180.   drawbox(24, 8, 55, 16, FgColor, BgColor, "Change Current Primary Weapon");
  181.   strcpy(MiscMenuItem[0], "Lazer Cannon");
  182.   strcpy(MiscMenuItem[1], "Vulcan Cannon");
  183.   strcpy(MiscMenuItem[2], "Spreadfire Cannon");
  184.   strcpy(MiscMenuItem[3], "Plasma Cannon");
  185.   strcpy(MiscMenuItem[4], "Fusion Cannon");
  186.   do {
  187.     for (I = 0;  I <= 4;  I++) {
  188.       gotoxy(25, (I + 10));
  189.       if (CItem == I) {
  190.     textcolor(HighlightFg);
  191.     textbackground(HighlightBg);
  192.       } else {
  193.     textcolor(FgColor);
  194.     textbackground(BgColor);
  195.       }
  196.       cprintf("   %s", MiscMenuItem[I]);
  197.       while (wherex() != 55)
  198.     cprintf(" ");
  199.     }
  200.     movedata(VideoSeg, 0x0, _DS, (unsigned) MiscMenuBuff, sizeof(MiscMenuBuff));
  201.     Inp = getch();
  202.     switch(Inp) {
  203.       case 0:
  204.     Inp = getch();
  205.     switch(Inp) {
  206.       case 80:        /* Down */
  207.         if (CItem != 4)
  208.           CItem++;
  209.         else
  210.           CItem = 0;
  211.         break;
  212.       case 72:        /* Up */
  213.         if (CItem != 0)
  214.           CItem--;
  215.         else
  216.           CItem = 4;
  217.         break;
  218.       default:
  219.         break;
  220.     }
  221.     break;
  222.       case 13:
  223.     FileBuff[BaseInfo + 0x92] = CItem;
  224.     break;
  225.       default:
  226.     break;
  227.     }
  228.     movedata(_DS, (unsigned) MiscMenuBuff, VideoSeg, 0x0, sizeof(MiscMenuBuff));
  229.   } while (Inp != 27 && Inp != 13);
  230. }
  231.  
  232. void ChCurSec(void) {
  233.   char Inp;
  234.   int  CItem = FileBuff[BaseInfo + 0x96];
  235.  
  236.   drawbox(24, 8, 55, 16, FgColor, BgColor, "Change Current Secondary Weapon");
  237.   strcpy(MiscMenuItem[0], "Conclusion Missile");
  238.   strcpy(MiscMenuItem[1], "Homing Missile");
  239.   strcpy(MiscMenuItem[2], "Proximity Bomb");
  240.   strcpy(MiscMenuItem[3], "Smart Missile");
  241.   strcpy(MiscMenuItem[4], "Mega Missile");
  242.   do {
  243.     for (I = 0;  I <= 4;  I++) {
  244.       gotoxy(25, (I + 10));
  245.       if (CItem == I) {
  246.     textcolor(HighlightFg);
  247.     textbackground(HighlightBg);
  248.       } else {
  249.     textcolor(FgColor);
  250.     textbackground(BgColor);
  251.       }
  252.       cprintf("   %s", MiscMenuItem[I]);
  253.       while (wherex() != 55)
  254.     cprintf(" ");
  255.     }
  256.     movedata(VideoSeg, 0x0, _DS, (unsigned) MiscMenuBuff, sizeof(MiscMenuBuff));
  257.     Inp = getch();
  258.     switch(Inp) {
  259.       case 0:
  260.     Inp = getch();
  261.     switch(Inp) {
  262.       case 80:        /* Down */
  263.         if (CItem != 4)
  264.           CItem++;
  265.         else
  266.           CItem = 0;
  267.         break;
  268.       case 72:        /* Up */
  269.         if (CItem != 0)
  270.           CItem--;
  271.         else
  272.           CItem = 4;
  273.         break;
  274.       default:
  275.         break;
  276.     }
  277.     break;
  278.       case 13:
  279.     FileBuff[BaseInfo + 0x96] = CItem;
  280.     break;
  281.       default:
  282.     break;
  283.     }
  284.     movedata(_DS, (unsigned) MiscMenuBuff, VideoSeg, 0x0, sizeof(MiscMenuBuff));
  285.   } while (Inp != 27 && Inp != 13);
  286. }
  287.  
  288. void ChLazerT(void) {
  289.   char Inp;
  290.   int  CItem = 0;
  291.  
  292.   switch(FileBuff[BaseInfo + 0x44]) {
  293.     case 0:
  294.       CItem = 0;
  295.       break;
  296.     case 1:
  297.       CItem = 1;
  298.       break;
  299.     case 2:
  300.       CItem = 2;
  301.       break;
  302.     case 3:
  303.       CItem = 3;
  304.       break;
  305.     case 4:
  306.       CItem = 4;
  307.       break;
  308.     case 5:
  309.       CItem = 5;
  310.       break;
  311.     case 6:
  312.       CItem = 6;
  313.       break;
  314.     case 8:
  315.       CItem = 7;
  316.       break;
  317.     case 9:
  318.       CItem = 8;
  319.       break;
  320.     case 10:
  321.       CItem = 9;
  322.       break;
  323.     case 11:
  324.       CItem = 10;
  325.       break;
  326.     case 12:
  327.       CItem = 11;
  328.       break;
  329.     case 15:
  330.       CItem = 12;
  331.       break;
  332.     case 16:
  333.       CItem = 13;
  334.       break;
  335.     case 17:
  336.       CItem = 14;
  337.       break;
  338.     case 19:
  339.       CItem = 15;
  340.       break;
  341.   }
  342.  
  343.   drawbox(24, 3, 55, 22, FgColor, BgColor, "Change Lazer Type");
  344.   strcpy(MiscMenuItem[0], "Lazer Type 1");
  345.   strcpy(MiscMenuItem[1], "Lazer Type 2");
  346.   strcpy(MiscMenuItem[2], "Lazer Type 3");
  347.   strcpy(MiscMenuItem[3], "Lazer Type 4");
  348.   strcpy(MiscMenuItem[4], "Blue Balls");
  349.   strcpy(MiscMenuItem[5], "Orange Balls");
  350.   strcpy(MiscMenuItem[6], "Red Balls");
  351.   strcpy(MiscMenuItem[7], "Conclusion Missiles");
  352.   strcpy(MiscMenuItem[8], "Flares");
  353.   strcpy(MiscMenuItem[9], "Blue Lazers");
  354.   strcpy(MiscMenuItem[10], "Vulcan Ammo");
  355.   strcpy(MiscMenuItem[11], "Spreadfire Ammo");
  356.   strcpy(MiscMenuItem[12], "Homing Missile");
  357.   strcpy(MiscMenuItem[13], "Proximity Bombs");
  358.   strcpy(MiscMenuItem[14], "Smart Missiles");
  359.   strcpy(MiscMenuItem[15], "Plasma Cannon");
  360.   do {
  361.     for (I = 0;  I <= 15;  I++) {
  362.       gotoxy(25, (I + 5));
  363.       if (CItem == I) {
  364.     textcolor(HighlightFg);
  365.     textbackground(HighlightBg);
  366.       } else {
  367.     textcolor(FgColor);
  368.     textbackground(BgColor);
  369.       }
  370.       cprintf("   %s", MiscMenuItem[I]);
  371.       while (wherex() != 55)
  372.     cprintf(" ");
  373.     }
  374.     movedata(VideoSeg, 0x0, _DS, (unsigned) MiscMenuBuff, sizeof(MiscMenuBuff));
  375.     Inp = getch();
  376.     switch(Inp) {
  377.       case 0:
  378.     Inp = getch();
  379.     switch(Inp) {
  380.       case 80:        /* Down */
  381.         if (CItem != 15)
  382.           CItem++;
  383.         else
  384.           CItem = 0;
  385.         break;
  386.       case 72:        /* Up */
  387.         if (CItem != 0)
  388.           CItem--;
  389.         else
  390.           CItem = 15;
  391.         break;
  392.       default:
  393.         break;
  394.     }
  395.     break;
  396.       case 13:
  397.     switch(CItem) {
  398.       case 0:
  399.         CItem = 0;
  400.         break;
  401.       case 1:
  402.         CItem = 1;
  403.         break;
  404.       case 2:
  405.         CItem = 2;
  406.         break;
  407.       case 3:
  408.         CItem = 3;
  409.         break;
  410.       case 4:
  411.         CItem = 4;
  412.         break;
  413.       case 5:
  414.         CItem = 5;
  415.         break;
  416.       case 6:
  417.         CItem = 6;
  418.         break;
  419.       case 7:
  420.         CItem = 8;
  421.         break;
  422.       case 8:
  423.         CItem = 9;
  424.         break;
  425.       case 9:
  426.         CItem = 10;
  427.         break;
  428.       case 10:
  429.         CItem = 11;
  430.         break;
  431.       case 11:
  432.         CItem = 12;
  433.         break;
  434.       case 12:
  435.         CItem = 15;
  436.         break;
  437.       case 13:
  438.         CItem = 16;
  439.         break;
  440.       case 14:
  441.         CItem = 17;
  442.         break;
  443.       case 15:
  444.         CItem = 19;
  445.         break;
  446.     }
  447.     FileBuff[BaseInfo + 0x44] = CItem;
  448.     break;
  449.       default:
  450.     break;
  451.     }
  452.     movedata(_DS, (unsigned) MiscMenuBuff, VideoSeg, 0x0, sizeof(MiscMenuBuff));
  453.   } while (Inp != 27 && Inp != 13);
  454. }
  455.  
  456. void ChLazerStr(void) {
  457.   int tmp, tmp1;
  458.  
  459.   drawbox(32, 11, 49, 14, FgColor, BgColor, "Change Lazer Energy  (0 - 32767)");
  460.   gotoxy(34, 12);
  461.   _DL = FileBuff[BaseInfo + 0x3C];
  462.   _DH = FileBuff[BaseInfo + 0x3D];
  463.   tmp1 = _DX + 1;
  464.   cprintf("Current: %i", tmp1);
  465.   gotoxy(34, 13);
  466.   cprintf("New    : ");
  467.   getinp(&tmp, tmp1);
  468.   _DX = tmp - 1;
  469. //  FileBuff[BaseInfo + 0x3C] = tmp - 1;
  470.   FileBuff[BaseInfo + 0x3C] = _DL;
  471.   FileBuff[BaseInfo + 0x3D] = _DH;
  472. }
  473.  
  474. void ChMaxLevel(void) {
  475.   char tmp, tmp1;
  476.  
  477.   drawbox(33, 11, 47, 14, FgColor, BgColor, "Change Maximum Accessible Level  (1 - 7)");
  478.   gotoxy(35, 12);
  479.   cprintf("Current: %i", FileBuff[8]);
  480.   tmp1 = FileBuff[8];
  481.   gotoxy(35, 13);
  482.   cprintf("New    : ");
  483.   do {
  484.     do
  485.       tmp = getch();
  486.     while ((tmp != 13 && tmp != 27) && (tmp > 0x37 || tmp < 0x30));
  487.     if (tmp != 13 && tmp != 27) {
  488.       gotoxy(44, 13);
  489.       cprintf("%c", tmp);
  490.       tmp -= 0x30;
  491.       FileBuff[8] = tmp;
  492.     }
  493.   } while (tmp != 13 && tmp != 27);
  494.   if (tmp == 27)
  495.     FileBuff[8] = tmp1;
  496. }
  497.  
  498. void ChNumConcl(void) {
  499.   unsigned int tmp, tmp1;
  500.  
  501.   drawbox(32, 11, 49, 14, FgColor, BgColor, "Change Number of Conclusion Missiles  (0 - 65535)");
  502.   gotoxy(34, 12);
  503.   _DL = FileBuff[BaseInfo + 0x54];
  504.   _DH = FileBuff[BaseInfo + 0x55];
  505.   tmp1 = _DX;
  506.   cprintf("Current: %u", tmp1);
  507.   gotoxy(34, 13);
  508.   cprintf("New    : ");
  509.   getinp(&tmp, tmp1);
  510.   _DX = tmp;
  511.   FileBuff[BaseInfo + 0x54] = _DL;
  512.   FileBuff[BaseInfo + 0x55] = _DH;
  513. }
  514.  
  515. void ChNumHom(void) {
  516.   unsigned int tmp, tmp1;
  517.  
  518.   drawbox(32, 11, 49, 14, FgColor, BgColor, "Change Number of Homing Missiles  (0 - 65535)");
  519.   gotoxy(34, 12);
  520.   _DL = FileBuff[BaseInfo + 0x56];
  521.   _DH = FileBuff[BaseInfo + 0x57];
  522.   tmp1 = _DX;
  523.   cprintf("Current: %u", tmp1);
  524.   gotoxy(34, 13);
  525.   cprintf("New    : ");
  526.   getinp(&tmp, tmp1);
  527.   _DX = tmp;
  528.   FileBuff[BaseInfo + 0x56] = _DL;
  529.   FileBuff[BaseInfo + 0x57] = _DH;
  530. }
  531.  
  532. void ChNumMega(void) {
  533.   unsigned int tmp, tmp1;
  534.  
  535.   drawbox(32, 11, 49, 14, FgColor, BgColor, "Change Number of Mega Missiles  (0 - 65535)");
  536.   gotoxy(34, 12);
  537.   _DL = FileBuff[BaseInfo + 0x5C];
  538.   _DH = FileBuff[BaseInfo + 0x5D];
  539.   tmp1 = _DX;
  540.   cprintf("Current: %u", tmp1);
  541.   gotoxy(34, 13);
  542.   cprintf("New    : ");
  543.   getinp(&tmp, tmp1);
  544.   _DX = tmp;
  545.   FileBuff[BaseInfo + 0x5C] = _DL;
  546.   FileBuff[BaseInfo + 0x5D] = _DH;
  547. }
  548.  
  549. void ChNumLives(void) {
  550.   unsigned int tmp, tmp1;
  551.  
  552.   drawbox(32, 11, 49, 14, FgColor, BgColor, "Change Number of Lives  (0 - ???? (65536 max))");
  553.   gotoxy(34, 12);
  554.   _DL = FileBuff[BaseInfo + 0x42];
  555.   _DH = FileBuff[BaseInfo + 0x43];
  556.   tmp1 = _DX + 1;
  557.   cprintf("Current: %u", tmp1);
  558.   gotoxy(34, 13);
  559.   cprintf("New    : ");
  560.   getinp(&tmp, tmp1);
  561.   _DX = tmp - 1;
  562.   FileBuff[BaseInfo + 0x42] = _DL;
  563.   FileBuff[BaseInfo + 0x43] = _DH;
  564. }
  565.  
  566. void ChNumProx(void) {
  567.   unsigned int tmp, tmp1;
  568.  
  569.   drawbox(32, 11, 49, 14, FgColor, BgColor, "Change Numbe of Proximity Bombs  (0 - 65535)");
  570.   gotoxy(34, 12);
  571.   _DL = FileBuff[BaseInfo + 0x58];
  572.   _DH = FileBuff[BaseInfo + 0x59];
  573.   tmp1 = _DX;
  574.   cprintf("Current: %u", tmp1);
  575.   gotoxy(34, 13);
  576.   cprintf("New    : ");
  577.   getinp(&tmp, tmp1);
  578.   _DX = tmp;
  579.   FileBuff[BaseInfo + 0x58] = _DL;
  580.   FileBuff[BaseInfo + 0x59] = _DH;
  581. }
  582.  
  583. void ChNumSmart(void) {
  584.   unsigned int tmp, tmp1;
  585.  
  586.   drawbox(32, 11, 49, 14, FgColor, BgColor, "Change Number of Smart Missiles  (0 - 65535)");
  587.   gotoxy(34, 12);
  588.   _DL = FileBuff[BaseInfo + 0x5A];
  589.   _DH = FileBuff[BaseInfo + 0x5B];
  590.   tmp1 = _DX;
  591.   cprintf("Current: %u", tmp1);
  592.   gotoxy(34, 13);
  593.   cprintf("New    : ");
  594.   getinp(&tmp, tmp1);
  595.   _DX = tmp;
  596.   FileBuff[BaseInfo + 0x5A] = _DL;
  597.   FileBuff[BaseInfo + 0x5B] = _DH;
  598. }
  599.  
  600. void ChSaveGame(void) {
  601.   char Inp;
  602.   int  CItem = ((BaseInfo - 0x14) / 0xAE), I1, I2;
  603.  
  604.   drawbox(24, 6, 55, 19, FgColor, BgColor, "Change Current Save Game");
  605.   I = 0x14;
  606.   for (I1 = 0;  I1 <= 9;  I1++) {
  607.     I2 = 0;
  608.     do {
  609.       MiscMenuItem[I1][I2] = FileBuff[I + I2];
  610.       I2++;
  611.     } while (FileBuff[I + I2] != '\x0');
  612.     MiscMenuItem[I1][I2] = '\x0';
  613.     I += 0xAE;
  614.   }
  615.   do {
  616.     for (I = 0;  I <= 9;  I++) {
  617.       gotoxy(25, (I + 8));
  618.       if (CItem == I) {
  619.     textcolor(HighlightFg);
  620.     textbackground(HighlightBg);
  621.       } else {
  622.     textcolor(FgColor);
  623.     textbackground(BgColor);
  624.       }
  625.       cprintf("   %s", MiscMenuItem[I]);
  626.       while (wherex() != 55)
  627.     cprintf(" ");
  628.     }
  629.     movedata(VideoSeg, 0x0, _DS, (unsigned) MiscMenuBuff, sizeof(MiscMenuBuff));
  630.     Inp = getch();
  631.     switch(Inp) {
  632.       case 0:
  633.     Inp = getch();
  634.     switch(Inp) {
  635.       case 80:        /* Down */
  636.         if (CItem != 9)
  637.           CItem++;
  638.         else
  639.           CItem = 0;
  640.         break;
  641.       case 72:        /* Up */
  642.         if (CItem != 0)
  643.           CItem--;
  644.         else
  645.           CItem = 9;
  646.         break;
  647.       default:
  648.         break;
  649.     }
  650.     break;
  651.       case 13:
  652.     BaseInfo = (CItem * 0xAE) + 0x14;
  653.     for (I = 0;  I <= sizeof(SaveGame);  I++)
  654.       SaveGame[I] = MiscMenuItem[CItem][I];
  655.     break;
  656.       default:
  657.     break;
  658.     }
  659.     movedata(_DS, (unsigned) MiscMenuBuff, VideoSeg, 0x0, sizeof(MiscMenuBuff));
  660.   } while (Inp != 27 && Inp != 13);
  661. }
  662.  
  663. void ChSaveName(void) {
  664.   char tmp, TempStr[25];
  665.   int  I1;
  666.  
  667.   drawbox(21, 11, 59, 14, FgColor, BgColor, "Change Name of Save Game");
  668.   gotoxy(23, 12);
  669.   I = 0;
  670.   cprintf("Current : %s", SaveGame);
  671.   gotoxy(23, 13);
  672.   cprintf("New     : ");
  673.   I = 0;
  674.   for (I1 = 0;  I1 <= sizeof(SaveGame);  I1++)
  675.     TempStr[I1] = '\x0';
  676.   do {
  677.     tmp = getch();
  678.     switch(tmp) {
  679.       case 8:
  680.     if (I > 0) {
  681.       I--;
  682.       TempStr[I] = '\x0';
  683.       cprintf("\b \b");
  684.     }
  685.     break;
  686.       default:
  687.     if (I <= (sizeof(SaveGame) - 1) && tmp != 13 && tmp != 27 && tmp != 0) {
  688.       TempStr[I] = tmp;
  689.       I++;
  690.       cprintf("%c", tmp);
  691.     }
  692.     break;
  693.     }
  694.   } while (tmp != 13 && tmp != 27);
  695.   if (tmp == 13 && TempStr[0] != 0)
  696.     for (I1 = 0;  I1 < sizeof(SaveGame);  I1++) {
  697.       FileBuff[BaseInfo + I1] = TempStr[I1];
  698.       SaveGame[I1] = TempStr[I1];
  699.     }
  700. }
  701.  
  702. void ChSheildStr(void) {
  703.   int tmp, tmp1;
  704.  
  705.   drawbox(32, 11, 49, 14, FgColor, BgColor, "Change Sheild Energy  (0 - 32767)");
  706.   gotoxy(34, 12);
  707.   _DL = FileBuff[BaseInfo + 0x40];
  708.   _DH = FileBuff[BaseInfo + 0x41];
  709.   tmp1 = _DX;
  710.   cprintf("Current: %i", tmp1);
  711.   gotoxy(34, 13);
  712.   cprintf("New    : ");
  713.   getinp(&tmp, tmp1);
  714.   _DX = tmp;
  715.   FileBuff[BaseInfo + 0x40] = _DL;
  716.   FileBuff[BaseInfo + 0x41] = _DH;
  717. }
  718.  
  719. void ChSkillLevel(void) {
  720.   char Inp;
  721.   int  CItem = FileBuff[BaseInfo + 0x8E];
  722.  
  723.   drawbox(24, 8, 55, 16, FgColor, BgColor, "Change Skill Level");
  724.   strcpy(MiscMenuItem[0], "Trainee");
  725.   strcpy(MiscMenuItem[1], "Rookie");
  726.   strcpy(MiscMenuItem[2], "Hotshot");
  727.   strcpy(MiscMenuItem[3], "Ace");
  728.   strcpy(MiscMenuItem[4], "Insane");
  729.   do {
  730.     for (I = 0;  I <= 4;  I++) {
  731.       gotoxy(25, (I + 10));
  732.       if (CItem == I) {
  733.     textcolor(HighlightFg);
  734.     textbackground(HighlightBg);
  735.       } else {
  736.     textcolor(FgColor);
  737.     textbackground(BgColor);
  738.       }
  739.       cprintf("   %s", MiscMenuItem[I]);
  740.       while (wherex() != 55)
  741.     cprintf(" ");
  742.     }
  743.     movedata(VideoSeg, 0x0, _DS, (unsigned) MiscMenuBuff, sizeof(MiscMenuBuff));
  744.     Inp = getch();
  745.     switch(Inp) {
  746.       case 0:
  747.     Inp = getch();
  748.     switch(Inp) {
  749.       case 80:        /* Down */
  750.         if (CItem != 4)
  751.           CItem++;
  752.         else
  753.           CItem = 0;
  754.         break;
  755.       case 72:        /* Up */
  756.         if (CItem != 0)
  757.           CItem--;
  758.         else
  759.           CItem = 4;
  760.         break;
  761.       default:
  762.         break;
  763.     }
  764.     break;
  765.       case 13:
  766.     FileBuff[BaseInfo + 0x8E] = CItem;
  767.     break;
  768.       default:
  769.     break;
  770.     }
  771.     movedata(_DS, (unsigned) MiscMenuBuff, VideoSeg, 0x0, sizeof(MiscMenuBuff));
  772.   } while (Inp != 27 && Inp != 13);
  773. }
  774.  
  775. void Toggles(void) {
  776.   char Inp, TmpToggle[3];
  777.   int  CItem = 0;
  778.  
  779.   drawbox(25, 6, 54, 20, FgColor, BgColor, "Toggles    ");
  780.   TmpToggle[0] = FileBuff[BaseInfo + 0x37];
  781.   TmpToggle[1] = FileBuff[BaseInfo + 0x48];
  782.   TmpToggle[2] = FileBuff[BaseInfo + 0x49];
  783.   do {
  784.     if (TmpToggle[0] & 4)
  785.       strcpy(MiscMenuItem[0], "[X] Quad Lazers");
  786.     else
  787.       strcpy(MiscMenuItem[0], "[ ] Quad Lazers");
  788.     if (TmpToggle[1] & 1)
  789.       strcpy(MiscMenuItem[1], "[X] Lazer Cannon");
  790.     else
  791.       strcpy(MiscMenuItem[1], "[ ] Lazer Cannon");
  792.     if (TmpToggle[1] & 2)
  793.       strcpy(MiscMenuItem[2], "[X] Vulcan Cannon");
  794.     else
  795.       strcpy(MiscMenuItem[2], "[ ] Vulcan Cannon");
  796.     if (TmpToggle[1] & 4)
  797.       strcpy(MiscMenuItem[3], "[X] Spreadfire Cannon");
  798.     else
  799.       strcpy(MiscMenuItem[3], "[ ] Spreadfire Cannon");
  800.     if (TmpToggle[1] & 8)
  801.       strcpy(MiscMenuItem[4], "[X] Plasma Cannon");
  802.     else
  803.       strcpy(MiscMenuItem[4], "[ ] Plasma Cannon");
  804.     if (TmpToggle[1] & 16)
  805.       strcpy(MiscMenuItem[5], "[X] Fusion Cannon");
  806.     else
  807.       strcpy(MiscMenuItem[5], "[ ] Fusion Cannon");
  808.     if (TmpToggle[2] & 1)
  809.       strcpy(MiscMenuItem[6], "[X] Conclusion Missiles");
  810.     else
  811.       strcpy(MiscMenuItem[6], "[ ] Conclusion Missiles");
  812.     if (TmpToggle[2] & 2)
  813.       strcpy(MiscMenuItem[7], "[X] Homing Missiles");
  814.     else
  815.       strcpy(MiscMenuItem[7], "[ ] Homing Missiles");
  816.     if (TmpToggle[2] & 4)
  817.       strcpy(MiscMenuItem[8], "[X] Proximity Bombs");
  818.     else
  819.       strcpy(MiscMenuItem[8], "[ ] Proximity Bombs");
  820.     if (TmpToggle[2] & 8)
  821.       strcpy(MiscMenuItem[9], "[X] Smart Missiles");
  822.     else
  823.       strcpy(MiscMenuItem[9], "[ ] Smart Missiles");
  824.     if (TmpToggle[2] & 16)
  825.       strcpy(MiscMenuItem[10], "[X] Mega Missiles");
  826.     else
  827.       strcpy(MiscMenuItem[10], "[ ] Mega Missiles");
  828.     for (I = 0;  I <= 10;  I++) {
  829.       gotoxy(26, (I + 8));
  830.       if (CItem == I) {
  831.     textcolor(HighlightFg);
  832.     textbackground(HighlightBg);
  833.       } else {
  834.     textcolor(FgColor);
  835.     textbackground(BgColor);
  836.       }
  837.       cprintf("   %s", MiscMenuItem[I]);
  838.       while (wherex() != 54)
  839.     cprintf(" ");
  840.     }
  841.     movedata(VideoSeg, 0x0, _DS, (unsigned) MiscMenuBuff, sizeof(MiscMenuBuff));
  842.     Inp = getch();
  843.     switch(Inp) {
  844.       case 0:
  845.     Inp = getch();
  846.     switch(Inp) {
  847.       case 80:        /* Down */
  848.         if (CItem != 10)
  849.           CItem++;
  850.         else
  851.           CItem = 0;
  852.         break;
  853.       case 72:        /* Up */
  854.         if (CItem != 0)
  855.           CItem--;
  856.         else
  857.           CItem = 10;
  858.         break;
  859.       default:
  860.         break;
  861.     }
  862.     break;
  863.       case 32:
  864.     switch(CItem) {
  865.       case 0:
  866.         if (TmpToggle[0] & 4)
  867.           TmpToggle[0] &= 251;
  868.         else
  869.           TmpToggle[0] |= 4;
  870.         break;
  871.       case 1:
  872.         if (TmpToggle[1] & 1)
  873.           TmpToggle[1] &= 254;
  874.         else
  875.           TmpToggle[1] |= 1;
  876.         break;
  877.       case 2:
  878.         if (TmpToggle[1] & 2)
  879.           TmpToggle[1] &= 253;
  880.         else
  881.           TmpToggle[1] |= 2;
  882.         break;
  883.       case 3:
  884.         if (TmpToggle[1] & 4)
  885.           TmpToggle[1] &= 251;
  886.         else
  887.           TmpToggle[1] |= 4;
  888.         break;
  889.       case 4:
  890.         if (TmpToggle[1] & 8)
  891.           TmpToggle[1] &= 247;
  892.         else
  893.           TmpToggle[1] |= 8;
  894.         break;
  895.       case 5:
  896.         if (TmpToggle[1] & 16)
  897.           TmpToggle[1] &= 239;
  898.         else
  899.           TmpToggle[1] |= 16;
  900.         break;
  901.       case 6:
  902.         if (TmpToggle[2] & 1)
  903.           TmpToggle[2] &= 254;
  904.         else
  905.           TmpToggle[2] |= 1;
  906.         break;
  907.       case 7:
  908.         if (TmpToggle[2] & 2)
  909.           TmpToggle[2] &= 253;
  910.         else
  911.           TmpToggle[2] |= 2;
  912.         break;
  913.       case 8:
  914.         if (TmpToggle[2] & 4)
  915.           TmpToggle[2] &= 251;
  916.         else
  917.           TmpToggle[2] |= 4;
  918.         break;
  919.       case 9:
  920.         if (TmpToggle[2] & 8)
  921.           TmpToggle[2] &= 247;
  922.         else
  923.           TmpToggle[2] |= 8;
  924.         break;
  925.       case 10:
  926.         if (TmpToggle[2] & 16)
  927.           TmpToggle[2] &= 239;
  928.         else
  929.           TmpToggle[2] |= 16;
  930.         break;
  931.     }
  932.     break;
  933.       case 13:
  934.     FileBuff[BaseInfo + 0x37] = TmpToggle[0];
  935.     FileBuff[BaseInfo + 0x48] = TmpToggle[1];
  936.     FileBuff[BaseInfo + 0x49] = TmpToggle[2];
  937.     break;
  938.       default:
  939.     break;
  940.     }
  941.     movedata(_DS, (unsigned) MiscMenuBuff, VideoSeg, 0x0, sizeof(MiscMenuBuff));
  942.   } while (Inp != 27 && Inp != 13);
  943. }
  944.  
  945. void cursor(short OnOff) {
  946.   asm {
  947.     Cmp OnOff, 001h
  948.     Jnz _CursorOff
  949.  
  950.     Mov AX, 00100h
  951.     Mov CX, 00506h
  952.     Int 010h
  953.     Jmp _End
  954.   }
  955. _CursorOff: ;
  956.   asm {
  957.     Mov AX, 00100h
  958.     Mov CX, 02607h
  959.     Int 010h
  960.   }
  961. _End: ;
  962. }
  963.  
  964. void drawbox(int x1, int y1, int x2, int y2, int fc, int bc, char *msg) {
  965.   int I1;
  966.  
  967.   if (msg[0] != 0) {
  968.     gotoxy(2, 25);
  969.     textcolor(InfoColorFg);
  970.     textbackground(InfoColorBg);
  971.     cprintf("%s", msg);
  972.   }
  973.   textcolor(fc);
  974.   textbackground(bc);
  975.   gotoxy(x1, y1);
  976.   cprintf("%c", 201);
  977.   for (I = (x1 + 1);  I < x2;  I++)
  978.     cprintf("%c", 205);
  979.   cprintf("%c", 187);
  980.   gotoxy(x1, (y1 + 1));
  981.   for (I = (y1 + 1);  I < y2;  I++) {
  982.     cprintf("%c", 186);
  983.     for (I1 = (x1 + 1);  I1 < x2;  I1++)
  984.       cprintf(" ");
  985.     cprintf("%c", 186);
  986.     gotoxy(x1, (I + 1));
  987.   }
  988.   gotoxy(x1, y2);
  989.   cprintf("%c", 200);
  990.   for (I = (x1 + 1);  I < x2;  I++)
  991.     cprintf("%c", 205);
  992.   cprintf("%c", 188);
  993. }
  994.  
  995. void getinp(unsigned int *Num, unsigned int dflt) {
  996.   char temp, TempStr[5];
  997.   int  Len = 0;
  998.  
  999.   for (I = 0;  I < sizeof(TempStr);  I++)
  1000.     TempStr[I] = '\x0';
  1001.   do {
  1002.     temp = getch();
  1003.     switch(temp) {
  1004.       case 8:
  1005.     if (Len != 0) {
  1006.       TempStr[Len] = '\x0';
  1007.       Len--;
  1008.       cprintf("\b \b");
  1009.     }
  1010.     break;
  1011.       case 13:
  1012.     if (TempStr[0] == '\x0')
  1013.       *Num = dflt;
  1014.     else {
  1015.       *Num = atoi(TempStr);
  1016.     }
  1017.     break;
  1018.       case 27:
  1019.     *Num = dflt;
  1020.     break;
  1021.       default:
  1022.     if (Len < sizeof(TempStr) && temp > 0x2A && temp < 0x3A) {
  1023.         TempStr[Len] = temp;
  1024.         Len++;
  1025.         cprintf("%c", temp);
  1026.     }
  1027.     break;
  1028.     }
  1029.   } while (temp != 27 && temp != 13);
  1030. }
  1031.  
  1032. void getvidseg(void) {
  1033.  asm {
  1034.    Push ES
  1035.  
  1036.    Mov AX, 00040h
  1037.    Mov ES, AX
  1038.  
  1039.    Mov AX, ES:[00063h]
  1040.    Cmp AX, 003D4h
  1041.    Je  _Color
  1042.  }
  1043.    VideoSeg = 0xB800;
  1044.    goto _End;
  1045. _Color: ;
  1046.    VideoSeg = 0xB800;
  1047. _End: ;
  1048.   asm Pop ES
  1049. }
  1050.  
  1051. void mainmenu(void) {
  1052.   drawbox(mmx1, mmy1, mmx2, mmy2, MMForeColor, MMBackColor, "Select Item");
  1053.   drawbox(imx1, imy1, imx2, imy2, IMForeColor, IMBackColor, "\x0");
  1054.   do {
  1055.     for (I = 0;  I <= (MaxMenuItems - 1);  I++) {         /* Main Menu items */
  1056.       gotoxy(mmx1 + 1, mmy1 + (I + 2));
  1057.       if (MMItem == I) {
  1058.     textcolor(MMHighlightFg);
  1059.     textbackground(MMHighlightBg);
  1060.       } else {
  1061.     textcolor(MMForeColor);
  1062.     textbackground(MMBackColor);
  1063.       }
  1064.       cprintf("   %s", MMenuItem[I]);
  1065.       while (wherex() != mmx2)
  1066.     cprintf(" ");
  1067.     }
  1068.     textcolor(IMForeColor);
  1069.     textbackground(IMBackColor);
  1070.     gotoxy(imx1 + 2, imy1 + 2);
  1071.     cprintf("Player Name:");
  1072.     gotoxy(imx1 + 4, imy1 + 3);
  1073.     cprintf("%s", PlayerName);
  1074.     gotoxy(imx1 + 2, imy1 + 4);
  1075.     cprintf("Current Save Game:");
  1076.     gotoxy(imx1 + 4, imy1 + 5);
  1077.     cprintf("%s", SaveGame);
  1078.     while (wherex() != (imx2))
  1079.       cprintf(" ");
  1080. /*    textcolor(LIGHTRED + BLINK);
  1081.     gotoxy(((imx2 - imx1) / 2) + imx1 - 6, imy1);
  1082.     cprintf(" REGISTERED ");  */
  1083.     movedata(VideoSeg, 0x0, _DS, (unsigned) MainMenuBuff, sizeof(MainMenuBuff));
  1084.     while (! kbhit())
  1085.       if (error == 1) {
  1086.     gotoxy(2, 25);
  1087.     textcolor(InfoColorFg);
  1088.     textbackground(InfoColorBg);
  1089.     cprintf("Error writing to file");
  1090.     textcolor(MMForeColor);
  1091.     textbackground(MMBackColor);
  1092.       } else
  1093.       if (error == 2) {
  1094.     gotoxy(2, 25);
  1095.     textcolor(InfoColorFg);
  1096.     textbackground(InfoColorBg);
  1097.     cprintf("File saved  ");
  1098.     textcolor(MMForeColor);
  1099.     textbackground(MMBackColor);
  1100.       }
  1101.     error = 0;
  1102.     input = getch();
  1103.     switch(input) {
  1104.       case 0:
  1105.     input = getch();
  1106.     switch (input) {
  1107.       case 30:
  1108.         AboutScreen();
  1109.         break;
  1110.       case 80:        /* Down */
  1111.         if (MMItem != (MaxMenuItems - 1))
  1112.           MMItem++;
  1113.         else
  1114.           MMItem = 0;
  1115.         break;
  1116.       case 72:        /* Up */
  1117.         if (MMItem != 0)
  1118.           MMItem--;
  1119.         else
  1120.           MMItem = (MaxMenuItems - 1);
  1121.         break;
  1122.       case 77:        /* Right */
  1123.         othermenu();
  1124.         break;
  1125.       default:
  1126.         break;
  1127.     }
  1128.     break;
  1129.       case 9:                   /* Tab   */
  1130.     othermenu();
  1131.     break;
  1132.       case 13:
  1133.     switch(MMItem) {
  1134.       case 0:
  1135.         ChSaveGame();
  1136.         break;
  1137.       case 1:
  1138.         ChSaveName();
  1139.         break;
  1140.       case 2:
  1141.         ChMaxLevel();
  1142.         break;
  1143.       case 3:
  1144.         ChCurLevel();
  1145.         break;
  1146.       case 4:
  1147.         ChNumLives();
  1148.         break;
  1149.       case 5:
  1150.         ChNumConcl();
  1151.         break;
  1152.       case 6:
  1153.         ChNumHom();
  1154.         break;
  1155.       case 7:
  1156.         ChNumProx();
  1157.         break;
  1158.       case 8:
  1159.         ChNumSmart();
  1160.         break;
  1161.       case 9:
  1162.         ChNumMega();
  1163.         break;
  1164.       case 10:
  1165.         ChCurPrim();
  1166.         break;
  1167.       case 11:
  1168.         ChCurSec();
  1169.         break;
  1170.       case 12:
  1171.         ChLazerT();
  1172.         break;
  1173.       case 13:
  1174.         ChSheildStr();
  1175.         break;
  1176.       case 14:
  1177.         ChLazerStr();
  1178.         break;
  1179.       case 15:
  1180.         ChSkillLevel();
  1181.         break;
  1182.       case 16:
  1183.         Toggles();
  1184.         break;
  1185.       case (MaxMenuItems - 2):
  1186.         rewind(File);
  1187.         if (fwrite(&FileBuff, sizeof(FileBuff), 1, File) != sizeof(FileBuff)) {
  1188.           error = 2;
  1189.           rewind(File);
  1190.           for (I = 0;  I <= sizeof(FileBuff);  I++)
  1191.         FileBuff[I] = '\x0';
  1192.           fread(FileBuff, sizeof(FileBuff), 1, File);
  1193.         }
  1194.         else
  1195.           error = 1;
  1196.         break;
  1197.       case (MaxMenuItems - 1):
  1198.         input = 27;
  1199.         break;
  1200.       default:
  1201.         break;
  1202.     }
  1203.     break;
  1204.       default:
  1205.     break;
  1206.     }
  1207.     movedata(_DS, (unsigned) MainMenuBuff, VideoSeg, 0x0, sizeof(MainMenuBuff));
  1208.   } while (input != 27);
  1209.   fclose(File);
  1210. }
  1211.  
  1212. void othermenu(void) {          // Only call from main menu!
  1213.   int Input;
  1214.  
  1215.   textcolor(MMForeColor);
  1216.   textbackground(MMBackColor);
  1217.   gotoxy(mmx1 + 1, mmy1 + (MMItem + 2));
  1218.   cprintf("   %s", MMenuItem[MMItem]);
  1219.   while (wherex() != mmx2)
  1220.     cprintf(" ");
  1221.   do {
  1222.     for (I = 0;  I <= (MaxOMenuItems - 1);  I++) {
  1223.       gotoxy(omx1 + 1, omy1 + (I + 2));
  1224.       if (OMItem == I) {
  1225.     textcolor(OMHighlightFg);
  1226.     textbackground(OMHighlightBg);
  1227.       } else {
  1228.     textcolor(OMForeColor);
  1229.     textbackground(OMBackColor);
  1230.       }
  1231.       cprintf("   %s", OMenuItem[I]);
  1232.       while (wherex() != omx2)
  1233.     cprintf(" ");
  1234.     }
  1235.     movedata(VideoSeg, 0x0, _DS, (unsigned) MainMenuBuff, sizeof(MainMenuBuff));
  1236.     Input = getch();
  1237.     switch(Input) {
  1238.       case 0:
  1239.     Input = getch();
  1240.     switch (Input) {
  1241.       case 30:
  1242.         AboutScreen();
  1243.         break;
  1244.       case 80:        /* Down */
  1245.         if (OMItem != (MaxOMenuItems - 1))
  1246.           OMItem++;
  1247.         else
  1248.           OMItem = 0;
  1249.         break;
  1250.       case 72:        /* Up */
  1251.         if (OMItem != 0)
  1252.           OMItem--;
  1253.         else
  1254.           OMItem = (MaxOMenuItems - 1);
  1255.         break;
  1256.       case 75:              /* Left */
  1257.         Input = 9;
  1258.         break;
  1259.       default:
  1260.         break;
  1261.     }
  1262.     break;
  1263.       case 13:
  1264.     switch(OMItem) {
  1265.       case 0:
  1266.         AboutScreen();
  1267.         break;
  1268.     }
  1269.     break;
  1270.       case 27:
  1271.     Input = 9;
  1272.     input = 27;
  1273.     break;
  1274.       default:
  1275.     break;
  1276.     }
  1277.     movedata(_DS, (unsigned) MainMenuBuff, VideoSeg, 0x0, sizeof(MainMenuBuff));
  1278.   } while (Input != 9);
  1279.   textcolor(OMForeColor);
  1280.   textbackground(OMBackColor);
  1281.   gotoxy(omx1 + 1, omy1 + (2 + OMItem));
  1282.   cprintf("   %s", OMenuItem[OMItem]);
  1283.   while (wherex() != omx2)
  1284.     cprintf(" ");
  1285.   movedata(VideoSeg, 0x0, _DS, (unsigned) MainMenuBuff, sizeof(MainMenuBuff));
  1286. }
  1287.  
  1288. void setvars(void) {
  1289.   int I1;
  1290.  
  1291.   for (I1 = 0;  I1 <= 7;  I1++)
  1292.     PlayerName[I1] = FileBuff[I1 + 0x2E];
  1293.   for (I1 = 0;  I1 <= 24;  I1++)
  1294.     SaveGame[I1] = FileBuff[I1 + BaseInfo];
  1295.   MMenuItem[0] = "Change Save Game";
  1296.   MMenuItem[1] = "Change Save Game Name";
  1297.   MMenuItem[2] = "Change Maximum Level";
  1298.   MMenuItem[3] = "Change Current Level";
  1299.   MMenuItem[4] = "Change # of Lives";
  1300.   MMenuItem[5] = "Change # of Conclusion Missiles";
  1301.   MMenuItem[6] = "Change # of Homing Missiles";
  1302.   MMenuItem[7] = "Change # of Proximity Bombs";
  1303.   MMenuItem[8] = "Change # of Smart Missiles";
  1304.   MMenuItem[9] = "Change # of Mega Missiles";
  1305.   MMenuItem[10] = "Change Current Primary Weapon";
  1306.   MMenuItem[11] = "Change Current Secondary Weapon";
  1307.   MMenuItem[12] = "Change Lazer Type";
  1308.   MMenuItem[13] = "Change Sheild Energy";
  1309.   MMenuItem[14] = "Change Lazer Energy";
  1310.   MMenuItem[15] = "Change Skill Level";
  1311.   MMenuItem[16] = "Toggles";
  1312.   MMenuItem[17] = "Save Player";
  1313.   MMenuItem[18] = "Exit";
  1314.   OMenuItem[0]  = "About";
  1315. }