//
// 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 NUMSOUNDS;i++,start++)
if (audiosegs[start])
MM_SetPurge (&(memptr)audiosegs[start],3); // make purgable
}
#endif
MM_SortMem();
StartGame=1;
if (!ingame)
StartCPMusic(INTROSONG);
VL_FadeOut(0,255,0,0,0,0);"_";modf
break;
case -1:
case quit:
CP_Quit();
break;
default:
if (!StartGame)
{
DrawMainMenu();
MenuFadeIn();
}
}
//
// "EXIT OPTIONS" OR "NEW GAME" EXITS
//
} while(!StartGame);
//
// DEALLOCATE EVERYTHING
//
CleanupControlPanel();
//
// CHANGE MAINMENU ITEM
//
if (startgame || loadedgame)
{
#pragma warn -sus
MainMenu[viewscores].routine = NULL;
#ifndef JAPAN
_fstrcpy(MainMenu[viewscores].string,STR_EG);
#endif
#pragma warn +sus
}
// return/START GAME EXECUTION
#ifdef SPEAR
UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
MM_SortMem ();
#endif
}
////////////////////////
//
// DRAW MAIN MENU SCREEN
//
void DrawMainMenu(void)
{
#ifdef JAPAN
CA_CacheScreen(S_OPTIONSPIC);
#else
ClearMScreen();
VWB_DrawPic(112,184,C_MOUSELBACKPIC);
DrawStripes(0);"_";modf
VWB_DrawPic(84,0,C_OPTIONSPIC);
#ifdef SPANISH
DrawWindow(MENU_X-8,MENU_Y-3,MENU_W+8,MENU_H,BKGDCOLOR);
#else
DrawWindow(MENU_X-8,MENU_Y-3,MENU_W,MENU_H,BKGDCOLOR);
#endif
#endif
//
// CHANGE "GAME" AND "DEMO"
//
if (ingame)
{
#ifndef JAPAN
#ifdef SPANISH
_fstrcpy(&MainMenu[backtodemo].string,STR_GAME);
#else
_fstrcpy(&MainMenu[backtodemo].string[8],STR_GAME);
#endif
#else
CA_CacheGrChunk(C_MRETGAMEPIC);
VWB_DrawPic(12*8,20*8,C_MRETGAMEPIC);
UNCACHEGRCHUNK(C_MRETGAMEPIC);
CA_CacheGrChunk(C_MENDGAMEPIC);
VWB_DrawPic(12*8,18*8,C_MENDGAMEPIC);
UNCACHEGRCHUNK(C_MENDGAMEPIC);
#endif
MainMenu[backtodemo].active=2;
}
else
{
#ifndef JAPAN
#ifdef SPANISH
_fstrcpy(&MainMenu[backtodemo].string,STR_BD);
#else
_fstrcpy(&MainMenu[backtodemo].string[8],STR_DEMO);
#endif
#else
CA_CacheGrChunk(C_MRETDEMOPIC);
VWB_DrawPic(12*8,20*8,C_MRETDEMOPIC);
UNCACHEGRCHUNK(C_MRETDEMOPIC);
CA_CacheGrChunk(C_MSCORESPIC);
VWB_DrawPic(12*8,18*8,C_MSCORESPIC);
UNCACHEGRCHUNK(C_MSCORESPIC);
#endif
MainMenu[backtodemo].active=1;
}
DrawMenu(&MainItems,&MainMenu[0]);
VW_UpdateScreen();
}
#ifndef GOODTIMES
#ifndef SPEAR
////////////////////////////////////////////////////////////////////
//
// READ THIS!
//
////////////////////////////////////////////////////////////////////
void CP_ReadThis(void)
{
StartCPMusic(CORNER_MUS);
HelpScreens();
StartCPMusic(MENUSONG);
}
#endif
#endif
#ifndef SPEAR
#ifndef GOODTIMES
#else
////////////////////////////////////////////////////////////////////
//
// BOSS KEY
//
////////////////////////////////////////////////////////////////////
void BossKey(void)
{
SD_MusicOff();
_AX = 3;
geninterrupt(0x10);
printf("C>");
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;
}
////////////////////////////////////////////////////////////////////
//
// VIEW THE HIGH SCORES
//
////////////////////////////////////////////////////////////////////
void CP_ViewScores(void)
{
fontnumber=0;
#ifdef SPEAR
UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
StartCPMusic (XAWARD_MUS);
#else
StartCPMusic (ROSTER_MUS);
#endif
DrawHighScores ();
VW_UpdateScreen ();
MenuFadeIn();
fontnumber=1;
IN_Ack();
StartCPMusic(MENUSONG);
MenuFadeOut();
#ifdef SPEAR
CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
#endif
}
////////////////////////////////////////////////////////////////////
//
// START A NEW GAME
//
////////////////////////////////////////////////////////////////////
void CP_NewGame(void)
{
int which,episode;
#ifdef SPEAR
UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
#endif
#ifndef SPEAR
firstpart:
DrawNewEpisode();
do
{
which=HandleMenu(&NewEitems,&NewEmenu[0],NULL);
switch(which)
{
case -1:
MenuFadeOut();
return;
default:
if (!EpisodeSelect[which/2])
{
SD_PlaySound (NOWAYSND);
Message(" \" \"\n""_";modf
" ""_";modf
" ""_";modf
" ");"_";modf
IN_ClearKeysDown();
IN_Ack();
DrawNewEpisode();
which = 0;
}
else
{
episode = which/2;
which = 1;
}
break;
}
} while (!which);
ShootSnd();
//
// ALREADY IN A GAME?
//
if (ingame)
#ifdef JAPAN
if (!GetYorN(7,8,C_JAPNEWGAMEPIC))
#else
if (!Confirm(CURGAME))
#endif
{
MenuFadeOut();
return;
}
MenuFadeOut();
#else
episode = 0;
//
// ALREADY IN A GAME?
//
CacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);
DrawNewGame();
if (ingame)
if (!Confirm(CURGAME))
{
MenuFadeOut();
UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);
CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
return;
}
#endif
DrawNewGame();
which=HandleMenu(&NewItems,&NewMenu[0],DrawNewGameDiff);
if (which 0)
{
MenuFadeOut();
#ifndef SPEAR
goto firstpart;
#else
UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);
CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
return;
#endif
}
ShootSnd();
NewGame(which,episode);
StartGame=1;
MenuFadeOut();
//
// CHANGE "READ THIS!" TO NORMAL COLOR
//
#ifndef SPEAR
#ifndef GOODTIMES
MainMenu[readthis].active=1;
#endif
#endif
pickquick = 0;
#ifdef SPEAR
UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);
CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
#endif
}
#ifndef SPEAR
/////////////////////
//
// DRAW NEW EPISODE MENU
//
void DrawNewEpisode(void)
{
int i;
#ifdef JAPAN
CA_CacheScreen(S_EPISODEPIC);
#else
ClearMScreen();
VWB_DrawPic(112,184,C_MOUSELBACKPIC);
DrawWindow(NE_X-4,NE_Y-4,NE_W+8,NE_H+8,BKGDCOLOR);
SETFONTCOLOR(READHCOLOR,BKGDCOLOR);
PrintY=2;
WindowX=0;
#ifdef SPANISH
US_CPrint("Cual episodio jugar?");
#else
US_CPrint("");"_";modf
#endif
#endif
SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
DrawMenu(&NewEitems,&NewEmenu[0]);
for (i=0;i 6;i++)
VWB_DrawPic(NE_X+32,NE_Y+i*26,C_EPISODE1PIC+i);
VW_UpdateScreen();
MenuFadeIn();
WaitKeyUp();
}
#endif
/////////////////////
//
// DRAW NEW GAME MENU
//
void DrawNewGame(void)
{
#ifdef JAPAN
CA_CacheScreen(S_SKILLPIC);
#else
ClearMScreen();
VWB_DrawPic(112,184,C_MOUSELBACKPIC);
SETFONTCOLOR(READHCOLOR,BKGDCOLOR);
PrintX=NM_X+20;
PrintY=NM_Y-32;
#ifndef SPEAR
#ifdef SPANISH
US_Print("Eres macho?");
#else
US_Print("-");"_";modf
#endif
#else
VWB_DrawPic (PrintX,PrintY,C_HOWTOUGHPIC);
#endif
DrawWindow(NM_X-5,NM_Y-10,NM_W,NM_H,BKGDCOLOR);
#endif
DrawMenu(&NewItems,&NewMenu[0]);
DrawNewGameDiff(NewItems.curpos);
VW_UpdateScreen();
MenuFadeIn();
WaitKeyUp();
}
////////////////////////
//
// DRAW NEW GAME GRAPHIC
//
void DrawNewGameDiff(int w)
{
VWB_DrawPic(NM_X+185,NM_Y+7,w+C_BABYMODEPIC);
}
////////////////////////////////////////////////////////////////////
//
// HANDLE SOUND MENU
//
////////////////////////////////////////////////////////////////////
void CP_Sound(void)
{
int which,i;
#ifdef SPEAR
UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
CacheLump (SOUND_LUMP_START,SOUND_LUMP_END);
#endif
DrawSoundMenu();
MenuFadeIn();
WaitKeyUp();
do
{
which=HandleMenu(&SndItems,&SndMenu[0],NULL);
//
// HANDLE MENU CHOICES
//
switch(which)
{
//
// SOUND EFFECTS
//
case 0:
if (SoundMode!=sdm_Off)
{
SD_WaitSoundDone();
SD_SetSoundMode(sdm_Off);
DrawSoundMenu();
}
break;
case 1:
if (SoundMode!=sdm_PC)
{
SD_WaitSoundDone();
SD_SetSoundMode(sdm_PC);
CA_LoadAllSounds();
DrawSoundMenu();
ShootSnd();
}
break;
case 2:
if (SoundMode!=sdm_AdLib)
{
SD_WaitSoundDone();
SD_SetSoundMode(sdm_AdLib);
CA_LoadAllSounds();
DrawSoundMenu();
ShootSnd();
}
break;
//
// DIGITIZED SOUND
//
case 5:
if (DigiMode!=sds_Off)
{
SD_SetDigiDevice(sds_Off);
DrawSoundMenu();
}
break;
case 6:
if (DigiMode!=sds_SoundSource)
{
SD_SetDigiDevice(sds_SoundSource);
DrawSoundMenu();
ShootSnd();
}
break;
case 7:
if (DigiMode!=sds_SoundBlaster)
{
SD_SetDigiDevice(sds_SoundBlaster);
DrawSoundMenu();
ShootSnd();
}
break;
//
// MUSIC
//
case 10:
if (MusicMode!=smm_Off)
{
SD_SetMusicMode(smm_Off);
DrawSoundMenu();
ShootSnd();
}
break;
case 11:
if (MusicMode!=smm_AdLib)
{
SD_SetMusicMode(smm_AdLib);
DrawSoundMenu();
ShootSnd();
StartCPMusic(MENUSONG);
}
break;
}
} while(which>=0);
MenuFadeOut();
#ifdef SPEAR
UnCacheLump (SOUND_LUMP_START,SOUND_LUMP_END);
CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
#endif
}
//////////////////////
//
// DRAW THE SOUND MENU
//
void DrawSoundMenu(void)
{
int i,on;
#ifdef JAPAN
CA_CacheScreen(S_SOUNDPIC);
#else
//
// DRAW SOUND MENU
//
ClearMScreen();
VWB_DrawPic(112,184,C_MOUSELBACKPIC);
DrawWindow(SM_X-8,SM_Y1-3,SM_W,SM_H1,BKGDCOLOR);
DrawWindow(SM_X-8,SM_Y2-3,SM_W,SM_H2,BKGDCOLOR);
DrawWindow(SM_X-8,SM_Y3-3,SM_W,SM_H3,BKGDCOLOR);
#endif
//
// IF NO ADLIB, NON-CHOOSENESS!
//
if (!AdLibPresent && !SoundBlasterPresent)
{
SndMenu[2].active=SndMenu[10].active=SndMenu[11].active=0;
}
if (!SoundSourcePresent)
SndMenu[6].active=0;
if (!SoundBlasterPresent)
SndMenu[7].active=0;
if (!SoundSourcePresent && !SoundBlasterPresent)
SndMenu[5].active=0;
DrawMenu(&SndItems,&SndMenu[0]);
#ifndef JAPAN
VWB_DrawPic(100,SM_Y1-20,C_FXTITLEPIC);
VWB_DrawPic(100,SM_Y2-20,C_DIGITITLEPIC);
VWB_DrawPic(100,SM_Y3-20,C_MUSICTITLEPIC);
#endif
for (i=0;i(SndItems.amount;i++)
#ifdef JAPAN
if (i!=3 && i!=4 && i!=8 && i!=9)
#else
if (SndMenu[i].string[0])
#endif
{
//
// DRAW SELECTED/NOT SELECTED GRAPHIC BUTTONS
//
on=0;
switch(i)
{
//
// SOUND EFFECTS
//
case 0: if (SoundMode==sdm_Off) on=1; break;
case 1: if (SoundMode==sdm_PC) on=1; break;
case 2: if (SoundMode==sdm_AdLib) on=1; break;
//
// DIGITIZED SOUND
//
case 5: if (DigiMode==sds_Off) on=1; break;
case 6: if (DigiMode==sds_SoundSource) on=1; break;
case 7: if (DigiMode==sds_SoundBlaster) on=1; break;
//
// MUSIC
//
case 10: if (MusicMode==smm_Off) on=1; break;
case 11: if (MusicMode==smm_AdLib) on=1; break;
}
if (on)
VWB_DrawPic(SM_X+24,SM_Y1+i*13+2,C_SELECTEDPIC);
else
VWB_DrawPic(SM_X+24,SM_Y1+i*13+2,C_NOTSELECTEDPIC);
}
DrawMenuGun(&SndItems);
VW_UpdateScreen();
}
//
// DRAW LOAD/SAVE IN PROGRESS
//
void DrawLSAction(int which)
{
#define LSA_X 96
#define LSA_Y 80
#define LSA_W 130
#define LSA_H 42
DrawWindow(LSA_X,LSA_Y,LSA_W,LSA_H,TEXTCOLOR);
DrawOutline(LSA_X,LSA_Y,LSA_W,LSA_H,0,HIGHLIGHT);
VWB_DrawPic(LSA_X+8,LSA_Y+5,C_DISKLOADING1PIC);
fontnumber=1;
SETFONTCOLOR(0,TEXTCOLOR);
PrintX=LSA_X+46;
PrintY=LSA_Y+13;
if (!which)
US_Print(STR_LOADING"...");
else
US_Print(STR_SAVING"...");
VW_UpdateScreen();
}