]> 4ch.mooo.com Git - 16.git/blobdiff - 16/sod8086/wl_menu.c
got 8086 port of wolf3d to work and sod to work
[16.git] / 16 / sod8086 / wl_menu.c
diff --git a/16/sod8086/wl_menu.c b/16/sod8086/wl_menu.c
new file mode 100755 (executable)
index 0000000..2003f6e
--- /dev/null
@@ -0,0 +1,3987 @@
+////////////////////////////////////////////////////////////////////\r
+//\r
+// WL_MENU.C\r
+// by John Romero (C) 1992 Id Software, Inc.\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+#include "wl_def.h"\r
+#pragma hdrstop\r
+\r
+//\r
+// PRIVATE PROTOTYPES\r
+//\r
+void CP_ReadThis(void);\r
+\r
+#ifdef SPEAR\r
+#define STARTITEM      newgame\r
+\r
+#else\r
+#ifdef GOODTIMES\r
+#define STARTITEM      newgame\r
+\r
+#else\r
+#define STARTITEM      readthis\r
+#endif\r
+#endif\r
+\r
+char far endStrings[9][80]=\r
+{\r
+#ifndef SPEAR\r
+       {"Dost thou wish to\nleave with such hasty\nabandon?"},\r
+       {"Chickening out...\nalready?"},\r
+       {"Press N for more carnage.\nPress Y to be a weenie."},\r
+       {"So, you think you can\nquit this easily, huh?"},\r
+       {"Press N to save the world.\nPress Y to abandon it in\nits hour of need."},\r
+       {"Press N if you are brave.\nPress Y to cower in shame."},\r
+       {"Heroes, press N.\nWimps, press Y."},\r
+       {"You are at an intersection.\nA sign says, 'Press Y to quit.'\n>"},\r
+       {"For guns and glory, press N.\nFor work and worry, press Y."}\r
+#else\r
+       ENDSTR1,\r
+       ENDSTR2,\r
+       ENDSTR3,\r
+       ENDSTR4,\r
+       ENDSTR5,\r
+       ENDSTR6,\r
+       ENDSTR7,\r
+       ENDSTR8,\r
+       ENDSTR9\r
+#endif\r
+};\r
+\r
+CP_iteminfo\r
+       MainItems={MENU_X,MENU_Y,10,STARTITEM,24},\r
+       SndItems={SM_X,SM_Y1,12,0,52},\r
+       LSItems={LSM_X,LSM_Y,10,0,24},\r
+       CtlItems={CTL_X,CTL_Y,6,-1,56},\r
+       CusItems={8,CST_Y+13*2,9,-1,0},\r
+       NewEitems={NE_X,NE_Y,11,0,88},\r
+       NewItems={NM_X,NM_Y,4,2,24};\r
+\r
+#pragma warn -sus\r
+CP_itemtype far\r
+MainMenu[]=\r
+{\r
+#ifdef JAPAN\r
+       {1,"",CP_NewGame},\r
+       {1,"",CP_Sound},\r
+       {1,"",CP_Control},\r
+       {1,"",CP_LoadGame},\r
+       {0,"",CP_SaveGame},\r
+       {1,"",CP_ChangeView},\r
+       {2,"",CP_ReadThis},\r
+       {1,"",CP_ViewScores},\r
+       {1,"",0},\r
+       {1,"",0}\r
+#else\r
+\r
+       {1,STR_NG,CP_NewGame},\r
+       {1,STR_SD,CP_Sound},\r
+       {1,STR_CL,CP_Control},\r
+       {1,STR_LG,CP_LoadGame},\r
+       {0,STR_SG,CP_SaveGame},\r
+       {1,STR_CV,CP_ChangeView},\r
+\r
+#ifndef GOODTIMES\r
+#ifndef SPEAR\r
+\r
+       #ifdef SPANISH\r
+       {2,"Ve esto!",CP_ReadThis},\r
+       #else\r
+       {2,"Read This!",CP_ReadThis},\r
+       #endif\r
+\r
+#endif\r
+#endif\r
+\r
+       {1,STR_VS,CP_ViewScores},\r
+       {1,STR_BD,0},\r
+       {1,STR_QT,0}\r
+#endif\r
+},\r
+\r
+far SndMenu[]=\r
+{\r
+#ifdef JAPAN\r
+       {1,"",0},\r
+       {1,"",0},\r
+       {1,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {1,"",0},\r
+       {1,"",0},\r
+       {1,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {1,"",0},\r
+       {1,"",0},\r
+#else\r
+       {1,STR_NONE,0},\r
+       {1,STR_PC,0},\r
+       {1,STR_ALSB,0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {1,STR_NONE,0},\r
+       {1,STR_DISNEY,0},\r
+       {1,STR_SB,0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {1,STR_NONE,0},\r
+       {1,STR_ALSB,0}\r
+#endif\r
+},\r
+\r
+far CtlMenu[]=\r
+{\r
+#ifdef JAPAN\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {0,"",MouseSensitivity},\r
+       {1,"",CustomControls}\r
+#else\r
+       {0,STR_MOUSEEN,0},\r
+       {0,STR_JOYEN,0},\r
+       {0,STR_PORT2,0},\r
+       {0,STR_GAMEPAD,0},\r
+       {0,STR_SENS,MouseSensitivity},\r
+       {1,STR_CUSTOM,CustomControls}\r
+#endif\r
+},\r
+\r
+#pragma warn +sus\r
+\r
+#ifndef SPEAR\r
+far NewEmenu[]=\r
+{\r
+#ifdef JAPAN\r
+#ifdef JAPDEMO\r
+       {1,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+#else\r
+       {1,"",0},\r
+       {0,"",0},\r
+       {1,"",0},\r
+       {0,"",0},\r
+       {1,"",0},\r
+       {0,"",0},\r
+       {1,"",0},\r
+       {0,"",0},\r
+       {1,"",0},\r
+       {0,"",0},\r
+       {1,"",0},\r
+       {0,"",0}\r
+#endif\r
+#else\r
+       #ifdef SPANISH\r
+       {1,"Episodio 1\n"\r
+          "Fuga desde Wolfenstein",0},\r
+       {0,"",0},\r
+       {3,"Episodio 2\n"\r
+                  "Operacion Eisenfaust",0},\r
+       {0,"",0},\r
+       {3,"Episodio 3\n"\r
+                  "Muere, Fuhrer, Muere!",0},\r
+       {0,"",0},\r
+       {3,"Episodio 4\n"\r
+                 "Un Negro Secreto",0},\r
+       {0,"",0},\r
+       {3,"Episodio 5\n"\r
+                 "Huellas del Loco",0},\r
+       {0,"",0},\r
+       {3,"Episodio 6\n"\r
+                 "Confrontacion",0}\r
+       #else\r
+       {1,"Episode 1\n"\r
+          "Escape from Wolfenstein",0},\r
+       {0,"",0},\r
+       {3,"Episode 2\n"\r
+                  "Operation: Eisenfaust",0},\r
+       {0,"",0},\r
+       {3,"Episode 3\n"\r
+                  "Die, Fuhrer, Die!",0},\r
+       {0,"",0},\r
+       {3,"Episode 4\n"\r
+                 "A Dark Secret",0},\r
+       {0,"",0},\r
+       {3,"Episode 5\n"\r
+                 "Trail of the Madman",0},\r
+       {0,"",0},\r
+       {3,"Episode 6\n"\r
+                 "Confrontation",0}\r
+       #endif\r
+#endif\r
+},\r
+#endif\r
+\r
+\r
+far NewMenu[]=\r
+{\r
+#ifdef JAPAN\r
+       {1,"",0},\r
+       {1,"",0},\r
+       {1,"",0},\r
+       {1,"",0}\r
+#else\r
+       {1,STR_DADDY,0},\r
+       {1,STR_HURTME,0},\r
+       {1,STR_BRINGEM,0},\r
+       {1,STR_DEATH,0}\r
+#endif\r
+},\r
+\r
+far LSMenu[]=\r
+{\r
+       {1,"",0},\r
+       {1,"",0},\r
+       {1,"",0},\r
+       {1,"",0},\r
+       {1,"",0},\r
+       {1,"",0},\r
+       {1,"",0},\r
+       {1,"",0},\r
+       {1,"",0},\r
+       {1,"",0}\r
+},\r
+\r
+far CusMenu[]=\r
+{\r
+       {1,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {1,"",0},\r
+       {0,"",0},\r
+       {0,"",0},\r
+       {1,"",0},\r
+       {0,"",0},\r
+       {1,"",0}\r
+}\r
+;\r
+\r
+\r
+int color_hlite[]={\r
+   DEACTIVE,\r
+   HIGHLIGHT,\r
+   READHCOLOR,\r
+   0x67\r
+   },\r
+\r
+   color_norml[]={\r
+   DEACTIVE,\r
+   TEXTCOLOR,\r
+   READCOLOR,\r
+   0x6b\r
+   };\r
+\r
+int EpisodeSelect[6]={1};\r
+\r
+\r
+int SaveGamesAvail[10],StartGame,SoundStatus=1,pickquick;\r
+char SaveGameNames[10][32],SaveName[13]="SAVEGAM?.";\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// INPUT MANAGER SCANCODE TABLES\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+static byte\r
+                                       *ScanNames[] =          // Scan code names with single chars\r
+                                       {\r
+       "?","?","1","2","3","4","5","6","7","8","9","0","-","+","?","?",\r
+       "Q","W","E","R","T","Y","U","I","O","P","[","]","|","?","A","S",\r
+       "D","F","G","H","J","K","L",";","\"","?","?","?","Z","X","C","V",\r
+       "B","N","M",",",".","/","?","?","?","?","?","?","?","?","?","?",\r
+       "?","?","?","?","?","?","?","?","\xf","?","-","\x15","5","\x11","+","?",\r
+       "\x13","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?",\r
+       "?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?",\r
+       "?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?"\r
+                                       },      // DEBUG - consolidate these\r
+                                       far ExtScanCodes[] =    // Scan codes with >1 char names\r
+                                       {\r
+       1,0xe,0xf,0x1d,0x2a,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,\r
+       0x3f,0x40,0x41,0x42,0x43,0x44,0x57,0x59,0x46,0x1c,0x36,\r
+       0x37,0x38,0x47,0x49,0x4f,0x51,0x52,0x53,0x45,0x48,\r
+       0x50,0x4b,0x4d,0x00\r
+                                       },\r
+                                       *ExtScanNames[] =       // Names corresponding to ExtScanCodes\r
+                                       {\r
+       "Esc","BkSp","Tab","Ctrl","LShft","Space","CapsLk","F1","F2","F3","F4",\r
+       "F5","F6","F7","F8","F9","F10","F11","F12","ScrlLk","Enter","RShft",\r
+       "PrtSc","Alt","Home","PgUp","End","PgDn","Ins","Del","NumLk","Up",\r
+       "Down","Left","Right",""\r
+                                       };\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// Wolfenstein Control Panel!  Ta Da!\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void US_ControlPanel(byte scancode)\r
+{\r
+       int which,i,start;\r
+\r
+\r
+       if (ingame)\r
+               if (CP_CheckQuick(scancode))\r
+                       return;\r
+\r
+       StartCPMusic(MENUSONG);\r
+       SetupControlPanel();\r
+\r
+       //\r
+       // F-KEYS FROM WITHIN GAME\r
+       //\r
+       switch(scancode)\r
+       {\r
+#ifndef SPEAR\r
+               case sc_F1:\r
+                       #ifdef SPEAR\r
+                       BossKey();\r
+                       #else\r
+                       #ifdef GOODTIMES\r
+                       BossKey();\r
+                       #else\r
+                       HelpScreens();\r
+                       #endif\r
+                       #endif\r
+                       goto finishup;\r
+#endif\r
+               case sc_F2:\r
+                       CP_SaveGame(0);\r
+                       goto finishup;\r
+\r
+               case sc_F3:\r
+                       CP_LoadGame(0);\r
+                       goto finishup;\r
+\r
+               case sc_F4:\r
+                       CP_Sound();\r
+                       goto finishup;\r
+\r
+               case sc_F5:\r
+                       CP_ChangeView();\r
+                       goto finishup;\r
+\r
+               case sc_F6:\r
+                       CP_Control();\r
+                       goto finishup;\r
+\r
+               finishup:\r
+                       CleanupControlPanel();\r
+                       #ifdef SPEAR\r
+                       UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+                       #endif\r
+                       return;\r
+       }\r
+\r
+#ifdef SPEAR\r
+       CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+#endif\r
+\r
+       DrawMainMenu();\r
+       MenuFadeIn();\r
+       StartGame=0;\r
+\r
+       //\r
+       // MAIN MENU LOOP\r
+       //\r
+       do\r
+       {\r
+               which=HandleMenu(&MainItems,&MainMenu[0],NULL);\r
+\r
+               #ifdef SPEAR\r
+               #ifndef SPEARDEMO\r
+               //\r
+               // EASTER EGG FOR SPEAR OF DESTINY!\r
+               //\r
+               if (Keyboard[sc_I] && Keyboard[sc_D])\r
+               {\r
+                       VW_FadeOut();\r
+                       StartCPMusic (XJAZNAZI_MUS);\r
+                       UnCacheLump(OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+                       UnCacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
+                       MM_SortMem ();\r
+                       ClearMemory ();\r
+\r
+\r
+                       CA_CacheGrChunk (IDGUYS1PIC);\r
+                       VWB_DrawPic(0,0,IDGUYS1PIC);\r
+                       UNCACHEGRCHUNK(IDGUYS1PIC);\r
+\r
+                       CA_CacheGrChunk (IDGUYS2PIC);\r
+                       VWB_DrawPic(0,80,IDGUYS2PIC);\r
+                       UNCACHEGRCHUNK(IDGUYS2PIC);\r
+\r
+                       VW_UpdateScreen();\r
+\r
+                       CA_CacheGrChunk (IDGUYSPALETTE);\r
+                       VL_FadeIn(0,255,grsegs[IDGUYSPALETTE],30);\r
+                       UNCACHEGRCHUNK(IDGUYSPALETTE);\r
+\r
+                       while (Keyboard[sc_I] || Keyboard[sc_D]);\r
+                       IN_ClearKeysDown();\r
+                       IN_Ack();\r
+\r
+                       VW_FadeOut();\r
+\r
+                       CacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
+                       CacheLump(OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+                       DrawMainMenu();\r
+                       StartCPMusic (MENUSONG);\r
+                       MenuFadeIn();\r
+               }\r
+               #endif\r
+               #endif\r
+\r
+               switch(which)\r
+               {\r
+                       case viewscores:\r
+                               if (MainMenu[viewscores].routine == NULL)\r
+                                       if (CP_EndGame())\r
+                                               StartGame=1;\r
+\r
+                               DrawMainMenu();\r
+                               MenuFadeIn();\r
+                               break;\r
+\r
+                       case backtodemo:\r
+                               #ifdef SPEAR\r
+                               if (!ingame)\r
+                               {\r
+                                       //\r
+                                       // DEALLOCATE ALL SOUNDS!\r
+                                       //\r
+                                       switch (SoundMode)\r
+                                       {\r
+                                               case sdm_PC:\r
+                                                       start = STARTPCSOUNDS;\r
+                                                       break;\r
+                                               case sdm_AdLib:\r
+                                                       start = STARTADLIBSOUNDS;\r
+                                                       break;\r
+                                       }\r
+\r
+                                       if (SoundMode != sdm_Off)\r
+                                               for (i=0;i<NUMSOUNDS;i++,start++)\r
+                                                       if (audiosegs[start])\r
+                                                               MM_SetPurge (&(memptr)audiosegs[start],3);              // make purgable\r
+                               }\r
+                               #endif\r
+\r
+                               MM_SortMem();\r
+                               StartGame=1;\r
+                               if (!ingame)\r
+                                       StartCPMusic(INTROSONG);\r
+                               VL_FadeOut(0,255,0,0,0,10);\r
+                               break;\r
+\r
+                       case -1:\r
+                       case quit:\r
+                               CP_Quit();\r
+                               break;\r
+\r
+                       default:\r
+                               if (!StartGame)\r
+                               {\r
+                                       DrawMainMenu();\r
+                                       MenuFadeIn();\r
+                               }\r
+               }\r
+\r
+       //\r
+       // "EXIT OPTIONS" OR "NEW GAME" EXITS\r
+       //\r
+       } while(!StartGame);\r
+\r
+       //\r
+       // DEALLOCATE EVERYTHING\r
+       //\r
+       CleanupControlPanel();\r
+\r
+       //\r
+       // CHANGE MAINMENU ITEM\r
+       //\r
+       if (startgame || loadedgame)\r
+       {\r
+               #pragma warn -sus\r
+               MainMenu[viewscores].routine = NULL;\r
+               #ifndef JAPAN\r
+               _fstrcpy(MainMenu[viewscores].string,STR_EG);\r
+               #endif\r
+               #pragma warn +sus\r
+       }\r
+\r
+       // RETURN/START GAME EXECUTION\r
+\r
+#ifdef SPEAR\r
+       UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+       MM_SortMem ();\r
+#endif\r
+}\r
+\r
+\r
+////////////////////////\r
+//\r
+// DRAW MAIN MENU SCREEN\r
+//\r
+void DrawMainMenu(void)\r
+{\r
+#ifdef JAPAN\r
+       CA_CacheScreen(S_OPTIONSPIC);\r
+#else\r
+       ClearMScreen();\r
+\r
+       VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
+       DrawStripes(10);\r
+       VWB_DrawPic(84,0,C_OPTIONSPIC);\r
+\r
+       #ifdef SPANISH\r
+       DrawWindow(MENU_X-8,MENU_Y-3,MENU_W+8,MENU_H,BKGDCOLOR);\r
+       #else\r
+       DrawWindow(MENU_X-8,MENU_Y-3,MENU_W,MENU_H,BKGDCOLOR);\r
+       #endif\r
+#endif\r
+\r
+       //\r
+       // CHANGE "GAME" AND "DEMO"\r
+       //\r
+       if (ingame)\r
+       {\r
+               #ifndef JAPAN\r
+\r
+               #ifdef SPANISH\r
+               _fstrcpy(&MainMenu[backtodemo].string,STR_GAME);\r
+               #else\r
+               _fstrcpy(&MainMenu[backtodemo].string[8],STR_GAME);\r
+               #endif\r
+\r
+               #else\r
+               CA_CacheGrChunk(C_MRETGAMEPIC);\r
+               VWB_DrawPic(12*8,20*8,C_MRETGAMEPIC);\r
+               UNCACHEGRCHUNK(C_MRETGAMEPIC);\r
+               CA_CacheGrChunk(C_MENDGAMEPIC);\r
+               VWB_DrawPic(12*8,18*8,C_MENDGAMEPIC);\r
+               UNCACHEGRCHUNK(C_MENDGAMEPIC);\r
+               #endif\r
+               MainMenu[backtodemo].active=2;\r
+       }\r
+       else\r
+       {\r
+               #ifndef JAPAN\r
+               #ifdef SPANISH\r
+               _fstrcpy(&MainMenu[backtodemo].string,STR_BD);\r
+               #else\r
+               _fstrcpy(&MainMenu[backtodemo].string[8],STR_DEMO);\r
+               #endif\r
+               #else\r
+               CA_CacheGrChunk(C_MRETDEMOPIC);\r
+               VWB_DrawPic(12*8,20*8,C_MRETDEMOPIC);\r
+               UNCACHEGRCHUNK(C_MRETDEMOPIC);\r
+               CA_CacheGrChunk(C_MSCORESPIC);\r
+               VWB_DrawPic(12*8,18*8,C_MSCORESPIC);\r
+               UNCACHEGRCHUNK(C_MSCORESPIC);\r
+               #endif\r
+               MainMenu[backtodemo].active=1;\r
+       }\r
+\r
+       DrawMenu(&MainItems,&MainMenu[0]);\r
+       VW_UpdateScreen();\r
+}\r
+\r
+#ifndef GOODTIMES\r
+#ifndef SPEAR\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// READ THIS!\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void CP_ReadThis(void)\r
+{\r
+       StartCPMusic(CORNER_MUS);\r
+       HelpScreens();\r
+       StartCPMusic(MENUSONG);\r
+}\r
+#endif\r
+#endif\r
+\r
+#ifndef SPEAR\r
+#ifndef GOODTIMES\r
+#else\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// BOSS KEY\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void BossKey(void)\r
+{\r
+       SD_MusicOff();\r
+       _AX = 3;\r
+       geninterrupt(0x10);\r
+       printf("C>");\r
+       while (!Keyboard[sc_Escape])\r
+       IN_ClearKeysDown();\r
+\r
+       SD_MusicOn();\r
+       VL_SetVGAPlaneMode ();\r
+       VL_TestPaletteSet ();\r
+       VL_SetPalette (&gamepal);\r
+       LoadLatchMem();\r
+}\r
+#endif\r
+#endif\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// CHECK QUICK-KEYS & QUIT (WHILE IN A GAME)\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+int CP_CheckQuick(unsigned scancode)\r
+{\r
+       switch(scancode)\r
+       {\r
+               //\r
+               // END GAME\r
+               //\r
+               case sc_F7:\r
+                       CA_CacheGrChunk(STARTFONT+1);\r
+\r
+                       WindowH=160;\r
+                       #ifdef JAPAN\r
+                       if (GetYorN(7,8,C_JAPQUITPIC))\r
+                       #else\r
+                       if (Confirm(ENDGAMESTR))\r
+                       #endif\r
+                       {\r
+                               playstate = ex_died;\r
+                               pickquick = gamestate.lives = 0;\r
+                       }\r
+\r
+                       DrawAllPlayBorder();\r
+                       WindowH=200;\r
+                       fontnumber=0;\r
+                       MainMenu[savegame].active = 0;\r
+                       return 1;\r
+\r
+               //\r
+               // QUICKSAVE\r
+               //\r
+               case sc_F8:\r
+                       if (SaveGamesAvail[LSItems.curpos] && pickquick)\r
+                       {\r
+                               CA_CacheGrChunk(STARTFONT+1);\r
+                               fontnumber = 1;\r
+                               Message(STR_SAVING"...");\r
+                               CP_SaveGame(1);\r
+                               fontnumber=0;\r
+                       }\r
+                       else\r
+                       {\r
+                               #ifndef SPEAR\r
+                               CA_CacheGrChunk(STARTFONT+1);\r
+                               CA_CacheGrChunk(C_CURSOR1PIC);\r
+                               CA_CacheGrChunk(C_CURSOR2PIC);\r
+                               CA_CacheGrChunk(C_DISKLOADING1PIC);\r
+                               CA_CacheGrChunk(C_DISKLOADING2PIC);\r
+                               CA_CacheGrChunk(C_SAVEGAMEPIC);\r
+                               CA_CacheGrChunk(C_MOUSELBACKPIC);\r
+                               #else\r
+                               CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
+                               CA_CacheGrChunk(C_CURSOR1PIC);\r
+                               #endif\r
+\r
+                               VW_FadeOut ();\r
+\r
+                               StartCPMusic(MENUSONG);\r
+                               pickquick=CP_SaveGame(0);\r
+\r
+                               SETFONTCOLOR(0,15);\r
+                               IN_ClearKeysDown();\r
+                               DrawPlayScreen ();\r
+\r
+                               if (!startgame && !loadedgame)\r
+                               {\r
+                                       VW_FadeIn ();\r
+                                       StartMusic ();\r
+                               }\r
+\r
+                               if (loadedgame)\r
+                                       playstate = ex_abort;\r
+                               lasttimecount = TimeCount;\r
+\r
+                               if (MousePresent)\r
+                                       Mouse(MDelta);  // Clear accumulated mouse movement\r
+\r
+                               PM_CheckMainMem ();\r
+\r
+                               #ifndef SPEAR\r
+                               UNCACHEGRCHUNK(C_CURSOR1PIC);\r
+                               UNCACHEGRCHUNK(C_CURSOR2PIC);\r
+                               UNCACHEGRCHUNK(C_DISKLOADING1PIC);\r
+                               UNCACHEGRCHUNK(C_DISKLOADING2PIC);\r
+                               UNCACHEGRCHUNK(C_SAVEGAMEPIC);\r
+                               UNCACHEGRCHUNK(C_MOUSELBACKPIC);\r
+                               #else\r
+                               UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
+                               #endif\r
+                       }\r
+                       return 1;\r
+\r
+               //\r
+               // QUICKLOAD\r
+               //\r
+               case sc_F9:\r
+                       if (SaveGamesAvail[LSItems.curpos] && pickquick)\r
+                       {\r
+                               char string[100]=STR_LGC;\r
+\r
+\r
+                               CA_CacheGrChunk(STARTFONT+1);\r
+                               fontnumber = 1;\r
+\r
+                               strcat(string,SaveGameNames[LSItems.curpos]);\r
+                               strcat(string,"\"?");\r
+\r
+                               if (Confirm(string))\r
+                                       CP_LoadGame(1);\r
+\r
+                               DrawAllPlayBorder();\r
+                               fontnumber=0;\r
+                       }\r
+                       else\r
+                       {\r
+                               #ifndef SPEAR\r
+                               CA_CacheGrChunk(STARTFONT+1);\r
+                               CA_CacheGrChunk(C_CURSOR1PIC);\r
+                               CA_CacheGrChunk(C_CURSOR2PIC);\r
+                               CA_CacheGrChunk(C_DISKLOADING1PIC);\r
+                               CA_CacheGrChunk(C_DISKLOADING2PIC);\r
+                               CA_CacheGrChunk(C_LOADGAMEPIC);\r
+                               CA_CacheGrChunk(C_MOUSELBACKPIC);\r
+                               #else\r
+                               CA_CacheGrChunk(C_CURSOR1PIC);\r
+                               CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
+                               #endif\r
+\r
+                               VW_FadeOut ();\r
+\r
+                               StartCPMusic(MENUSONG);\r
+                               pickquick=CP_LoadGame(0);\r
+\r
+                               SETFONTCOLOR(0,15);\r
+                               IN_ClearKeysDown();\r
+                               DrawPlayScreen ();\r
+\r
+                               if (!startgame && !loadedgame)\r
+                               {\r
+                                       VW_FadeIn ();\r
+                                       StartMusic ();\r
+                               }\r
+\r
+                               if (loadedgame)\r
+                                       playstate = ex_abort;\r
+\r
+                               lasttimecount = TimeCount;\r
+\r
+                               if (MousePresent)\r
+                                       Mouse(MDelta);  // Clear accumulated mouse movement\r
+                               PM_CheckMainMem ();\r
+\r
+                               #ifndef SPEAR\r
+                               UNCACHEGRCHUNK(C_CURSOR1PIC);\r
+                               UNCACHEGRCHUNK(C_CURSOR2PIC);\r
+                               UNCACHEGRCHUNK(C_DISKLOADING1PIC);\r
+                               UNCACHEGRCHUNK(C_DISKLOADING2PIC);\r
+                               UNCACHEGRCHUNK(C_LOADGAMEPIC);\r
+                               UNCACHEGRCHUNK(C_MOUSELBACKPIC);\r
+                               #else\r
+                               UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
+                               #endif\r
+                       }\r
+                       return 1;\r
+\r
+               //\r
+               // QUIT\r
+               //\r
+               case sc_F10:\r
+                       CA_CacheGrChunk(STARTFONT+1);\r
+\r
+                       WindowX=WindowY=0;\r
+                       WindowW=320;\r
+                       WindowH=160;\r
+                       #ifdef JAPAN\r
+                       if (GetYorN(7,8,C_QUITMSGPIC))\r
+                       #else\r
+                               #ifdef SPANISH\r
+                       if (Confirm(ENDGAMESTR))\r
+                               #else\r
+                       if (Confirm(endStrings[US_RndT()&0x7+(US_RndT()&1)]))\r
+                               #endif\r
+                       #endif\r
+                       {\r
+                               int i;\r
+\r
+\r
+                               VW_UpdateScreen();\r
+                               SD_MusicOff();\r
+                               SD_StopSound();\r
+                               MenuFadeOut();\r
+\r
+                               //\r
+                               // SHUT-UP THE ADLIB\r
+                               //\r
+                               for (i=1;i<=0xf5;i++)\r
+                                       alOut(i,0);\r
+                               Quit(NULL);\r
+                       }\r
+\r
+                       DrawAllPlayBorder();\r
+                       WindowH=200;\r
+                       fontnumber=0;\r
+                       return 1;\r
+               }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// END THE CURRENT GAME\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+int CP_EndGame(void)\r
+{\r
+#ifdef JAPAN\r
+       if (!GetYorN(7,8,C_JAPQUITPIC))\r
+#else\r
+       if (!Confirm(ENDGAMESTR))\r
+#endif\r
+               return 0;\r
+\r
+       pickquick = gamestate.lives = 0;\r
+       playstate = ex_died;\r
+\r
+       #pragma warn -sus\r
+       MainMenu[savegame].active = 0;\r
+       MainMenu[viewscores].routine=CP_ViewScores;\r
+       #ifndef JAPAN\r
+       _fstrcpy(MainMenu[viewscores].string,STR_VS);\r
+       #endif\r
+       #pragma warn +sus\r
+\r
+       return 1;\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// VIEW THE HIGH SCORES\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void CP_ViewScores(void)\r
+{\r
+       fontnumber=0;\r
+\r
+#ifdef SPEAR\r
+       UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+       StartCPMusic (XAWARD_MUS);\r
+#else\r
+       StartCPMusic (ROSTER_MUS);\r
+#endif\r
+\r
+       DrawHighScores ();\r
+       VW_UpdateScreen ();\r
+       MenuFadeIn();\r
+       fontnumber=1;\r
+\r
+       IN_Ack();\r
+\r
+       StartCPMusic(MENUSONG);\r
+       MenuFadeOut();\r
+\r
+#ifdef SPEAR\r
+       CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
+       CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+#endif\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// START A NEW GAME\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void CP_NewGame(void)\r
+{\r
+       int which,episode;\r
+\r
+#ifdef SPEAR\r
+       UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+#endif\r
+\r
+\r
+#ifndef SPEAR\r
+firstpart:\r
+\r
+       DrawNewEpisode();\r
+       do\r
+       {\r
+               which=HandleMenu(&NewEitems,&NewEmenu[0],NULL);\r
+               switch(which)\r
+               {\r
+                       case -1:\r
+                               MenuFadeOut();\r
+                               return;\r
+\r
+                       default:\r
+                               if (!EpisodeSelect[which/2])\r
+                               {\r
+                                       SD_PlaySound (NOWAYSND);\r
+                                       Message("Please select \"Read This!\"\n"\r
+                                                       "from the Options menu to\n"\r
+                                                       "find out how to order this\n"\r
+                                                       "episode from Apogee.");\r
+                                       IN_ClearKeysDown();\r
+                                       IN_Ack();\r
+                                       DrawNewEpisode();\r
+                                       which = 0;\r
+                               }\r
+                               else\r
+                               {\r
+                                       episode = which/2;\r
+                                       which = 1;\r
+                               }\r
+                               break;\r
+               }\r
+\r
+       } while (!which);\r
+\r
+       ShootSnd();\r
+\r
+       //\r
+       // ALREADY IN A GAME?\r
+       //\r
+       if (ingame)\r
+               #ifdef JAPAN\r
+               if (!GetYorN(7,8,C_JAPNEWGAMEPIC))\r
+               #else\r
+               if (!Confirm(CURGAME))\r
+               #endif\r
+               {\r
+                       MenuFadeOut();\r
+                       return;\r
+               }\r
+\r
+       MenuFadeOut();\r
+\r
+#else\r
+       episode = 0;\r
+\r
+       //\r
+       // ALREADY IN A GAME?\r
+       //\r
+       CacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);\r
+       DrawNewGame();\r
+       if (ingame)\r
+               if (!Confirm(CURGAME))\r
+               {\r
+                       MenuFadeOut();\r
+                       UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);\r
+                       CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+                       return;\r
+               }\r
+\r
+#endif\r
+\r
+       DrawNewGame();\r
+       which=HandleMenu(&NewItems,&NewMenu[0],DrawNewGameDiff);\r
+       if (which<0)\r
+       {\r
+               MenuFadeOut();\r
+               #ifndef SPEAR\r
+               goto firstpart;\r
+               #else\r
+               UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);\r
+               CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+               return;\r
+               #endif\r
+       }\r
+\r
+       ShootSnd();\r
+       NewGame(which,episode);\r
+       StartGame=1;\r
+       MenuFadeOut();\r
+\r
+       //\r
+       // CHANGE "READ THIS!" TO NORMAL COLOR\r
+       //\r
+       #ifndef SPEAR\r
+       #ifndef GOODTIMES\r
+       MainMenu[readthis].active=1;\r
+       #endif\r
+       #endif\r
+\r
+       pickquick = 0;\r
+\r
+#ifdef SPEAR\r
+       UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);\r
+       CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+#endif\r
+}\r
+\r
+\r
+#ifndef SPEAR\r
+/////////////////////\r
+//\r
+// DRAW NEW EPISODE MENU\r
+//\r
+void DrawNewEpisode(void)\r
+{\r
+       int i;\r
+\r
+#ifdef JAPAN\r
+       CA_CacheScreen(S_EPISODEPIC);\r
+#else\r
+       ClearMScreen();\r
+       VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
+\r
+       DrawWindow(NE_X-4,NE_Y-4,NE_W+8,NE_H+8,BKGDCOLOR);\r
+       SETFONTCOLOR(READHCOLOR,BKGDCOLOR);\r
+       PrintY=2;\r
+       WindowX=0;\r
+       #ifdef SPANISH\r
+       US_CPrint("Cual episodio jugar?");\r
+       #else\r
+       US_CPrint("Which episode to play?");\r
+       #endif\r
+#endif\r
+\r
+       SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
+       DrawMenu(&NewEitems,&NewEmenu[0]);\r
+\r
+       for (i=0;i<6;i++)\r
+               VWB_DrawPic(NE_X+32,NE_Y+i*26,C_EPISODE1PIC+i);\r
+\r
+       VW_UpdateScreen();\r
+       MenuFadeIn();\r
+       WaitKeyUp();\r
+}\r
+#endif\r
+\r
+/////////////////////\r
+//\r
+// DRAW NEW GAME MENU\r
+//\r
+void DrawNewGame(void)\r
+{\r
+#ifdef JAPAN\r
+       CA_CacheScreen(S_SKILLPIC);\r
+#else\r
+       ClearMScreen();\r
+       VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
+\r
+       SETFONTCOLOR(READHCOLOR,BKGDCOLOR);\r
+       PrintX=NM_X+20;\r
+       PrintY=NM_Y-32;\r
+\r
+#ifndef SPEAR\r
+       #ifdef SPANISH\r
+       US_Print("Eres macho?");\r
+       #else\r
+       US_Print("How tough are you?");\r
+       #endif\r
+#else\r
+       VWB_DrawPic (PrintX,PrintY,C_HOWTOUGHPIC);\r
+#endif\r
+\r
+       DrawWindow(NM_X-5,NM_Y-10,NM_W,NM_H,BKGDCOLOR);\r
+#endif\r
+\r
+       DrawMenu(&NewItems,&NewMenu[0]);\r
+       DrawNewGameDiff(NewItems.curpos);\r
+       VW_UpdateScreen();\r
+       MenuFadeIn();\r
+       WaitKeyUp();\r
+}\r
+\r
+\r
+////////////////////////\r
+//\r
+// DRAW NEW GAME GRAPHIC\r
+//\r
+void DrawNewGameDiff(int w)\r
+{\r
+       VWB_DrawPic(NM_X+185,NM_Y+7,w+C_BABYMODEPIC);\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// HANDLE SOUND MENU\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void CP_Sound(void)\r
+{\r
+       int which,i;\r
+\r
+\r
+#ifdef SPEAR\r
+       UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+       CacheLump (SOUND_LUMP_START,SOUND_LUMP_END);\r
+#endif\r
+\r
+       DrawSoundMenu();\r
+       MenuFadeIn();\r
+       WaitKeyUp();\r
+\r
+       do\r
+       {\r
+               which=HandleMenu(&SndItems,&SndMenu[0],NULL);\r
+               //\r
+               // HANDLE MENU CHOICES\r
+               //\r
+               switch(which)\r
+               {\r
+                       //\r
+                       // SOUND EFFECTS\r
+                       //\r
+                       case 0:\r
+                               if (SoundMode!=sdm_Off)\r
+                               {\r
+                                       SD_WaitSoundDone();\r
+                                       SD_SetSoundMode(sdm_Off);\r
+                                       DrawSoundMenu();\r
+                               }\r
+                               break;\r
+                       case 1:\r
+                               if (SoundMode!=sdm_PC)\r
+                               {\r
+                                       SD_WaitSoundDone();\r
+                                       SD_SetSoundMode(sdm_PC);\r
+                                       CA_LoadAllSounds();\r
+                                       DrawSoundMenu();\r
+                                       ShootSnd();\r
+                               }\r
+                               break;\r
+                       case 2:\r
+                               if (SoundMode!=sdm_AdLib)\r
+                               {\r
+                                       SD_WaitSoundDone();\r
+                                       SD_SetSoundMode(sdm_AdLib);\r
+                                       CA_LoadAllSounds();\r
+                                       DrawSoundMenu();\r
+                                       ShootSnd();\r
+                               }\r
+                               break;\r
+\r
+                       //\r
+                       // DIGITIZED SOUND\r
+                       //\r
+                       case 5:\r
+                               if (DigiMode!=sds_Off)\r
+                               {\r
+                                       SD_SetDigiDevice(sds_Off);\r
+                                       DrawSoundMenu();\r
+                               }\r
+                               break;\r
+                       case 6:\r
+                               if (DigiMode!=sds_SoundSource)\r
+                               {\r
+                                       SD_SetDigiDevice(sds_SoundSource);\r
+                                       DrawSoundMenu();\r
+                                       ShootSnd();\r
+                               }\r
+                               break;\r
+                       case 7:\r
+                               if (DigiMode!=sds_SoundBlaster)\r
+                               {\r
+                                       SD_SetDigiDevice(sds_SoundBlaster);\r
+                                       DrawSoundMenu();\r
+                                       ShootSnd();\r
+                               }\r
+                               break;\r
+\r
+                       //\r
+                       // MUSIC\r
+                       //\r
+                       case 10:\r
+                               if (MusicMode!=smm_Off)\r
+                               {\r
+                                       SD_SetMusicMode(smm_Off);\r
+                                       DrawSoundMenu();\r
+                                       ShootSnd();\r
+                               }\r
+                               break;\r
+                       case 11:\r
+                               if (MusicMode!=smm_AdLib)\r
+                               {\r
+                                       SD_SetMusicMode(smm_AdLib);\r
+                                       DrawSoundMenu();\r
+                                       ShootSnd();\r
+                                       StartCPMusic(MENUSONG);\r
+                               }\r
+                               break;\r
+               }\r
+       } while(which>=0);\r
+\r
+       MenuFadeOut();\r
+\r
+#ifdef SPEAR\r
+       UnCacheLump (SOUND_LUMP_START,SOUND_LUMP_END);\r
+       CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+#endif\r
+}\r
+\r
+\r
+//////////////////////\r
+//\r
+// DRAW THE SOUND MENU\r
+//\r
+void DrawSoundMenu(void)\r
+{\r
+       int i,on;\r
+\r
+\r
+#ifdef JAPAN\r
+       CA_CacheScreen(S_SOUNDPIC);\r
+#else\r
+       //\r
+       // DRAW SOUND MENU\r
+       //\r
+       ClearMScreen();\r
+       VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
+\r
+       DrawWindow(SM_X-8,SM_Y1-3,SM_W,SM_H1,BKGDCOLOR);\r
+       DrawWindow(SM_X-8,SM_Y2-3,SM_W,SM_H2,BKGDCOLOR);\r
+       DrawWindow(SM_X-8,SM_Y3-3,SM_W,SM_H3,BKGDCOLOR);\r
+#endif\r
+\r
+       //\r
+       // IF NO ADLIB, NON-CHOOSENESS!\r
+       //\r
+       if (!AdLibPresent && !SoundBlasterPresent)\r
+       {\r
+               SndMenu[2].active=SndMenu[10].active=SndMenu[11].active=0;\r
+       }\r
+\r
+       if (!SoundSourcePresent)\r
+               SndMenu[6].active=0;\r
+\r
+       if (!SoundBlasterPresent)\r
+               SndMenu[7].active=0;\r
+\r
+       if (!SoundSourcePresent && !SoundBlasterPresent)\r
+               SndMenu[5].active=0;\r
+\r
+       DrawMenu(&SndItems,&SndMenu[0]);\r
+#ifndef JAPAN\r
+       VWB_DrawPic(100,SM_Y1-20,C_FXTITLEPIC);\r
+       VWB_DrawPic(100,SM_Y2-20,C_DIGITITLEPIC);\r
+       VWB_DrawPic(100,SM_Y3-20,C_MUSICTITLEPIC);\r
+#endif\r
+\r
+       for (i=0;i<SndItems.amount;i++)\r
+#ifdef JAPAN\r
+               if (i!=3 && i!=4 && i!=8 && i!=9)\r
+#else\r
+               if (SndMenu[i].string[0])\r
+#endif\r
+               {\r
+                       //\r
+                       // DRAW SELECTED/NOT SELECTED GRAPHIC BUTTONS\r
+                       //\r
+                       on=0;\r
+                       switch(i)\r
+                       {\r
+                               //\r
+                               // SOUND EFFECTS\r
+                               //\r
+                               case 0: if (SoundMode==sdm_Off) on=1; break;\r
+                               case 1: if (SoundMode==sdm_PC) on=1; break;\r
+                               case 2: if (SoundMode==sdm_AdLib) on=1; break;\r
+\r
+                               //\r
+                               // DIGITIZED SOUND\r
+                               //\r
+                               case 5: if (DigiMode==sds_Off) on=1; break;\r
+                               case 6: if (DigiMode==sds_SoundSource) on=1; break;\r
+                               case 7: if (DigiMode==sds_SoundBlaster) on=1; break;\r
+\r
+                               //\r
+                               // MUSIC\r
+                               //\r
+                               case 10: if (MusicMode==smm_Off) on=1; break;\r
+                               case 11: if (MusicMode==smm_AdLib) on=1; break;\r
+                       }\r
+\r
+                       if (on)\r
+                               VWB_DrawPic(SM_X+24,SM_Y1+i*13+2,C_SELECTEDPIC);\r
+                       else\r
+                               VWB_DrawPic(SM_X+24,SM_Y1+i*13+2,C_NOTSELECTEDPIC);\r
+               }\r
+\r
+       DrawMenuGun(&SndItems);\r
+       VW_UpdateScreen();\r
+}\r
+\r
+\r
+//\r
+// DRAW LOAD/SAVE IN PROGRESS\r
+//\r
+void DrawLSAction(int which)\r
+{\r
+       #define LSA_X   96\r
+       #define LSA_Y   80\r
+       #define LSA_W   130\r
+       #define LSA_H   42\r
+\r
+       DrawWindow(LSA_X,LSA_Y,LSA_W,LSA_H,TEXTCOLOR);\r
+       DrawOutline(LSA_X,LSA_Y,LSA_W,LSA_H,0,HIGHLIGHT);\r
+       VWB_DrawPic(LSA_X+8,LSA_Y+5,C_DISKLOADING1PIC);\r
+\r
+       fontnumber=1;\r
+       SETFONTCOLOR(0,TEXTCOLOR);\r
+       PrintX=LSA_X+46;\r
+       PrintY=LSA_Y+13;\r
+\r
+       if (!which)\r
+               US_Print(STR_LOADING"...");\r
+       else\r
+               US_Print(STR_SAVING"...");\r
+\r
+       VW_UpdateScreen();\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// LOAD SAVED GAMES\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+int CP_LoadGame(int quick)\r
+{\r
+       int handle,which,exit=0;\r
+       char name[13];\r
+\r
+\r
+       strcpy(name,SaveName);\r
+\r
+       //\r
+       // QUICKLOAD?\r
+       //\r
+       if (quick)\r
+       {\r
+               which=LSItems.curpos;\r
+\r
+               if (SaveGamesAvail[which])\r
+               {\r
+                       name[7]=which+'0';\r
+                       handle=open(name,O_BINARY);\r
+                       lseek(handle,32,SEEK_SET);\r
+                       loadedgame=true;\r
+                       LoadTheGame(handle,0,0);\r
+                       loadedgame=false;\r
+                       close(handle);\r
+\r
+                       DrawFace ();\r
+                       DrawHealth ();\r
+                       DrawLives ();\r
+                       DrawLevel ();\r
+                       DrawAmmo ();\r
+                       DrawKeys ();\r
+                       DrawWeapon ();\r
+                       DrawScore ();\r
+                       return 1;\r
+               }\r
+       }\r
+\r
+\r
+#ifdef SPEAR\r
+       UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+       CacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);\r
+#endif\r
+\r
+       DrawLoadSaveScreen(0);\r
+\r
+       do\r
+       {\r
+               which=HandleMenu(&LSItems,&LSMenu[0],TrackWhichGame);\r
+               if (which>=0 && SaveGamesAvail[which])\r
+               {\r
+                       ShootSnd();\r
+                       name[7]=which+'0';\r
+\r
+                       handle=open(name,O_BINARY);\r
+                       lseek(handle,32,SEEK_SET);\r
+\r
+                       DrawLSAction(0);\r
+                       loadedgame=true;\r
+\r
+                       LoadTheGame(handle,LSA_X+8,LSA_Y+5);\r
+                       close(handle);\r
+\r
+                       StartGame=1;\r
+                       ShootSnd();\r
+                       //\r
+                       // CHANGE "READ THIS!" TO NORMAL COLOR\r
+                       //\r
+\r
+                       #ifndef SPEAR\r
+                       #ifndef GOODTIMES\r
+                       MainMenu[readthis].active=1;\r
+                       #endif\r
+                       #endif\r
+\r
+                       exit=1;\r
+                       break;\r
+               }\r
+\r
+       } while(which>=0);\r
+\r
+       MenuFadeOut();\r
+\r
+#ifdef SPEAR\r
+       UnCacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);\r
+       CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+#endif\r
+\r
+       return exit;\r
+}\r
+\r
+\r
+///////////////////////////////////\r
+//\r
+// HIGHLIGHT CURRENT SELECTED ENTRY\r
+//\r
+void TrackWhichGame(int w)\r
+{\r
+       static int lastgameon=0;\r
+\r
+       PrintLSEntry(lastgameon,TEXTCOLOR);\r
+       PrintLSEntry(w,HIGHLIGHT);\r
+\r
+       lastgameon=w;\r
+}\r
+\r
+\r
+////////////////////////////\r
+//\r
+// DRAW THE LOAD/SAVE SCREEN\r
+//\r
+void DrawLoadSaveScreen(int loadsave)\r
+{\r
+       #define DISKX   100\r
+       #define DISKY   0\r
+\r
+       int i;\r
+\r
+\r
+       ClearMScreen();\r
+       fontnumber=1;\r
+       VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
+       DrawWindow(LSM_X-10,LSM_Y-5,LSM_W,LSM_H,BKGDCOLOR);\r
+       DrawStripes(10);\r
+\r
+       if (!loadsave)\r
+               VWB_DrawPic(60,0,C_LOADGAMEPIC);\r
+       else\r
+               VWB_DrawPic(60,0,C_SAVEGAMEPIC);\r
+\r
+       for (i=0;i<10;i++)\r
+               PrintLSEntry(i,TEXTCOLOR);\r
+\r
+       DrawMenu(&LSItems,&LSMenu[0]);\r
+       VW_UpdateScreen();\r
+       MenuFadeIn();\r
+       WaitKeyUp();\r
+}\r
+\r
+\r
+///////////////////////////////////////////\r
+//\r
+// PRINT LOAD/SAVE GAME ENTRY W/BOX OUTLINE\r
+//\r
+void PrintLSEntry(int w,int color)\r
+{\r
+       SETFONTCOLOR(color,BKGDCOLOR);\r
+       DrawOutline(LSM_X+LSItems.indent,LSM_Y+w*13,LSM_W-LSItems.indent-15,11,color,color);\r
+       PrintX=LSM_X+LSItems.indent+2;\r
+       PrintY=LSM_Y+w*13+1;\r
+       fontnumber=0;\r
+\r
+       if (SaveGamesAvail[w])\r
+               US_Print(SaveGameNames[w]);\r
+       else\r
+               US_Print("      - "STR_EMPTY" -");\r
+\r
+       fontnumber=1;\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// SAVE CURRENT GAME\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+int CP_SaveGame(int quick)\r
+{\r
+       int handle,which,exit=0;\r
+       unsigned nwritten;\r
+       char name[13],input[32];\r
+\r
+\r
+       strcpy(name,SaveName);\r
+\r
+       //\r
+       // QUICKSAVE?\r
+       //\r
+       if (quick)\r
+       {\r
+               which=LSItems.curpos;\r
+\r
+               if (SaveGamesAvail[which])\r
+               {\r
+                       name[7]=which+'0';\r
+                       unlink(name);\r
+                       handle=creat(name,S_IREAD|S_IWRITE);\r
+\r
+                       strcpy(input,&SaveGameNames[which][0]);\r
+\r
+                       _dos_write(handle,(void far *)input,32,&nwritten);\r
+                       lseek(handle,32,SEEK_SET);\r
+                       SaveTheGame(handle,0,0);\r
+                       close(handle);\r
+\r
+                       return 1;\r
+               }\r
+       }\r
+\r
+\r
+#ifdef SPEAR\r
+       UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+       CacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);\r
+#endif\r
+\r
+       DrawLoadSaveScreen(1);\r
+\r
+       do\r
+       {\r
+               which=HandleMenu(&LSItems,&LSMenu[0],TrackWhichGame);\r
+               if (which>=0)\r
+               {\r
+                       //\r
+                       // OVERWRITE EXISTING SAVEGAME?\r
+                       //\r
+                       if (SaveGamesAvail[which])\r
+                               #ifdef JAPAN\r
+                               if (!GetYorN(7,8,C_JAPSAVEOVERPIC))\r
+                               #else\r
+                               if (!Confirm(GAMESVD))\r
+                               #endif\r
+                               {\r
+                                       DrawLoadSaveScreen(1);\r
+                                       continue;\r
+                               }\r
+                               else\r
+                               {\r
+                                       DrawLoadSaveScreen(1);\r
+                                       PrintLSEntry(which,HIGHLIGHT);\r
+                                       VW_UpdateScreen();\r
+                               }\r
+\r
+                       ShootSnd();\r
+\r
+                       strcpy(input,&SaveGameNames[which][0]);\r
+                       name[7]=which+'0';\r
+\r
+                       fontnumber=0;\r
+                       if (!SaveGamesAvail[which])\r
+                               VWB_Bar(LSM_X+LSItems.indent+1,LSM_Y+which*13+1,LSM_W-LSItems.indent-16,10,BKGDCOLOR);\r
+                       VW_UpdateScreen();\r
+\r
+                       if (US_LineInput(LSM_X+LSItems.indent+2,LSM_Y+which*13+1,input,input,true,31,LSM_W-LSItems.indent-30))\r
+                       {\r
+                               SaveGamesAvail[which]=1;\r
+                               strcpy(&SaveGameNames[which][0],input);\r
+\r
+                               unlink(name);\r
+                               handle=creat(name,S_IREAD|S_IWRITE);\r
+                               _dos_write(handle,(void far *)input,32,&nwritten);\r
+                               lseek(handle,32,SEEK_SET);\r
+\r
+                               DrawLSAction(1);\r
+                               SaveTheGame(handle,LSA_X+8,LSA_Y+5);\r
+\r
+                               close(handle);\r
+\r
+                               ShootSnd();\r
+                               exit=1;\r
+                       }\r
+                       else\r
+                       {\r
+                               VWB_Bar(LSM_X+LSItems.indent+1,LSM_Y+which*13+1,LSM_W-LSItems.indent-16,10,BKGDCOLOR);\r
+                               PrintLSEntry(which,HIGHLIGHT);\r
+                               VW_UpdateScreen();\r
+                               SD_PlaySound(ESCPRESSEDSND);\r
+                               continue;\r
+                       }\r
+\r
+                       fontnumber=1;\r
+                       break;\r
+               }\r
+\r
+       } while(which>=0);\r
+\r
+       MenuFadeOut();\r
+\r
+#ifdef SPEAR\r
+       UnCacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);\r
+       CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+#endif\r
+\r
+       return exit;\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// CALIBRATE JOYSTICK\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+int CalibrateJoystick(void)\r
+{\r
+       #define CALX    85\r
+       #define CALY    40\r
+       #define CALW    158\r
+       #define CALH    140\r
+\r
+       unsigned xmin,ymin,xmax,ymax,jb;\r
+\r
+\r
+\r
+       #ifdef JAPAN\r
+       VWB_DrawPic(CALX,CALY,C_JOY0PIC);\r
+       #else\r
+       DrawWindow(CALX-5,CALY-5,CALW,CALH,TEXTCOLOR);\r
+       DrawOutline(CALX-5,CALY-5,CALW,CALH,0,HIGHLIGHT);\r
+       SETFONTCOLOR(0,TEXTCOLOR);\r
+\r
+       WindowX = PrintX = CALX;\r
+       WindowW = CALW;\r
+       WindowH = CALH;\r
+       WindowY = PrintY = CALY;\r
+       US_Print("    "STR_CALIB"\n    "STR_JOYST"\n");\r
+       VWB_DrawPic(CALX+40,CALY+30,C_JOY1PIC);\r
+       PrintY = CALY+80;\r
+       US_Print(STR_MOVEJOY);\r
+       SETFONTCOLOR(BKGDCOLOR,TEXTCOLOR);\r
+       US_Print("   "STR_ESCEXIT);\r
+       #endif\r
+       VW_UpdateScreen();\r
+\r
+       do\r
+       {\r
+               jb=IN_JoyButtons();\r
+               if (Keyboard[sc_Escape])\r
+                       return 0;\r
+               #ifndef SPEAR\r
+               if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
+                       PicturePause();\r
+               #endif\r
+\r
+       } while(!(jb&1));\r
+\r
+       SD_PlaySound(SHOOTSND);\r
+       IN_GetJoyAbs(joystickport,&xmin,&ymin);\r
+\r
+\r
+       #ifdef JAPAN\r
+       VWB_DrawPic(CALX,CALY,C_JOY1PIC);\r
+       #else\r
+       DrawWindow(CALX-5,CALY-5,CALW,CALH,TEXTCOLOR);\r
+       DrawOutline(CALX-5,CALY-5,CALW,CALH,0,HIGHLIGHT);\r
+       SETFONTCOLOR(0,TEXTCOLOR);\r
+\r
+       PrintX = CALX;\r
+       PrintY = CALY;\r
+       US_Print("    "STR_CALIB"\n    "STR_JOYST"\n");\r
+       VWB_DrawPic(CALX+40,CALY+30,C_JOY2PIC);\r
+       PrintY = CALY+80;\r
+       US_Print(STR_MOVEJOY2);\r
+       SETFONTCOLOR(BKGDCOLOR,TEXTCOLOR);\r
+       US_Print("   "STR_ESCEXIT);\r
+       #endif\r
+       VW_UpdateScreen();\r
+\r
+       do\r
+       {\r
+               jb=IN_JoyButtons();\r
+               if (Keyboard[sc_Escape])\r
+                       return 0;\r
+               #ifndef SPEAR\r
+               if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
+                       PicturePause();\r
+               #endif\r
+       } while(!(jb&2));\r
+\r
+       IN_GetJoyAbs(joystickport,&xmax,&ymax);\r
+       SD_PlaySound(SHOOTSND);\r
+\r
+       while (IN_JoyButtons());\r
+\r
+       //\r
+       // ASSIGN ACTUAL VALUES HERE\r
+       //\r
+       if ((xmin != xmax) && (ymin != ymax))\r
+               IN_SetupJoy(joystickport,xmin,xmax,ymin,ymax);\r
+       else\r
+               return 0;\r
+\r
+       return 1;\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// DEFINE CONTROLS\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void CP_Control(void)\r
+{\r
+       #define CTL_SPC 70\r
+       enum {MOUSEENABLE,JOYENABLE,USEPORT2,PADENABLE,MOUSESENS,CUSTOMIZE};\r
+       int i,which;\r
+\r
+\r
+#ifdef SPEAR\r
+       UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+       CacheLump (CONTROL_LUMP_START,CONTROL_LUMP_END);\r
+#endif\r
+\r
+       DrawCtlScreen();\r
+       MenuFadeIn();\r
+       WaitKeyUp();\r
+\r
+       do\r
+       {\r
+               which=HandleMenu(&CtlItems,&CtlMenu[0],NULL);\r
+               switch(which)\r
+               {\r
+                       case MOUSEENABLE:\r
+                               mouseenabled^=1;\r
+                               _CX=_DX=CENTER;\r
+                               Mouse(4);\r
+                               DrawCtlScreen();\r
+                               CusItems.curpos=-1;\r
+                               ShootSnd();\r
+                               break;\r
+\r
+                       case JOYENABLE:\r
+                               joystickenabled^=1;\r
+                               if (joystickenabled)\r
+                                       if (!CalibrateJoystick())\r
+                                               joystickenabled = 0;\r
+                               DrawCtlScreen();\r
+                               CusItems.curpos=-1;\r
+                               ShootSnd();\r
+                               break;\r
+\r
+                       case USEPORT2:\r
+                               joystickport^=1;\r
+                               DrawCtlScreen();\r
+                               ShootSnd();\r
+                               break;\r
+\r
+                       case PADENABLE:\r
+                               joypadenabled^=1;\r
+                               DrawCtlScreen();\r
+                               ShootSnd();\r
+                               break;\r
+\r
+                       case MOUSESENS:\r
+                       case CUSTOMIZE:\r
+                               DrawCtlScreen();\r
+                               MenuFadeIn();\r
+                               WaitKeyUp();\r
+                               break;\r
+               }\r
+       } while(which>=0);\r
+\r
+       MenuFadeOut();\r
+\r
+#ifdef SPEAR\r
+       UnCacheLump (CONTROL_LUMP_START,CONTROL_LUMP_END);\r
+       CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
+#endif\r
+}\r
+\r
+\r
+////////////////////////////////\r
+//\r
+// DRAW MOUSE SENSITIVITY SCREEN\r
+//\r
+void DrawMouseSens(void)\r
+{\r
+#ifdef JAPAN\r
+       CA_CacheScreen(S_MOUSESENSPIC);\r
+#else\r
+       ClearMScreen();\r
+       VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
+       #ifdef SPANISH\r
+       DrawWindow(10,80,300,43,BKGDCOLOR);\r
+       #else\r
+       DrawWindow(10,80,300,30,BKGDCOLOR);\r
+       #endif\r
+\r
+       WindowX=0;\r
+       WindowW=320;\r
+       PrintY=82;\r
+       SETFONTCOLOR(READCOLOR,BKGDCOLOR);\r
+       US_CPrint(STR_MOUSEADJ);\r
+\r
+       SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
+       #ifdef SPANISH\r
+       PrintX=14;\r
+       PrintY=95+13;\r
+       US_Print(STR_SLOW);\r
+       PrintX=252;\r
+       US_Print(STR_FAST);\r
+       #else\r
+       PrintX=14;\r
+       PrintY=95;\r
+       US_Print(STR_SLOW);\r
+       PrintX=269;\r
+       US_Print(STR_FAST);\r
+       #endif\r
+#endif\r
+\r
+       VWB_Bar(60,97,200,10,TEXTCOLOR);\r
+       DrawOutline(60,97,200,10,0,HIGHLIGHT);\r
+       DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLOR);\r
+       VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);\r
+\r
+       VW_UpdateScreen();\r
+       MenuFadeIn();\r
+}\r
+\r
+\r
+///////////////////////////\r
+//\r
+// ADJUST MOUSE SENSITIVITY\r
+//\r
+void MouseSensitivity(void)\r
+{\r
+       ControlInfo ci;\r
+       int exit=0,oldMA;\r
+\r
+\r
+       oldMA=mouseadjustment;\r
+       DrawMouseSens();\r
+       do\r
+       {\r
+               ReadAnyControl(&ci);\r
+               switch(ci.dir)\r
+               {\r
+                       case dir_North:\r
+                       case dir_West:\r
+                               if (mouseadjustment)\r
+                               {\r
+                                       mouseadjustment--;\r
+                                       VWB_Bar(60,97,200,10,TEXTCOLOR);\r
+                                       DrawOutline(60,97,200,10,0,HIGHLIGHT);\r
+                                       DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLOR);\r
+                                       VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);\r
+                                       VW_UpdateScreen();\r
+                                       SD_PlaySound(MOVEGUN1SND);\r
+                                       while(Keyboard[sc_LeftArrow]);\r
+                                       WaitKeyUp();\r
+                               }\r
+                               break;\r
+\r
+                       case dir_South:\r
+                       case dir_East:\r
+                               if (mouseadjustment<9)\r
+                               {\r
+                                       mouseadjustment++;\r
+                                       VWB_Bar(60,97,200,10,TEXTCOLOR);\r
+                                       DrawOutline(60,97,200,10,0,HIGHLIGHT);\r
+                                       DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLOR);\r
+                                       VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);\r
+                                       VW_UpdateScreen();\r
+                                       SD_PlaySound(MOVEGUN1SND);\r
+                                       while(Keyboard[sc_RightArrow]);\r
+                                       WaitKeyUp();\r
+                               }\r
+                               break;\r
+               }\r
+\r
+               #ifndef SPEAR\r
+               if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
+               #else\r
+               if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("debugmode"))\r
+               #endif\r
+                       PicturePause();\r
+\r
+               if (ci.button0 || Keyboard[sc_Space] || Keyboard[sc_Enter])\r
+                       exit=1;\r
+               else\r
+               if (ci.button1 || Keyboard[sc_Escape])\r
+                       exit=2;\r
+\r
+       } while(!exit);\r
+\r
+       if (exit==2)\r
+       {\r
+               mouseadjustment=oldMA;\r
+               SD_PlaySound(ESCPRESSEDSND);\r
+       }\r
+       else\r
+               SD_PlaySound(SHOOTSND);\r
+\r
+       WaitKeyUp();\r
+       MenuFadeOut();\r
+}\r
+\r
+\r
+///////////////////////////\r
+//\r
+// DRAW CONTROL MENU SCREEN\r
+//\r
+void DrawCtlScreen(void)\r
+{\r
+ int i,x,y;\r
+\r
+\r
+#ifdef JAPAN\r
+       CA_CacheScreen(S_CONTROLPIC);\r
+#else\r
+ ClearMScreen();\r
+ DrawStripes(10);\r
+ VWB_DrawPic(80,0,C_CONTROLPIC);\r
+ VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
+ DrawWindow(CTL_X-8,CTL_Y-5,CTL_W,CTL_H,BKGDCOLOR);\r
+#endif\r
+ WindowX=0;\r
+ WindowW=320;\r
+ SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
+\r
+ if (JoysPresent[0])\r
+   CtlMenu[1].active=\r
+   CtlMenu[2].active=\r
+   CtlMenu[3].active=1;\r
+\r
+ CtlMenu[2].active=CtlMenu[3].active=joystickenabled;\r
+\r
+ if (MousePresent)\r
+ {\r
+  CtlMenu[4].active=\r
+  CtlMenu[0].active=1;\r
+ }\r
+\r
+ CtlMenu[4].active=mouseenabled;\r
+\r
+\r
+ DrawMenu(&CtlItems,&CtlMenu[0]);\r
+\r
+\r
+ x=CTL_X+CtlItems.indent-24;\r
+ y=CTL_Y+3;\r
+ if (mouseenabled)\r
+   VWB_DrawPic(x,y,C_SELECTEDPIC);\r
+ else\r
+   VWB_DrawPic(x,y,C_NOTSELECTEDPIC);\r
+\r
+ y=CTL_Y+16;\r
+ if (joystickenabled)\r
+   VWB_DrawPic(x,y,C_SELECTEDPIC);\r
+ else\r
+   VWB_DrawPic(x,y,C_NOTSELECTEDPIC);\r
+\r
+ y=CTL_Y+29;\r
+ if (joystickport)\r
+   VWB_DrawPic(x,y,C_SELECTEDPIC);\r
+ else\r
+   VWB_DrawPic(x,y,C_NOTSELECTEDPIC);\r
+\r
+ y=CTL_Y+42;\r
+ if (joypadenabled)\r
+   VWB_DrawPic(x,y,C_SELECTEDPIC);\r
+ else\r
+   VWB_DrawPic(x,y,C_NOTSELECTEDPIC);\r
+\r
+ //\r
+ // PICK FIRST AVAILABLE SPOT\r
+ //\r
+ if (CtlItems.curpos<0 || !CtlMenu[CtlItems.curpos].active)\r
+   for (i=0;i<6;i++)\r
+        if (CtlMenu[i].active)\r
+        {\r
+         CtlItems.curpos=i;\r
+         break;\r
+        }\r
+\r
+ DrawMenuGun(&CtlItems);\r
+ VW_UpdateScreen();\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// CUSTOMIZE CONTROLS\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+enum {FIRE,STRAFE,RUN,OPEN};\r
+char mbarray[4][3]={"b0","b1","b2","b3"},\r
+          order[4]={RUN,OPEN,FIRE,STRAFE};\r
+\r
+\r
+void CustomControls(void)\r
+{\r
+ int which;\r
+\r
+\r
+ DrawCustomScreen();\r
+ do\r
+ {\r
+  which=HandleMenu(&CusItems,&CusMenu[0],FixupCustom);\r
+  switch(which)\r
+  {\r
+   case 0:\r
+        DefineMouseBtns();\r
+        DrawCustMouse(1);\r
+        break;\r
+   case 3:\r
+        DefineJoyBtns();\r
+        DrawCustJoy(0);\r
+        break;\r
+   case 6:\r
+        DefineKeyBtns();\r
+        DrawCustKeybd(0);\r
+        break;\r
+   case 8:\r
+        DefineKeyMove();\r
+        DrawCustKeys(0);\r
+  }\r
+ } while(which>=0);\r
+\r
+\r
+\r
+ MenuFadeOut();\r
+}\r
+\r
+\r
+////////////////////////\r
+//\r
+// DEFINE THE MOUSE BUTTONS\r
+//\r
+void DefineMouseBtns(void)\r
+{\r
+ CustomCtrls mouseallowed={0,1,1,1};\r
+ EnterCtrlData(2,&mouseallowed,DrawCustMouse,PrintCustMouse,MOUSE);\r
+}\r
+\r
+\r
+////////////////////////\r
+//\r
+// DEFINE THE JOYSTICK BUTTONS\r
+//\r
+void DefineJoyBtns(void)\r
+{\r
+ CustomCtrls joyallowed={1,1,1,1};\r
+ EnterCtrlData(5,&joyallowed,DrawCustJoy,PrintCustJoy,JOYSTICK);\r
+}\r
+\r
+\r
+////////////////////////\r
+//\r
+// DEFINE THE KEYBOARD BUTTONS\r
+//\r
+void DefineKeyBtns(void)\r
+{\r
+ CustomCtrls keyallowed={1,1,1,1};\r
+ EnterCtrlData(8,&keyallowed,DrawCustKeybd,PrintCustKeybd,KEYBOARDBTNS);\r
+}\r
+\r
+\r
+////////////////////////\r
+//\r
+// DEFINE THE KEYBOARD BUTTONS\r
+//\r
+void DefineKeyMove(void)\r
+{\r
+       CustomCtrls keyallowed={1,1,1,1};\r
+       EnterCtrlData(10,&keyallowed,DrawCustKeys,PrintCustKeys,KEYBOARDMOVE);\r
+}\r
+\r
+\r
+////////////////////////\r
+//\r
+// ENTER CONTROL DATA FOR ANY TYPE OF CONTROL\r
+//\r
+enum {FWRD,RIGHT,BKWD,LEFT};\r
+int moveorder[4]={LEFT,RIGHT,FWRD,BKWD};\r
+\r
+void EnterCtrlData(int index,CustomCtrls *cust,void (*DrawRtn)(int),void (*PrintRtn)(int),int type)\r
+{\r
+ int j,exit,tick,redraw,which,x,picked;\r
+ ControlInfo ci;\r
+\r
+\r
+ ShootSnd();\r
+ PrintY=CST_Y+13*index;\r
+ IN_ClearKeysDown();\r
+ exit=0;\r
+ redraw=1;\r
+ //\r
+ // FIND FIRST SPOT IN ALLOWED ARRAY\r
+ //\r
+ for (j=0;j<4;j++)\r
+   if (cust->allowed[j])\r
+   {\r
+       which=j;\r
+       break;\r
+   }\r
+\r
+ do\r
+ {\r
+  if (redraw)\r
+  {\r
+   x=CST_START+CST_SPC*which;\r
+   DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);\r
+\r
+   DrawRtn(1);\r
+   DrawWindow(x-2,PrintY,CST_SPC,11,TEXTCOLOR);\r
+   DrawOutline(x-2,PrintY,CST_SPC,11,0,HIGHLIGHT);\r
+   SETFONTCOLOR(0,TEXTCOLOR);\r
+   PrintRtn(which);\r
+   PrintX=x;\r
+   SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
+   VW_UpdateScreen();\r
+   WaitKeyUp();\r
+   redraw=0;\r
+  }\r
+\r
+  ReadAnyControl(&ci);\r
+\r
+  if (type==MOUSE || type==JOYSTICK)\r
+       if (IN_KeyDown(sc_Enter)||IN_KeyDown(sc_Control)||IN_KeyDown(sc_Alt))\r
+       {\r
+        IN_ClearKeysDown();\r
+        ci.button0=ci.button1=false;\r
+       }\r
+\r
+  //\r
+  // CHANGE BUTTON VALUE?\r
+  //\r
+  if ((ci.button0|ci.button1|ci.button2|ci.button3)||\r
+         ((type==KEYBOARDBTNS||type==KEYBOARDMOVE) && LastScan==sc_Enter))\r
+  {\r
+   tick=TimeCount=picked=0;\r
+   SETFONTCOLOR(0,TEXTCOLOR);\r
+\r
+   do\r
+   {\r
+       int button,result=0;\r
+\r
+\r
+       if (type==KEYBOARDBTNS||type==KEYBOARDMOVE)\r
+         IN_ClearKeysDown();\r
+\r
+       //\r
+       // FLASH CURSOR\r
+       //\r
+       if (TimeCount>10)\r
+       {\r
+        switch(tick)\r
+        {\r
+         case 0:\r
+       VWB_Bar(x,PrintY+1,CST_SPC-2,10,TEXTCOLOR);\r
+       break;\r
+         case 1:\r
+       PrintX=x;\r
+       US_Print("?");\r
+       SD_PlaySound(HITWALLSND);\r
+        }\r
+        tick^=1;\r
+        TimeCount=0;\r
+        VW_UpdateScreen();\r
+       }\r
+\r
+       //\r
+       // WHICH TYPE OF INPUT DO WE PROCESS?\r
+       //\r
+       switch(type)\r
+       {\r
+        case MOUSE:\r
+          Mouse(3);\r
+          button=_BX;\r
+          switch(button)\r
+          {\r
+       case 1: result=1; break;\r
+       case 2: result=2; break;\r
+       case 4: result=3; break;\r
+          }\r
+\r
+          if (result)\r
+          {\r
+       int z;\r
+\r
+\r
+       for (z=0;z<4;z++)\r
+         if (order[which]==buttonmouse[z])\r
+         {\r
+          buttonmouse[z]=bt_nobutton;\r
+          break;\r
+         }\r
+\r
+       buttonmouse[result-1]=order[which];\r
+       picked=1;\r
+       SD_PlaySound(SHOOTDOORSND);\r
+          }\r
+          break;\r
+\r
+        case JOYSTICK:\r
+          if (ci.button0) result=1;\r
+          else\r
+          if (ci.button1) result=2;\r
+          else\r
+          if (ci.button2) result=3;\r
+          else\r
+          if (ci.button3) result=4;\r
+\r
+          if (result)\r
+          {\r
+       int z;\r
+\r
+\r
+       for (z=0;z<4;z++)\r
+         if (order[which]==buttonjoy[z])\r
+         {\r
+          buttonjoy[z]=bt_nobutton;\r
+          break;\r
+         }\r
+\r
+       buttonjoy[result-1]=order[which];\r
+       picked=1;\r
+       SD_PlaySound(SHOOTDOORSND);\r
+          }\r
+          break;\r
+\r
+        case KEYBOARDBTNS:\r
+          if (LastScan)\r
+          {\r
+       buttonscan[order[which]]=LastScan;\r
+       picked=1;\r
+       ShootSnd();\r
+       IN_ClearKeysDown();\r
+          }\r
+          break;\r
+\r
+        case KEYBOARDMOVE:\r
+          if (LastScan)\r
+          {\r
+       dirscan[moveorder[which]]=LastScan;\r
+       picked=1;\r
+       ShootSnd();\r
+       IN_ClearKeysDown();\r
+          }\r
+          break;\r
+       }\r
+\r
+       //\r
+       // EXIT INPUT?\r
+       //\r
+       if (IN_KeyDown(sc_Escape))\r
+       {\r
+        picked=1;\r
+        continue;\r
+       }\r
+\r
+   } while(!picked);\r
+\r
+   SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
+   redraw=1;\r
+   WaitKeyUp();\r
+   continue;\r
+  }\r
+\r
+  if (ci.button1 || IN_KeyDown(sc_Escape))\r
+       exit=1;\r
+\r
+  //\r
+  // MOVE TO ANOTHER SPOT?\r
+  //\r
+  switch(ci.dir)\r
+  {\r
+   case dir_West:\r
+        do\r
+        {\r
+         which--;\r
+         if (which<0)\r
+       which=3;\r
+        } while(!cust->allowed[which]);\r
+        redraw=1;\r
+        SD_PlaySound(MOVEGUN1SND);\r
+        while(ReadAnyControl(&ci),ci.dir!=dir_None);\r
+        IN_ClearKeysDown();\r
+        break;\r
+\r
+   case dir_East:\r
+        do\r
+        {\r
+         which++;\r
+         if (which>3)\r
+       which=0;\r
+        } while(!cust->allowed[which]);\r
+        redraw=1;\r
+        SD_PlaySound(MOVEGUN1SND);\r
+        while(ReadAnyControl(&ci),ci.dir!=dir_None);\r
+        IN_ClearKeysDown();\r
+        break;\r
+   case dir_North:\r
+   case dir_South:\r
+        exit=1;\r
+  }\r
+ } while(!exit);\r
+\r
+ SD_PlaySound(ESCPRESSEDSND);\r
+ WaitKeyUp();\r
+ DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);\r
+}\r
+\r
+\r
+////////////////////////\r
+//\r
+// FIXUP GUN CURSOR OVERDRAW SHIT\r
+//\r
+void FixupCustom(int w)\r
+{\r
+       static int lastwhich=-1;\r
+       int y=CST_Y+26+w*13;\r
+\r
+\r
+       VWB_Hlin(7,32,y-1,DEACTIVE);\r
+       VWB_Hlin(7,32,y+12,BORD2COLOR);\r
+#ifndef SPEAR\r
+       VWB_Hlin(7,32,y-2,BORDCOLOR);\r
+       VWB_Hlin(7,32,y+13,BORDCOLOR);\r
+#else\r
+       VWB_Hlin(7,32,y-2,BORD2COLOR);\r
+       VWB_Hlin(7,32,y+13,BORD2COLOR);\r
+#endif\r
+\r
+       switch(w)\r
+       {\r
+               case 0: DrawCustMouse(1); break;\r
+               case 3: DrawCustJoy(1); break;\r
+               case 6: DrawCustKeybd(1); break;\r
+               case 8: DrawCustKeys(1);\r
+       }\r
+\r
+\r
+       if (lastwhich>=0)\r
+       {\r
+               y=CST_Y+26+lastwhich*13;\r
+               VWB_Hlin(7,32,y-1,DEACTIVE);\r
+               VWB_Hlin(7,32,y+12,BORD2COLOR);\r
+#ifndef SPEAR\r
+               VWB_Hlin(7,32,y-2,BORDCOLOR);\r
+               VWB_Hlin(7,32,y+13,BORDCOLOR);\r
+#else\r
+               VWB_Hlin(7,32,y-2,BORD2COLOR);\r
+               VWB_Hlin(7,32,y+13,BORD2COLOR);\r
+#endif\r
+\r
+               if (lastwhich!=w)\r
+                       switch(lastwhich)\r
+                       {\r
+                               case 0: DrawCustMouse(0); break;\r
+                               case 3: DrawCustJoy(0); break;\r
+                               case 6: DrawCustKeybd(0); break;\r
+                               case 8: DrawCustKeys(0);\r
+                       }\r
+       }\r
+\r
+       lastwhich=w;\r
+}\r
+\r
+\r
+////////////////////////\r
+//\r
+// DRAW CUSTOMIZE SCREEN\r
+//\r
+void DrawCustomScreen(void)\r
+{\r
+       int i;\r
+\r
+\r
+#ifdef JAPAN\r
+       CA_CacheScreen(S_CUSTOMPIC);\r
+       fontnumber=1;\r
+\r
+       PrintX=CST_START;\r
+       PrintY = CST_Y+26;\r
+       DrawCustMouse(0);\r
+\r
+       PrintX=CST_START;\r
+       US_Print("\n\n\n");\r
+       DrawCustJoy(0);\r
+\r
+       PrintX=CST_START;\r
+       US_Print("\n\n\n");\r
+       DrawCustKeybd(0);\r
+\r
+       PrintX=CST_START;\r
+       US_Print("\n\n\n");\r
+       DrawCustKeys(0);\r
+#else\r
+       ClearMScreen();\r
+       WindowX=0;\r
+       WindowW=320;\r
+       VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
+       DrawStripes(10);\r
+       VWB_DrawPic(80,0,C_CUSTOMIZEPIC);\r
+\r
+       //\r
+       // MOUSE\r
+       //\r
+       SETFONTCOLOR(READCOLOR,BKGDCOLOR);\r
+       WindowX=0;\r
+       WindowW=320;\r
+\r
+#ifndef SPEAR\r
+       PrintY=CST_Y;\r
+       US_CPrint("Mouse\n");\r
+#else\r
+       PrintY = CST_Y+13;\r
+       VWB_DrawPic (128,48,C_MOUSEPIC);\r
+#endif\r
+\r
+       SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
+       #ifdef SPANISH\r
+       PrintX=CST_START-16;\r
+       US_Print(STR_CRUN);\r
+       PrintX=CST_START-16+CST_SPC*1;\r
+       US_Print(STR_COPEN);\r
+       PrintX=CST_START-16+CST_SPC*2;\r
+       US_Print(STR_CFIRE);\r
+       PrintX=CST_START-16+CST_SPC*3;\r
+       US_Print(STR_CSTRAFE"\n");\r
+       #else\r
+       PrintX=CST_START;\r
+       US_Print(STR_CRUN);\r
+       PrintX=CST_START+CST_SPC*1;\r
+       US_Print(STR_COPEN);\r
+       PrintX=CST_START+CST_SPC*2;\r
+       US_Print(STR_CFIRE);\r
+       PrintX=CST_START+CST_SPC*3;\r
+       US_Print(STR_CSTRAFE"\n");\r
+       #endif\r
+\r
+       DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);\r
+       DrawCustMouse(0);\r
+       US_Print("\n");\r
+\r
+\r
+       //\r
+       // JOYSTICK/PAD\r
+       //\r
+#ifndef SPEAR\r
+       SETFONTCOLOR(READCOLOR,BKGDCOLOR);\r
+       US_CPrint("Joystick/Gravis GamePad\n");\r
+#else\r
+       PrintY += 13;\r
+       VWB_DrawPic (40,88,C_JOYSTICKPIC);\r
+#endif\r
+\r
+#ifdef SPEAR\r
+       VWB_DrawPic (112,120,C_KEYBOARDPIC);\r
+#endif\r
+\r
+       SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
+       #ifdef SPANISH\r
+       PrintX=CST_START-16;\r
+       US_Print(STR_CRUN);\r
+       PrintX=CST_START-16+CST_SPC*1;\r
+       US_Print(STR_COPEN);\r
+       PrintX=CST_START-16+CST_SPC*2;\r
+       US_Print(STR_CFIRE);\r
+       PrintX=CST_START-16+CST_SPC*3;\r
+       US_Print(STR_CSTRAFE"\n");\r
+       #else\r
+       PrintX=CST_START;\r
+       US_Print(STR_CRUN);\r
+       PrintX=CST_START+CST_SPC*1;\r
+       US_Print(STR_COPEN);\r
+       PrintX=CST_START+CST_SPC*2;\r
+       US_Print(STR_CFIRE);\r
+       PrintX=CST_START+CST_SPC*3;\r
+       US_Print(STR_CSTRAFE"\n");\r
+       #endif\r
+       DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);\r
+       DrawCustJoy(0);\r
+       US_Print("\n");\r
+\r
+\r
+       //\r
+       // KEYBOARD\r
+       //\r
+#ifndef SPEAR\r
+       SETFONTCOLOR(READCOLOR,BKGDCOLOR);\r
+       US_CPrint("Keyboard\n");\r
+#else\r
+       PrintY += 13;\r
+#endif\r
+       SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
+       #ifdef SPANISH\r
+       PrintX=CST_START-16;\r
+       US_Print(STR_CRUN);\r
+       PrintX=CST_START-16+CST_SPC*1;\r
+       US_Print(STR_COPEN);\r
+       PrintX=CST_START-16+CST_SPC*2;\r
+       US_Print(STR_CFIRE);\r
+       PrintX=CST_START-16+CST_SPC*3;\r
+       US_Print(STR_CSTRAFE"\n");\r
+       #else\r
+       PrintX=CST_START;\r
+       US_Print(STR_CRUN);\r
+       PrintX=CST_START+CST_SPC*1;\r
+       US_Print(STR_COPEN);\r
+       PrintX=CST_START+CST_SPC*2;\r
+       US_Print(STR_CFIRE);\r
+       PrintX=CST_START+CST_SPC*3;\r
+       US_Print(STR_CSTRAFE"\n");\r
+       #endif\r
+       DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);\r
+       DrawCustKeybd(0);\r
+       US_Print("\n");\r
+\r
+\r
+       //\r
+       // KEYBOARD MOVE KEYS\r
+       //\r
+       SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
+       #ifdef SPANISH\r
+       PrintX=4;\r
+       US_Print(STR_LEFT);\r
+       US_Print("/");\r
+       US_Print(STR_RIGHT);\r
+       US_Print("/");\r
+       US_Print(STR_FRWD);\r
+       US_Print("/");\r
+       US_Print(STR_BKWD"\n");\r
+       #else\r
+       PrintX=CST_START;\r
+       US_Print(STR_LEFT);\r
+       PrintX=CST_START+CST_SPC*1;\r
+       US_Print(STR_RIGHT);\r
+       PrintX=CST_START+CST_SPC*2;\r
+       US_Print(STR_FRWD);\r
+       PrintX=CST_START+CST_SPC*3;\r
+       US_Print(STR_BKWD"\n");\r
+       #endif\r
+       DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);\r
+       DrawCustKeys(0);\r
+#endif\r
+       //\r
+       // PICK STARTING POINT IN MENU\r
+       //\r
+       if (CusItems.curpos<0)\r
+               for (i=0;i<CusItems.amount;i++)\r
+                       if (CusMenu[i].active)\r
+                       {\r
+                               CusItems.curpos=i;\r
+                               break;\r
+                       }\r
+\r
+\r
+       VW_UpdateScreen();\r
+       MenuFadeIn();\r
+}\r
+\r
+\r
+void PrintCustMouse(int i)\r
+{\r
+       int j;\r
+\r
+       for (j=0;j<4;j++)\r
+               if (order[i]==buttonmouse[j])\r
+               {\r
+                       PrintX=CST_START+CST_SPC*i;\r
+                       US_Print(mbarray[j]);\r
+                       break;\r
+               }\r
+}\r
+\r
+void DrawCustMouse(int hilight)\r
+{\r
+       int i,color;\r
+\r
+\r
+       color=TEXTCOLOR;\r
+       if (hilight)\r
+               color=HIGHLIGHT;\r
+       SETFONTCOLOR(color,BKGDCOLOR);\r
+\r
+       if (!mouseenabled)\r
+       {\r
+               SETFONTCOLOR(DEACTIVE,BKGDCOLOR);\r
+               CusMenu[0].active=0;\r
+       }\r
+       else\r
+               CusMenu[0].active=1;\r
+\r
+       PrintY=CST_Y+13*2;\r
+       for (i=0;i<4;i++)\r
+               PrintCustMouse(i);\r
+}\r
+\r
+void PrintCustJoy(int i)\r
+{\r
+       int j;\r
+\r
+       for (j=0;j<4;j++)\r
+               if (order[i]==buttonjoy[j])\r
+               {\r
+                       PrintX=CST_START+CST_SPC*i;\r
+                       US_Print(mbarray[j]);\r
+                       break;\r
+               }\r
+}\r
+\r
+void DrawCustJoy(int hilight)\r
+{\r
+       int i,color;\r
+\r
+\r
+       color=TEXTCOLOR;\r
+       if (hilight)\r
+               color=HIGHLIGHT;\r
+       SETFONTCOLOR(color,BKGDCOLOR);\r
+\r
+       if (!joystickenabled)\r
+       {\r
+               SETFONTCOLOR(DEACTIVE,BKGDCOLOR);\r
+               CusMenu[3].active=0;\r
+       }\r
+       else\r
+               CusMenu[3].active=1;\r
+\r
+       PrintY=CST_Y+13*5;\r
+       for (i=0;i<4;i++)\r
+               PrintCustJoy(i);\r
+}\r
+\r
+\r
+void PrintCustKeybd(int i)\r
+{\r
+       PrintX=CST_START+CST_SPC*i;\r
+       US_Print(IN_GetScanName(buttonscan[order[i]]));\r
+}\r
+\r
+void DrawCustKeybd(int hilight)\r
+{\r
+       int i,color;\r
+\r
+\r
+       color=TEXTCOLOR;\r
+       if (hilight)\r
+               color=HIGHLIGHT;\r
+       SETFONTCOLOR(color,BKGDCOLOR);\r
+\r
+       PrintY=CST_Y+13*8;\r
+       for (i=0;i<4;i++)\r
+               PrintCustKeybd(i);\r
+}\r
+\r
+void PrintCustKeys(int i)\r
+{\r
+       PrintX=CST_START+CST_SPC*i;\r
+       US_Print(IN_GetScanName(dirscan[moveorder[i]]));\r
+}\r
+\r
+void DrawCustKeys(int hilight)\r
+{\r
+       int i,color;\r
+\r
+\r
+       color=TEXTCOLOR;\r
+       if (hilight)\r
+               color=HIGHLIGHT;\r
+       SETFONTCOLOR(color,BKGDCOLOR);\r
+\r
+       PrintY=CST_Y+13*10;\r
+       for (i=0;i<4;i++)\r
+               PrintCustKeys(i);\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// CHANGE SCREEN VIEWING SIZE\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void CP_ChangeView(void)\r
+{\r
+       int exit=0,oldview,newview;\r
+       ControlInfo ci;\r
+\r
+\r
+       WindowX=WindowY=0;\r
+       WindowW=320;\r
+       WindowH=200;\r
+       newview=oldview=viewwidth/16;\r
+       DrawChangeView(oldview);\r
+\r
+       do\r
+       {\r
+               CheckPause();\r
+               ReadAnyControl(&ci);\r
+               switch(ci.dir)\r
+               {\r
+               case dir_South:\r
+               case dir_West:\r
+                       newview--;\r
+                       if (newview<4)\r
+                               newview=4;\r
+                       ShowViewSize(newview);\r
+                       VW_UpdateScreen();\r
+                       SD_PlaySound(HITWALLSND);\r
+                       TicDelay(10);\r
+                       break;\r
+\r
+               case dir_North:\r
+               case dir_East:\r
+                       newview++;\r
+                       if (newview>19)\r
+                               newview=19;\r
+                       ShowViewSize(newview);\r
+                       VW_UpdateScreen();\r
+                       SD_PlaySound(HITWALLSND);\r
+                       TicDelay(10);\r
+                       break;\r
+               }\r
+\r
+               #ifndef SPEAR\r
+               if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
+               #else\r
+               if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("debugmode"))\r
+               #endif\r
+                       PicturePause();\r
+\r
+               if (ci.button0 || Keyboard[sc_Enter])\r
+                       exit=1;\r
+               else\r
+               if (ci.button1 || Keyboard[sc_Escape])\r
+               {\r
+                       viewwidth=oldview*16;\r
+                       SD_PlaySound(ESCPRESSEDSND);\r
+                       MenuFadeOut();\r
+                       return;\r
+               }\r
+\r
+       } while(!exit);\r
+\r
+\r
+       if (oldview!=newview)\r
+       {\r
+               SD_PlaySound (SHOOTSND);\r
+               Message(STR_THINK"...");\r
+               NewViewSize(newview);\r
+       }\r
+\r
+       ShootSnd();\r
+       MenuFadeOut();\r
+}\r
+\r
+\r
+/////////////////////////////\r
+//\r
+// DRAW THE CHANGEVIEW SCREEN\r
+//\r
+void DrawChangeView(int view)\r
+{\r
+#ifdef JAPAN\r
+       CA_CacheScreen(S_CHANGEPIC);\r
+\r
+       ShowViewSize(view);\r
+#else\r
+       VWB_Bar(0,160,320,40,VIEWCOLOR);\r
+       ShowViewSize(view);\r
+\r
+       PrintY=161;\r
+       WindowX=0;\r
+       WindowY=320;\r
+       SETFONTCOLOR(HIGHLIGHT,BKGDCOLOR);\r
+\r
+       US_CPrint(STR_SIZE1"\n");\r
+       US_CPrint(STR_SIZE2"\n");\r
+       US_CPrint(STR_SIZE3);\r
+#endif\r
+       VW_UpdateScreen();\r
+\r
+       MenuFadeIn();\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// QUIT THIS INFERNAL GAME!\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void CP_Quit(void)\r
+{\r
+       int i;\r
+\r
+\r
+       #ifdef JAPAN\r
+       if (GetYorN(7,11,C_QUITMSGPIC))\r
+       #else\r
+\r
+       #ifdef SPANISH\r
+       if (Confirm(ENDGAMESTR))\r
+       #else\r
+       if (Confirm(endStrings[US_RndT()&0x7+(US_RndT()&1)]))\r
+       #endif\r
+\r
+       #endif\r
+       {\r
+               VW_UpdateScreen();\r
+               SD_MusicOff();\r
+               SD_StopSound();\r
+               MenuFadeOut();\r
+               //\r
+               // SHUT-UP THE ADLIB\r
+               //\r
+               for (i=1;i<=0xf5;i++)\r
+                       alOut(i,0);\r
+               Quit(NULL);\r
+       }\r
+\r
+       DrawMainMenu();\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// HANDLE INTRO SCREEN (SYSTEM CONFIG)\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void IntroScreen(void)\r
+{\r
+#ifdef SPEAR\r
+\r
+#define MAINCOLOR      0x4f\r
+#define EMSCOLOR       0x4f\r
+#define XMSCOLOR       0x4f\r
+\r
+#else\r
+\r
+#define MAINCOLOR      0x6c\r
+#define EMSCOLOR       0x6c\r
+#define XMSCOLOR       0x6c\r
+\r
+#endif\r
+#define FILLCOLOR      14\r
+\r
+       long memory,emshere,xmshere;\r
+       int i,num,ems[10]={100,200,300,400,500,600,700,800,900,1000},\r
+               xms[10]={100,200,300,400,500,600,700,800,900,1000},\r
+               main[10]={32,64,96,128,160,192,224,256,288,320};\r
+\r
+\r
+       //\r
+       // DRAW MAIN MEMORY\r
+       //\r
+       memory=(1023l+mminfo.nearheap+mminfo.farheap)/1024l;\r
+       for (i=0;i<10;i++)\r
+               if (memory>=main[i])\r
+                       VWB_Bar(49,163-8*i,6,5,MAINCOLOR-i);\r
+\r
+\r
+       //\r
+       // DRAW EMS MEMORY\r
+       //\r
+       if (EMSPresent)\r
+       {\r
+               emshere=4l*EMSPagesAvail;\r
+               for (i=0;i<10;i++)\r
+                       if (emshere>=ems[i])\r
+                               VWB_Bar(89,163-8*i,6,5,EMSCOLOR-i);\r
+       }\r
+\r
+       //\r
+       // DRAW XMS MEMORY\r
+       //\r
+       if (XMSPresent)\r
+       {\r
+               xmshere=4l*XMSPagesAvail;\r
+               for (i=0;i<10;i++)\r
+                       if (xmshere>=xms[i])\r
+                               VWB_Bar(129,163-8*i,6,5,XMSCOLOR-i);\r
+       }\r
+\r
+       //\r
+       // FILL BOXES\r
+       //\r
+       if (MousePresent)\r
+               VWB_Bar(164,82,12,2,FILLCOLOR);\r
+\r
+       if (JoysPresent[0] || JoysPresent[1])\r
+               VWB_Bar(164,105,12,2,FILLCOLOR);\r
+\r
+       if (AdLibPresent && !SoundBlasterPresent)\r
+               VWB_Bar(164,128,12,2,FILLCOLOR);\r
+\r
+       if (SoundBlasterPresent)\r
+               VWB_Bar(164,151,12,2,FILLCOLOR);\r
+\r
+       if (SoundSourcePresent)\r
+               VWB_Bar(164,174,12,2,FILLCOLOR);\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// SUPPORT ROUTINES\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+////////////////////////////////////////////////////////////////////\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// Clear Menu screens to dark red\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void ClearMScreen(void)\r
+{\r
+#ifndef SPEAR\r
+       VWB_Bar(0,0,320,200,BORDCOLOR);\r
+#else\r
+       VWB_DrawPic(0,0,C_BACKDROPPIC);\r
+#endif\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// Un/Cache a LUMP of graphics\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void CacheLump(int lumpstart,int lumpend)\r
+{\r
+ int i;\r
+\r
+ for (i=lumpstart;i<=lumpend;i++)\r
+   CA_CacheGrChunk(i);\r
+}\r
+\r
+\r
+void UnCacheLump(int lumpstart,int lumpend)\r
+{\r
+ int i;\r
+\r
+ for (i=lumpstart;i<=lumpend;i++)\r
+       if (grsegs[i])\r
+               UNCACHEGRCHUNK(i);\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// Draw a window for a menu\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void DrawWindow(int x,int y,int w,int h,int wcolor)\r
+{\r
+       VWB_Bar(x,y,w,h,wcolor);\r
+       DrawOutline(x,y,w,h,BORD2COLOR,DEACTIVE);\r
+}\r
+\r
+\r
+void DrawOutline(int x,int y,int w,int h,int color1,int color2)\r
+{\r
+       VWB_Hlin(x,x+w,y,color2);\r
+       VWB_Vlin(y,y+h,x,color2);\r
+       VWB_Hlin(x,x+w,y+h,color1);\r
+       VWB_Vlin(y,y+h,x+w,color1);\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// Setup Control Panel stuff - graphics, etc.\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void SetupControlPanel(void)\r
+{\r
+       struct ffblk f;\r
+       char name[13];\r
+       int which,i;\r
+\r
+\r
+       //\r
+       // CACHE GRAPHICS & SOUNDS\r
+       //\r
+       CA_CacheGrChunk(STARTFONT+1);\r
+#ifndef SPEAR\r
+       CacheLump(CONTROLS_LUMP_START,CONTROLS_LUMP_END);\r
+#else\r
+       CacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
+#endif\r
+\r
+       SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
+       fontnumber=1;\r
+       WindowH=200;\r
+\r
+       if (!ingame)\r
+               CA_LoadAllSounds();\r
+       else\r
+               MainMenu[savegame].active=1;\r
+\r
+       //\r
+       // SEE WHICH SAVE GAME FILES ARE AVAILABLE & READ STRING IN\r
+       //\r
+       strcpy(name,SaveName);\r
+       if (!findfirst(name,&f,0))\r
+               do\r
+               {\r
+                       which=f.ff_name[7]-'0';\r
+                       if (which<10)\r
+                       {\r
+                               int handle;\r
+                               char temp[32];\r
+\r
+                               SaveGamesAvail[which]=1;\r
+                               handle=open(f.ff_name,O_BINARY);\r
+                               read(handle,temp,32);\r
+                               close(handle);\r
+                               strcpy(&SaveGameNames[which][0],temp);\r
+                       }\r
+               } while(!findnext(&f));\r
+\r
+       //\r
+       // CENTER MOUSE\r
+       //\r
+       _CX=_DX=CENTER;\r
+       Mouse(4);\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// Clean up all the Control Panel stuff\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void CleanupControlPanel(void)\r
+{\r
+#ifndef SPEAR\r
+       UnCacheLump(CONTROLS_LUMP_START,CONTROLS_LUMP_END);\r
+#else\r
+       UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
+#endif\r
+\r
+       fontnumber = 0;\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// Handle moving gun around a menu\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+int HandleMenu(CP_iteminfo *item_i,CP_itemtype far *items,void (*routine)(int w))\r
+{\r
+       char key;\r
+       static int redrawitem=1,lastitem=-1;\r
+       int i,x,y,basey,exit,which,shape,timer;\r
+       ControlInfo ci;\r
+\r
+\r
+       which=item_i->curpos;\r
+       x=item_i->x&-8;\r
+       basey=item_i->y-2;\r
+       y=basey+which*13;\r
+\r
+       VWB_DrawPic(x,y,C_CURSOR1PIC);\r
+       SetTextColor(items+which,1);\r
+       if (redrawitem)\r
+       {\r
+               PrintX=item_i->x+item_i->indent;\r
+               PrintY=item_i->y+which*13;\r
+               US_Print((items+which)->string);\r
+       }\r
+       //\r
+       // CALL CUSTOM ROUTINE IF IT IS NEEDED\r
+       //\r
+       if (routine)\r
+               routine(which);\r
+       VW_UpdateScreen();\r
+\r
+       shape=C_CURSOR1PIC;\r
+       timer=8;\r
+       exit=0;\r
+       TimeCount=0;\r
+       IN_ClearKeysDown();\r
+\r
+\r
+       do\r
+       {\r
+               //\r
+               // CHANGE GUN SHAPE\r
+               //\r
+               if (TimeCount>timer)\r
+               {\r
+                       TimeCount=0;\r
+                       if (shape==C_CURSOR1PIC)\r
+                       {\r
+                               shape=C_CURSOR2PIC;\r
+                               timer=8;\r
+                       }\r
+                       else\r
+                       {\r
+                               shape=C_CURSOR1PIC;\r
+                               timer=70;\r
+                       }\r
+                       VWB_DrawPic(x,y,shape);\r
+                       if (routine)\r
+                               routine(which);\r
+                       VW_UpdateScreen();\r
+               }\r
+\r
+               CheckPause();\r
+\r
+               //\r
+               // SEE IF ANY KEYS ARE PRESSED FOR INITIAL CHAR FINDING\r
+               //\r
+               key=LastASCII;\r
+               if (key)\r
+               {\r
+                       int ok=0;\r
+\r
+                       //\r
+                       // CHECK FOR SCREEN CAPTURE\r
+                       //\r
+                       #ifndef SPEAR\r
+                       if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
+                       #else\r
+                       if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("debugmode"))\r
+                       #endif\r
+                               PicturePause();\r
+\r
+\r
+                       if (key>='a')\r
+                               key-='a'-'A';\r
+\r
+                       for (i=which+1;i<item_i->amount;i++)\r
+                               if ((items+i)->active && (items+i)->string[0]==key)\r
+                               {\r
+                                       EraseGun(item_i,items,x,y,which);\r
+                                       which=i;\r
+                                       DrawGun(item_i,items,x,&y,which,basey,routine);\r
+                                       ok=1;\r
+                                       IN_ClearKeysDown();\r
+                                       break;\r
+                               }\r
+\r
+                       //\r
+                       // DIDN'T FIND A MATCH FIRST TIME THRU. CHECK AGAIN.\r
+                       //\r
+                       if (!ok)\r
+                       {\r
+                               for (i=0;i<which;i++)\r
+                                       if ((items+i)->active && (items+i)->string[0]==key)\r
+                                       {\r
+                                               EraseGun(item_i,items,x,y,which);\r
+                                               which=i;\r
+                                               DrawGun(item_i,items,x,&y,which,basey,routine);\r
+                                               IN_ClearKeysDown();\r
+                                               break;\r
+                                       }\r
+                       }\r
+               }\r
+\r
+               //\r
+               // GET INPUT\r
+               //\r
+               ReadAnyControl(&ci);\r
+               switch(ci.dir)\r
+               {\r
+                       ////////////////////////////////////////////////\r
+                       //\r
+                       // MOVE UP\r
+                       //\r
+                       case dir_North:\r
+\r
+                       EraseGun(item_i,items,x,y,which);\r
+\r
+                       //\r
+                       // ANIMATE HALF-STEP\r
+                       //\r
+                       if (which && (items+which-1)->active)\r
+                       {\r
+                               y-=6;\r
+                               DrawHalfStep(x,y);\r
+                       }\r
+\r
+                       //\r
+                       // MOVE TO NEXT AVAILABLE SPOT\r
+                       //\r
+                       do\r
+                       {\r
+                               if (!which)\r
+                                       which=item_i->amount-1;\r
+                               else\r
+                                       which--;\r
+                       } while(!(items+which)->active);\r
+\r
+                       DrawGun(item_i,items,x,&y,which,basey,routine);\r
+                       //\r
+                       // WAIT FOR BUTTON-UP OR DELAY NEXT MOVE\r
+                       //\r
+                       TicDelay(20);\r
+                       break;\r
+\r
+                       ////////////////////////////////////////////////\r
+                       //\r
+                       // MOVE DOWN\r
+                       //\r
+                       case dir_South:\r
+\r
+                       EraseGun(item_i,items,x,y,which);\r
+                       //\r
+                       // ANIMATE HALF-STEP\r
+                       //\r
+                       if (which!=item_i->amount-1 && (items+which+1)->active)\r
+                       {\r
+                               y+=6;\r
+                               DrawHalfStep(x,y);\r
+                       }\r
+\r
+                       do\r
+                       {\r
+                               if (which==item_i->amount-1)\r
+                                       which=0;\r
+                               else\r
+                                       which++;\r
+                       } while(!(items+which)->active);\r
+\r
+                       DrawGun(item_i,items,x,&y,which,basey,routine);\r
+\r
+                       //\r
+                       // WAIT FOR BUTTON-UP OR DELAY NEXT MOVE\r
+                       //\r
+                       TicDelay(20);\r
+                       break;\r
+               }\r
+\r
+               if (ci.button0 ||\r
+                       Keyboard[sc_Space] ||\r
+                       Keyboard[sc_Enter])\r
+                               exit=1;\r
+\r
+               if (ci.button1 ||\r
+                       Keyboard[sc_Escape])\r
+                               exit=2;\r
+\r
+       } while(!exit);\r
+\r
+\r
+       IN_ClearKeysDown();\r
+\r
+       //\r
+       // ERASE EVERYTHING\r
+       //\r
+       if (lastitem!=which)\r
+       {\r
+               VWB_Bar(x-1,y,25,16,BKGDCOLOR);\r
+               PrintX=item_i->x+item_i->indent;\r
+               PrintY=item_i->y+which*13;\r
+               US_Print((items+which)->string);\r
+               redrawitem=1;\r
+       }\r
+       else\r
+               redrawitem=0;\r
+\r
+       if (routine)\r
+               routine(which);\r
+       VW_UpdateScreen();\r
+\r
+       item_i->curpos=which;\r
+\r
+       lastitem=which;\r
+       switch(exit)\r
+       {\r
+               case 1:\r
+                       //\r
+                       // CALL THE ROUTINE\r
+                       //\r
+                       if ((items+which)->routine!=NULL)\r
+                       {\r
+                               ShootSnd();\r
+                               MenuFadeOut();\r
+                               (items+which)->routine(0);\r
+                       }\r
+                       return which;\r
+\r
+               case 2:\r
+                       SD_PlaySound(ESCPRESSEDSND);\r
+                       return -1;\r
+       }\r
+\r
+       return 0; // JUST TO SHUT UP THE ERROR MESSAGES!\r
+}\r
+\r
+\r
+//\r
+// ERASE GUN & DE-HIGHLIGHT STRING\r
+//\r
+void EraseGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int y,int which)\r
+{\r
+       VWB_Bar(x-1,y,25,16,BKGDCOLOR);\r
+       SetTextColor(items+which,0);\r
+\r
+       PrintX=item_i->x+item_i->indent;\r
+       PrintY=item_i->y+which*13;\r
+       US_Print((items+which)->string);\r
+       VW_UpdateScreen();\r
+}\r
+\r
+\r
+//\r
+// DRAW HALF STEP OF GUN TO NEXT POSITION\r
+//\r
+void DrawHalfStep(int x,int y)\r
+{\r
+       VWB_DrawPic(x,y,C_CURSOR1PIC);\r
+       VW_UpdateScreen();\r
+       SD_PlaySound(MOVEGUN1SND);\r
+       TimeCount=0;\r
+       while(TimeCount<8);\r
+}\r
+\r
+\r
+//\r
+// DRAW GUN AT NEW POSITION\r
+//\r
+void DrawGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int *y,int which,int basey,void (*routine)(int w))\r
+{\r
+       VWB_Bar(x-1,*y,25,16,BKGDCOLOR);\r
+       *y=basey+which*13;\r
+       VWB_DrawPic(x,*y,C_CURSOR1PIC);\r
+       SetTextColor(items+which,1);\r
+\r
+       PrintX=item_i->x+item_i->indent;\r
+       PrintY=item_i->y+which*13;\r
+       US_Print((items+which)->string);\r
+\r
+       //\r
+       // CALL CUSTOM ROUTINE IF IT IS NEEDED\r
+       //\r
+       if (routine)\r
+               routine(which);\r
+       VW_UpdateScreen();\r
+       SD_PlaySound(MOVEGUN2SND);\r
+}\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// DELAY FOR AN AMOUNT OF TICS OR UNTIL CONTROLS ARE INACTIVE\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void TicDelay(int count)\r
+{\r
+       ControlInfo ci;\r
+\r
+\r
+       TimeCount=0;\r
+       do\r
+       {\r
+               ReadAnyControl(&ci);\r
+       } while(TimeCount<count && ci.dir!=dir_None);\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// Draw a menu\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void DrawMenu(CP_iteminfo *item_i,CP_itemtype far *items)\r
+{\r
+       int i,which=item_i->curpos;\r
+\r
+\r
+       WindowX=PrintX=item_i->x+item_i->indent;\r
+       WindowY=PrintY=item_i->y;\r
+       WindowW=320;\r
+       WindowH=200;\r
+\r
+       for (i=0;i<item_i->amount;i++)\r
+       {\r
+               SetTextColor(items+i,which==i);\r
+\r
+               PrintY=item_i->y+i*13;\r
+               if ((items+i)->active)\r
+                       US_Print((items+i)->string);\r
+               else\r
+               {\r
+                       SETFONTCOLOR(DEACTIVE,BKGDCOLOR);\r
+                       US_Print((items+i)->string);\r
+                       SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
+               }\r
+\r
+               US_Print("\n");\r
+       }\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// SET TEXT COLOR (HIGHLIGHT OR NO)\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void SetTextColor(CP_itemtype far *items,int hlight)\r
+{\r
+       if (hlight)\r
+               {SETFONTCOLOR(color_hlite[items->active],BKGDCOLOR);}\r
+       else\r
+               {SETFONTCOLOR(color_norml[items->active],BKGDCOLOR);}\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// WAIT FOR CTRLKEY-UP OR BUTTON-UP\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void WaitKeyUp(void)\r
+{\r
+       ControlInfo ci;\r
+       while(ReadAnyControl(&ci),      ci.button0|\r
+                                                               ci.button1|\r
+                                                               ci.button2|\r
+                                                               ci.button3|\r
+                                                               Keyboard[sc_Space]|\r
+                                                               Keyboard[sc_Enter]|\r
+                                                               Keyboard[sc_Escape]);\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// READ KEYBOARD, JOYSTICK AND MOUSE FOR INPUT\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void ReadAnyControl(ControlInfo *ci)\r
+{\r
+       int mouseactive=0;\r
+\r
+\r
+       IN_ReadControl(0,ci);\r
+\r
+       if (mouseenabled)\r
+       {\r
+               int mousey,mousex;\r
+\r
+\r
+               // READ MOUSE MOTION COUNTERS\r
+               // RETURN DIRECTION\r
+               // HOME MOUSE\r
+               // CHECK MOUSE BUTTONS\r
+\r
+               Mouse(3);\r
+               mousex=_CX;\r
+               mousey=_DX;\r
+\r
+               if (mousey<CENTER-SENSITIVE)\r
+               {\r
+                       ci->dir=dir_North;\r
+                       _CX=_DX=CENTER;\r
+                       Mouse(4);\r
+                       mouseactive=1;\r
+               }\r
+               else\r
+               if (mousey>CENTER+SENSITIVE)\r
+               {\r
+                       ci->dir=dir_South;\r
+                       _CX=_DX=CENTER;\r
+                       Mouse(4);\r
+                       mouseactive=1;\r
+               }\r
+\r
+               if (mousex<CENTER-SENSITIVE)\r
+               {\r
+                       ci->dir=dir_West;\r
+                       _CX=_DX=CENTER;\r
+                       Mouse(4);\r
+                       mouseactive=1;\r
+               }\r
+               else\r
+               if (mousex>CENTER+SENSITIVE)\r
+               {\r
+                       ci->dir=dir_East;\r
+                       _CX=_DX=CENTER;\r
+                       Mouse(4);\r
+                       mouseactive=1;\r
+               }\r
+\r
+               if (IN_MouseButtons())\r
+               {\r
+                       ci->button0=IN_MouseButtons()&1;\r
+                       ci->button1=IN_MouseButtons()&2;\r
+                       ci->button2=IN_MouseButtons()&4;\r
+                       ci->button3=false;\r
+                       mouseactive=1;\r
+               }\r
+       }\r
+\r
+       if (joystickenabled && !mouseactive)\r
+       {\r
+               int jx,jy,jb;\r
+\r
+\r
+               INL_GetJoyDelta(joystickport,&jx,&jy);\r
+               if (jy<-SENSITIVE)\r
+                       ci->dir=dir_North;\r
+               else\r
+               if (jy>SENSITIVE)\r
+                       ci->dir=dir_South;\r
+\r
+               if (jx<-SENSITIVE)\r
+                       ci->dir=dir_West;\r
+               else\r
+               if (jx>SENSITIVE)\r
+                       ci->dir=dir_East;\r
+\r
+               jb=IN_JoyButtons();\r
+               if (jb)\r
+               {\r
+                       ci->button0=jb&1;\r
+                       ci->button1=jb&2;\r
+                       if (joypadenabled)\r
+                       {\r
+                               ci->button2=jb&4;\r
+                               ci->button3=jb&8;\r
+                       }\r
+                       else\r
+                               ci->button2=ci->button3=false;\r
+               }\r
+       }\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// DRAW DIALOG AND CONFIRM YES OR NO TO QUESTION\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+int Confirm(char far *string)\r
+{\r
+       int xit=0,i,x,y,tick=0,time,whichsnd[2]={ESCPRESSEDSND,SHOOTSND};\r
+\r
+\r
+       Message(string);\r
+       IN_ClearKeysDown();\r
+\r
+       //\r
+       // BLINK CURSOR\r
+       //\r
+       x=PrintX;\r
+       y=PrintY;\r
+       TimeCount=0;\r
+\r
+       do\r
+       {\r
+               if (TimeCount>=10)\r
+               {\r
+                       switch(tick)\r
+                       {\r
+                               case 0:\r
+                                       VWB_Bar(x,y,8,13,TEXTCOLOR);\r
+                                       break;\r
+                               case 1:\r
+                                       PrintX=x;\r
+                                       PrintY=y;\r
+                                       US_Print("_");\r
+                       }\r
+                       VW_UpdateScreen();\r
+                       tick^=1;\r
+                       TimeCount=0;\r
+               }\r
+\r
+               #ifndef SPEAR\r
+               if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
+                       PicturePause();\r
+               #endif\r
+\r
+       #ifdef SPANISH\r
+       } while(!Keyboard[sc_S] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);\r
+       #else\r
+       } while(!Keyboard[sc_Y] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);\r
+       #endif\r
+\r
+       #ifdef SPANISH\r
+       if (Keyboard[sc_S])\r
+       {\r
+               xit=1;\r
+               ShootSnd();\r
+       }\r
+\r
+       while(Keyboard[sc_S] || Keyboard[sc_N] || Keyboard[sc_Escape]);\r
+\r
+       #else\r
+\r
+       if (Keyboard[sc_Y])\r
+       {\r
+               xit=1;\r
+               ShootSnd();\r
+       }\r
+\r
+       while(Keyboard[sc_Y] || Keyboard[sc_N] || Keyboard[sc_Escape]);\r
+       #endif\r
+\r
+       IN_ClearKeysDown();\r
+       SD_PlaySound(whichsnd[xit]);\r
+       return xit;\r
+}\r
+\r
+#ifdef JAPAN\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// DRAW MESSAGE & GET Y OR N\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+int GetYorN(int x,int y,int pic)\r
+{\r
+       int xit=0,whichsnd[2]={ESCPRESSEDSND,SHOOTSND};\r
+\r
+\r
+       CA_CacheGrChunk(pic);\r
+       VWB_DrawPic(x * 8,y * 8,pic);\r
+       UNCACHEGRCHUNK(pic);\r
+       VW_UpdateScreen();\r
+       IN_ClearKeysDown();\r
+\r
+       do\r
+       {\r
+               #ifndef SPEAR\r
+               if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
+                       PicturePause();\r
+               #endif\r
+\r
+       #ifdef SPANISH\r
+       } while(!Keyboard[sc_S] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);\r
+       #else\r
+       } while(!Keyboard[sc_Y] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);\r
+       #endif\r
+\r
+       #ifdef SPANISH\r
+       if (Keyboard[sc_S])\r
+       {\r
+               xit=1;\r
+               ShootSnd();\r
+       }\r
+\r
+       while(Keyboard[sc_S] || Keyboard[sc_N] || Keyboard[sc_Escape]);\r
+\r
+       #else\r
+\r
+       if (Keyboard[sc_Y])\r
+       {\r
+               xit=1;\r
+               ShootSnd();\r
+       }\r
+\r
+       while(Keyboard[sc_Y] || Keyboard[sc_N] || Keyboard[sc_Escape]);\r
+       #endif\r
+\r
+       IN_ClearKeysDown();\r
+       SD_PlaySound(whichsnd[xit]);\r
+       return xit;\r
+}\r
+#endif\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// PRINT A MESSAGE IN A WINDOW\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+void Message(char far *string)\r
+{\r
+       int h=0,w=0,mw=0,i,x,y,time;\r
+       fontstruct _seg *font;\r
+\r
+\r
+       CA_CacheGrChunk (STARTFONT+1);\r
+       fontnumber=1;\r
+       font=grsegs[STARTFONT+fontnumber];\r
+       h=font->height;\r
+       for (i=0;i<_fstrlen(string);i++)\r
+               if (string[i]=='\n')\r
+               {\r
+                       if (w>mw)\r
+                               mw=w;\r
+                       w=0;\r
+                       h+=font->height;\r
+               }\r
+               else\r
+                       w+=font->width[string[i]];\r
+\r
+       if (w+10>mw)\r
+               mw=w+10;\r
+\r
+       PrintY=(WindowH/2)-h/2;\r
+       PrintX=WindowX=160-mw/2;\r
+\r
+       DrawWindow(WindowX-5,PrintY-5,mw+10,h+10,TEXTCOLOR);\r
+       DrawOutline(WindowX-5,PrintY-5,mw+10,h+10,0,HIGHLIGHT);\r
+       SETFONTCOLOR(0,TEXTCOLOR);\r
+       US_Print(string);\r
+       VW_UpdateScreen();\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//\r
+// THIS MAY BE FIXED A LITTLE LATER...\r
+//\r
+////////////////////////////////////////////////////////////////////\r
+static int     lastmusic;\r
+\r
+void StartCPMusic(int song)\r
+{\r
+       musicnames      chunk;\r
+\r
+       if (audiosegs[STARTMUSIC + lastmusic])  // JDC\r
+               MM_FreePtr ((memptr *)&audiosegs[STARTMUSIC + lastmusic]);\r
+       lastmusic = song;\r
+\r
+       SD_MusicOff();\r
+       chunk = song;\r
+\r
+       MM_BombOnError (false);\r
+       CA_CacheAudioChunk(STARTMUSIC + chunk);\r
+       MM_BombOnError (true);\r
+       if (mmerror)\r
+               mmerror = false;\r
+       else\r
+       {\r
+               MM_SetLock(&((memptr)audiosegs[STARTMUSIC + chunk]),true);\r
+               SD_StartMusic((MusicGroup far *)audiosegs[STARTMUSIC + chunk]);\r
+       }\r
+}\r
+\r
+void FreeMusic (void)\r
+{\r
+       if (audiosegs[STARTMUSIC + lastmusic])  // JDC\r
+               MM_FreePtr ((memptr *)&audiosegs[STARTMUSIC + lastmusic]);\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////\r
+//\r
+//     IN_GetScanName() - Returns a string containing the name of the\r
+//             specified scan code\r
+//\r
+///////////////////////////////////////////////////////////////////////////\r
+byte *\r
+IN_GetScanName(ScanCode scan)\r
+{\r
+       byte            **p;\r
+       ScanCode        far *s;\r
+\r
+       for (s = ExtScanCodes,p = ExtScanNames;*s;p++,s++)\r
+               if (*s == scan)\r
+                       return(*p);\r
+\r
+       return(ScanNames[scan]);\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////\r
+//\r
+// CHECK FOR PAUSE KEY (FOR MUSIC ONLY)\r
+//\r
+///////////////////////////////////////////////////////////////////////////\r
+void CheckPause(void)\r
+{\r
+       if (Paused)\r
+       {\r
+               switch(SoundStatus)\r
+               {\r
+                       case 0: SD_MusicOn(); break;\r
+                       case 1: SD_MusicOff(); break;\r
+               }\r
+\r
+               SoundStatus^=1;\r
+               VW_WaitVBL(3);\r
+               IN_ClearKeysDown();\r
+               Paused=false;\r
+ }\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////\r
+//\r
+// DRAW GUN CURSOR AT CORRECT POSITION IN MENU\r
+//\r
+///////////////////////////////////////////////////////////////////////////\r
+void DrawMenuGun(CP_iteminfo *iteminfo)\r
+{\r
+       int x,y;\r
+\r
+\r
+       x=iteminfo->x;\r
+       y=iteminfo->y+iteminfo->curpos*13-2;\r
+       VWB_DrawPic(x,y,C_CURSOR1PIC);\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////\r
+//\r
+// DRAW SCREEN TITLE STRIPES\r
+//\r
+///////////////////////////////////////////////////////////////////////////\r
+void DrawStripes(int y)\r
+{\r
+#ifndef SPEAR\r
+       VWB_Bar(0,y,320,24,0);\r
+       VWB_Hlin(0,319,y+22,STRIPE);\r
+#else\r
+       VWB_Bar(0,y,320,22,0);\r
+       VWB_Hlin(0,319,y+23,0);\r
+#endif\r
+}\r
+\r
+void ShootSnd(void)\r
+{\r
+       SD_PlaySound(SHOOTSND);\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////\r
+//\r
+// CHECK FOR EPISODES\r
+//\r
+///////////////////////////////////////////////////////////////////////////\r
+void CheckForEpisodes(void)\r
+{\r
+       struct ffblk f;\r
+\r
+//\r
+// JAPANESE VERSION\r
+//\r
+#ifdef JAPAN\r
+#ifdef JAPDEMO\r
+       if (!findfirst("*.WJ1",&f,FA_ARCH))\r
+       {\r
+               strcpy(extension,"WJ1");\r
+#else\r
+       if (!findfirst("*.WJ6",&f,FA_ARCH))\r
+       {\r
+               strcpy(extension,"WJ6");\r
+#endif\r
+               strcat(configname,extension);\r
+               strcat(SaveName,extension);\r
+               strcat(PageFileName,extension);\r
+               strcat(audioname,extension);\r
+               strcat(demoname,extension);\r
+               EpisodeSelect[1] =\r
+               EpisodeSelect[2] =\r
+               EpisodeSelect[3] =\r
+               EpisodeSelect[4] =\r
+               EpisodeSelect[5] = 1;\r
+       }\r
+       else\r
+               Quit("NO JAPANESE WOLFENSTEIN 3-D DATA FILES to be found!");\r
+#else\r
+\r
+//\r
+// ENGLISH\r
+//\r
+#ifndef UPLOAD\r
+#ifndef SPEAR\r
+       if (!findfirst("*.WL6",&f,FA_ARCH))\r
+       {\r
+               strcpy(extension,"WL6");\r
+               NewEmenu[2].active =\r
+               NewEmenu[4].active =\r
+               NewEmenu[6].active =\r
+               NewEmenu[8].active =\r
+               NewEmenu[10].active =\r
+               EpisodeSelect[1] =\r
+               EpisodeSelect[2] =\r
+               EpisodeSelect[3] =\r
+               EpisodeSelect[4] =\r
+               EpisodeSelect[5] = 1;\r
+       }\r
+       else\r
+       if (!findfirst("*.WL3",&f,FA_ARCH))\r
+       {\r
+               strcpy(extension,"WL3");\r
+               NewEmenu[2].active =\r
+               NewEmenu[4].active =\r
+               EpisodeSelect[1] =\r
+               EpisodeSelect[2] = 1;\r
+       }\r
+       else\r
+#endif\r
+#endif\r
+\r
+\r
+\r
+#ifdef SPEAR\r
+#ifndef SPEARDEMO\r
+       if (!findfirst("*.SOD",&f,FA_ARCH))\r
+       {\r
+               strcpy(extension,"SOD");\r
+       }\r
+       else\r
+               Quit("NO SPEAR OF DESTINY DATA FILES TO BE FOUND!");\r
+#else\r
+       if (!findfirst("*.SDM",&f,FA_ARCH))\r
+       {\r
+               strcpy(extension,"SDM");\r
+       }\r
+       else\r
+               Quit("NO SPEAR OF DESTINY DEMO DATA FILES TO BE FOUND!");\r
+#endif\r
+\r
+#else\r
+       if (!findfirst("*.WL1",&f,FA_ARCH))\r
+       {\r
+               strcpy(extension,"WL1");\r
+       }\r
+       else\r
+               Quit("NO WOLFENSTEIN 3-D DATA FILES to be found!");\r
+#endif\r
+\r
+       strcat(configname,extension);\r
+       strcat(SaveName,extension);\r
+       strcat(PageFileName,extension);\r
+       strcat(audioname,extension);\r
+       strcat(demoname,extension);\r
+#ifndef SPEAR\r
+#ifndef GOODTIMES\r
+       strcat(helpfilename,extension);\r
+#endif\r
+       strcat(endfilename,extension);\r
+#endif\r
+#endif\r
+}\r