%20WL_MENU.C
///////////////////////////////////////////////////////////////////
/
//
// WL_MENU.C
// by John Romero (C) 1992 Id Software, Inc.
//
////////////////////////////////////////////////////////////////////
#include "wl_def.h"
#pragma hdrstop
//
// PRIVATE PROTOTYPES
//
void CP_ReadThis(void);
#ifdef SPEAR
#define STARTITEM newgame
#else
#ifdef GOODTIMES
#define STARTITEM newgame
#else
#define STARTITEM readthis
#endif
#endif
char far endStrings[9][80]=
{
#ifndef SPEAR
{"Dost thou wish to\nleave with such hasty\nabandon?"},
{"Chickening out...\nalready?"},
{"Press N for more carnage.\nPress Y to be a weenie."},
{"So, you think you can\nquit this easily, huh?"},
{"Press N to save the world.\nPress Y to abandon it in\nits hour of
need."},
{"Press N if you are brave.\nPress Y to cower in shame."},
{"Heroes, press N.\nWimps, press Y."},
{"You are at an intersection.\nA sign says, 'Press Y to quit.'\n>"},
{"For guns and glory, press N.\nFor work and worry, press Y."}
#else
ENDSTR1,
ENDSTR2,
ENDSTR3,
ENDSTR4,
ENDSTR5,
ENDSTR6,
ENDSTR7,
ENDSTR8,
ENDSTR9
#endif
};
CP_iteminfo
MainItems={MENU_X,MENU_Y,10,STARTITEM,24},
SndItems={SM_X,SM_Y1,12,0,52},
LSItems={LSM_X,LSM_Y,10,0,24},
CtlItems={CTL_X,CTL_Y,6,-1,56},
CusItems={8,CST_Y+13*2,9,-1,0},
NewEitems={NE_X,NE_Y,11,0,88},
NewItems={NM_X,NM_Y,4,2,24};
#pragma warn -sus
CP_itemtype far
MainMenu[]=
{
#ifdef JAPAN
{1,"",CP_NewGame},
{1,"",CP_Sound},
{1,"",CP_Control},
{1,"",CP_LoadGame},
{0,"",CP_SaveGame},
{1,"",CP_ChangeView},
{2,"",CP_ReadThis},
{1,"",CP_ViewScores},
{1,"",0},
{1,"",0}
#else
{1,STR_NG,CP_NewGame},
{1,STR_SD,CP_Sound},
{1,STR_CL,CP_Control},
{1,STR_LG,CP_LoadGame},
{0,STR_SG,CP_SaveGame},
{1,STR_CV,CP_ChangeView},
#ifndef GOODTIMES
#ifndef SPEAR
#ifdef SPANISH
{2,"Ve esto!",CP_ReadThis},
#else
{2,"Read This!",CP_ReadThis},
#endif
#endif
#endif
{1,STR_VS,CP_ViewScores},
{1,STR_BD,0},
{1,STR_QT,0}
#endif
},
far SndMenu[]=
{
#ifdef JAPAN
{1,"",0},
{1,"",0},
{1,"",0},
{0,"",0},
{0,"",0},
{1,"",0},
{1,"",0},
{1,"",0},
{0,"",0},
{0,"",0},
{1,"",0},
{1,"",0},
#else
{1,STR_NONE,0},
{1,STR_PC,0},
{1,STR_ALSB,0},
{0,"",0},
{0,"",0},
{1,STR_NONE,0},
{1,STR_DISNEY,0},
{1,STR_SB,0},
{0,"",0},
{0,"",0},
{1,STR_NONE,0},
{1,STR_ALSB,0}
#endif
},
far CtlMenu[]=
{
#ifdef JAPAN
{0,"",0},
{0,"",0},
{0,"",0},
{0,"",0},
{0,"",MouseSensitivity},
{1,"",CustomControls}
#else
{0,STR_MOUSEEN,0},
{0,STR_JOYEN,0},
{0,STR_PORT2,0},
{0,STR_GAMEPAD,0},
{0,STR_SENS,MouseSensitivity},
{1,STR_CUSTOM,CustomControls}
#endif
},
#pragma warn +sus
#ifndef SPEAR
far NewEmenu[]=
{
#ifdef JAPAN
#ifdef JAPDEMO
{1,"",0},
{0,"",0},
{0,"",0},
{0,"",0},
{0,"",0},
{0,"",0},
{0,"",0},
{0,"",0},
{0,"",0},
{0,"",0},
{0,"",0},
{0,"",0},
#else
{1,"",0},
{0,"",0},
{1,"",0},
{0,"",0},
{1,"",0},
{0,"",0},
{1,"",0},
{0,"",0},
{1,"",0},
{0,"",0},
{1,"",0},
{0,"",0}
#endif
#else
#ifdef SPANISH
{1,"Episodio 1\n"
"Fuga desde Wolfenstein",0},
{0,"",0},
{3,"Episodio 2\n"
"Operacion Eisenfaust",0},
{0,"",0},
{3,"Episodio 3\n"
"Muere, Fuhrer, Muere!",0},
{0,"",0},
{3,"Episodio 4\n"
"Un Negro Secreto",0},
{0,"",0},
{3,"Episodio 5\n"
"Huellas del Loco",0},
{0,"",0},
{3,"Episodio 6\n"
"Confrontacion",0}
#else
{1,"Episode 1\n"
"Escape from Wolfenstein",0},
{0,"",0},
{3,"Episode 2\n"
"Operation: Eisenfaust",0},
{0,"",0},
{3,"Episode 3\n"
"Die, Fuhrer, Die!",0},
{0,"",0},
{3,"Episode 4\n"
"A Dark Secret",0},
{0,"",0},
{3,"Episode 5\n"
"Trail of the Madman",0},
{0,"",0},
{3,"Episode 6\n"
"Confrontation",0}
#endif
#endif
},
#endif
far NewMenu[]=
{
#ifdef JAPAN
{1,"",0},
{1,"",0},
{1,"",0},
{1,"",0}
#else
{1,STR_DADDY,0},
{1,STR_HURTME,0},
{1,STR_BRINGEM,0},
{1,STR_DEATH,0}
#endif
},
far LSMenu[]=
{
{1,"",0},
{1,"",0},
{1,"",0},
{1,"",0},
{1,"",0},
{1,"",0},
{1,"",0},
{1,"",0},
{1,"",0},
{1,"",0}
},
far CusMenu[]=
{
{1,"",0},
{0,"",0},
{0,"",0},
{1,"",0},
{0,"",0},
{0,"",0},
{1,"",0},
{0,"",0},
{1,"",0}
}
;
int color_hlite[]={
DEACTIVE,
HIGHLIGHT,
READHCOLOR,
0x67
},
color_norml[]={
DEACTIVE,
TEXTCOLOR,
READCOLOR,
0x6b
};
int EpisodeSelect[6]={1};
int SaveGamesAvail[10],StartGame,SoundStatus=1,pickquick;
char SaveGameNames[10][32],SaveName[13]="SAVEGAM?.";
////////////////////////////////////////////////////////////////////
//
// INPUT MANAGER SCANCODE TABLES
//
////////////////////////////////////////////////////////////////////
static byte
*ScanNames[] = // Scan code names with single
chars
{
"?","?","1","2","3","4","5","6","7","8","9","0","-","+","?","?",
"Q","W","E","R","T","Y","U","I","O","P","[","]","|","?","A","S",
"D","F","G","H","J","K","L",";","\"","?","?","?","Z","X","C","V",
"B","N","M",",",".","/","?","?","?","?","?","?","?","?","?","?",
"?","?","?","?","?","?","?","?","\xf","?","-","\x15","5","\x11","+","
?",
"\x13","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?",
"?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?",
"?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?"
}, // DEBUG - consolidate these
far ExtScanCodes[] = // Scan codes with >1 char
names
{
1,0xe,0xf,0x1d,0x2a,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,
0x3f,0x40,0x41,0x42,0x43,0x44,0x57,0x59,0x46,0x1c,0x36,
0x37,0x38,0x47,0x49,0x4f,0x51,0x52,0x53,0x45,0x48,
0x50,0x4b,0x4d,0x00
},
*ExtScanNames[] = // Names corresponding to
ExtScanCodes
{
"Esc","BkSp","Tab","Ctrl","LShft","Space","CapsLk","F1","F2","F3","F4
",
"F5","F6","F7","F8","F9","F10","F11","F12","ScrlLk","Enter","RShft",
"PrtSc","Alt","Home","PgUp","End","PgDn","Ins","Del","NumLk","Up",
"Down","Left","Right",""
};
////////////////////////////////////////////////////////////////////
//
// Wolfenstein Control Panel! Ta Da!
//
////////////////////////////////////////////////////////////////////
void US_ControlPanel(byte scancode)
{
int which,i,start;
if (ingame)
if (CP_CheckQuick(scancode))
return;
StartCPMusic(MENUSONG);
SetupControlPanel();
//
// F-KEYS FROM WITHIN GAME
//
switch(scancode)
{
case sc_F1:
#ifdef SPEAR
BossKey();
#else
#ifdef GOODTIMES
BossKey();
#else
HelpScreens();
#endif
#endif
goto finishup;
case sc_F2:
CP_SaveGame(0);
goto finishup;
case sc_F3:
CP_LoadGame(0);
goto finishup;
case sc_F4:
CP_Sound();
goto finishup;
case sc_F5:
CP_ChangeView();
goto finishup;
case sc_F6:
CP_Control();
goto finishup;
finishup:
CleanupControlPanel();
#ifdef SPEAR
UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
#endif
return;
}
#ifdef SPEAR
CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
#endif
DrawMainMenu();
MenuFadeIn();
StartGame=0;
//
// MAIN MENU LOOP
//
do
{
which=HandleMenu(&MainItems,&MainMenu[0],NULL);
#ifdef SPEAR
#ifndef SPEARDEMO
//
// EASTER EGG FOR SPEAR OF DESTINY!
//
if (Keyboard[sc_I] && Keyboard[sc_D])
{
VW_FadeOut();
StartCPMusic (XJAZNAZI_MUS);
UnCacheLump(OPTIONS_LUMP_START,OPTIONS_LUMP_END);
UnCacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);
MM_SortMem ();
ClearMemory ();
CA_CacheGrChunk (IDGUYS1PIC);
VWB_DrawPic(0,0,IDGUYS1PIC);
UNCACHEGRCHUNK(IDGUYS1PIC);
CA_CacheGrChunk (IDGUYS2PIC);
VWB_DrawPic(0,80,IDGUYS2PIC);
UNCACHEGRCHUNK(IDGUYS2PIC);
VW_UpdateScreen();
CA_CacheGrChunk (IDGUYSPALETTE);
VL_FadeIn(0,255,grsegs[IDGUYSPALETTE],30);
UNCACHEGRCHUNK(IDGUYSPALETTE);
while (Keyboard[sc_I] || Keyboard[sc_D]);
IN_ClearKeysDown();
IN_Ack();
VW_FadeOut();
CacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);
CacheLump(OPTIONS_LUMP_START,OPTIONS_LUMP_END);
DrawMainMenu();
StartCPMusic (MENUSONG);
MenuFadeIn();
}
#endif
#endif
switch(which)
{
case viewscores:
if (MainMenu[viewscores].routine == NULL)
if (CP_EndGame())
StartGame=1;
DrawMainMenu();
MenuFadeIn();
break;
case backtodemo:
#ifdef SPEAR
if (!ingame)
{
//
// DEALLOCATE ALL SOUNDS!
//
switch (SoundMode)
{
case sdm_PC:
start = STARTPCSOUNDS;
break;
case sdm_AdLib:
start = STARTADLIBSOUNDS;
break;
}
if (SoundMode != sdm_Off)
for (i=0;i");
while (!Keyboard[sc_Escape])
IN_ClearKeysDown();
SD_MusicOn();
VL_SetVGAPlaneMode ();
VL_TestPaletteSet ();
VL_SetPalette (&gamepal);
LoadLatchMem();
}
#endif
#endif
////////////////////////////////////////////////////////////////////
//
// CHECK QUICK-KEYS & QUIT (WHILE IN A GAME)
//
////////////////////////////////////////////////////////////////////
int CP_CheckQuick(unsigned scancode)
{
switch(scancode)
{
//
// END GAME
//
case sc_F7:
CA_CacheGrChunk(STARTFONT+1);
WindowH=160;
#ifdef JAPAN
if (GetYorN(7,8,C_JAPQUITPIC))
#else
if (Confirm(ENDGAMESTR))
#endif
{
playstate = ex_died;
pickquick = gamestate.lives = 0;
}
DrawAllPlayBorder();
WindowH=200;
fontnumber=0;
MainMenu[savegame].active = 0;
return 1;
//
// QUICKSAVE
//
case sc_F8:
if (SaveGamesAvail[LSItems.curpos] && pickquick)
{
CA_CacheGrChunk(STARTFONT+1);
fontnumber = 1;
Message(STR_SAVING"...");
CP_SaveGame(1);
fontnumber=0;
}
else
{
#ifndef SPEAR
CA_CacheGrChunk(STARTFONT+1);
CA_CacheGrChunk(C_CURSOR1PIC);
CA_CacheGrChunk(C_CURSOR2PIC);
CA_CacheGrChunk(C_DISKLOADING1PIC);
CA_CacheGrChunk(C_DISKLOADING2PIC);
CA_CacheGrChunk(C_SAVEGAMEPIC);
CA_CacheGrChunk(C_MOUSELBACKPIC);
#else
CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
CA_CacheGrChunk(C_CURSOR1PIC);
#endif
VW_FadeOut ();
StartCPMusic(MENUSONG);
pickquick=CP_SaveGame(0);
SETFONTCOLOR(0,15);
IN_ClearKeysDown();
DrawPlayScreen ();
if (!startgame && !loadedgame)
{
VW_FadeIn ();
StartMusic ();
}
if (loadedgame)
playstate = ex_abort;
lasttimecount = TimeCount;
if (MousePresent)
Mouse(MDelta); // Clear accumulated mouse movement
PM_CheckMainMem ();
#ifndef SPEAR
UNCACHEGRCHUNK(C_CURSOR1PIC);
UNCACHEGRCHUNK(C_CURSOR2PIC);
UNCACHEGRCHUNK(C_DISKLOADING1PIC);
UNCACHEGRCHUNK(C_DISKLOADING2PIC);
UNCACHEGRCHUNK(C_SAVEGAMEPIC);
UNCACHEGRCHUNK(C_MOUSELBACKPIC);
#else
UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
#endif
}
return 1;
//
// QUICKLOAD
//
case sc_F9:
if (SaveGamesAvail[LSItems.curpos] && pickquick)
{
char string[100]=STR_LGC;
CA_CacheGrChunk(STARTFONT+1);
fontnumber = 1;
strcat(string,SaveGameNames[LSItems.curpos]);
strcat(string,"\"?");
if (Confirm(string))
CP_LoadGame(1);
DrawAllPlayBorder();
fontnumber=0;
}
else
{
#ifndef SPEAR
CA_CacheGrChunk(STARTFONT+1);
CA_CacheGrChunk(C_CURSOR1PIC);
CA_CacheGrChunk(C_CURSOR2PIC);
CA_CacheGrChunk(C_DISKLOADING1PIC);
CA_CacheGrChunk(C_DISKLOADING2PIC);
CA_CacheGrChunk(C_LOADGAMEPIC);
CA_CacheGrChunk(C_MOUSELBACKPIC);
#else
CA_CacheGrChunk(C_CURSOR1PIC);
CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
#endif
VW_FadeOut ();
StartCPMusic(MENUSONG);
pickquick=CP_LoadGame(0);
SETFONTCOLOR(0,15);
IN_ClearKeysDown();
DrawPlayScreen ();
if (!startgame && !loadedgame)
{
VW_FadeIn ();
StartMusic ();
}
if (loadedgame)
playstate = ex_abort;
lasttimecount = TimeCount;
if (MousePresent)
Mouse(MDelta); // Clear accumulated mouse movement
PM_CheckMainMem ();
#ifndef SPEAR
UNCACHEGRCHUNK(C_CURSOR1PIC);
UNCACHEGRCHUNK(C_CURSOR2PIC);
UNCACHEGRCHUNK(C_DISKLOADING1PIC);
UNCACHEGRCHUNK(C_DISKLOADING2PIC);
UNCACHEGRCHUNK(C_LOADGAMEPIC);
UNCACHEGRCHUNK(C_MOUSELBACKPIC);
#else
UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
#endif
}
return 1;
//
// QUIT
//
case sc_F10:
CA_CacheGrChunk(STARTFONT+1);
WindowX=WindowY=0;
WindowW=320;
WindowH=160;
#ifdef JAPAN
if (GetYorN(7,8,C_QUITMSGPIC))
#else
#ifdef SPANISH
if (Confirm(ENDGAMESTR))
#else
if (Confirm(endStrings[US_RndT()&0x7+(US_RndT()&1)]))
#endif
#endif
{
int i;
VW_UpdateScreen();
SD_MusicOff();
SD_StopSound();
MenuFadeOut();
//
// SHUT-UP THE ADLIB
//
for (i=1;i<=0xf5;i++)
alOut(i,0);
Quit(NULL);
}
DrawAllPlayBorder();
WindowH=200;
fontnumber=0;
return 1;
}
return 0;
}
////////////////////////////////////////////////////////////////////
//
// END THE CURRENT GAME
//
////////////////////////////////////////////////////////////////////
int CP_EndGame(void)
{
#ifdef JAPAN
if (!GetYorN(7,8,C_JAPQUITPIC))
#else
if (!Confirm(ENDGAMESTR))
#endif
return 0;
pickquick = gamestate.lives = 0;
playstate = ex_died;
#pragma warn -sus
MainMenu[savegame].active = 0;
MainMenu[viewscores].routine=CP_ViewScores;
#ifndef JAPAN
_fstrcpy(MainMenu[viewscores].string,STR_VS);
#endif
#pragma warn +sus
return 1;
}