planet-strike/3D_MENU.C
2013-07-08 00:00:00 +00:00

3846 lines
81 KiB
C

#include "3d_def.h"
#include "jm_tp.h"
#include "jm_io.h"
#pragma hdrstop
// As is, this switch will not work ... the data associated with this
// is not saved out correctly.
//
//#define CACHE_KEY_DATA
//
// End game message
//
char far EndGameStr[] = {" End current game?\n"
" Are you sure (Y or N)?"
};
#define ENDGAMESTR (EndGameStr)
char far QuitToDosStr[] = {" Quit to DOS?\n"
" Are you sure (Y or N)?"
};
//#define FREEFONT(fontnum) {MM_SetPurge (&(memptr)grsegs[fontnum],3);}
#define FREEFONT(fontnum) {if (fontnum != STARTFONT+2 && grsegs[fontnum]) UNCACHEGRCHUNK(fontnum);}
boolean EscPressed = false;
int lastmenumusic;
//===========================================================================
//
// PRIVATE PROTOTYPES
//
//===========================================================================
void CP_ReadThis(void);
void CP_OrderingInfo(void);
void DrawEpisodePic(int w);
void DrawAllSoundLights(int which);
void ReadGameNames(void);
void FreeMusic(void);
void CP_GameOptions(void);
void DrawGopMenu(void);
void CalibrateJoystick(void);
void ExitGame(void);
void CP_Switches(void);
void DrawSwitchMenu(void);
void DrawAllSwitchLights(int which);
void DrawSwitchDescription(int which);
extern boolean refresh_screen;
//===========================================================================
//
// LOCAL DATA...
//
//===========================================================================
CP_iteminfo
far MainItems= {MENU_X,MENU_Y,12,MM_READ_THIS,0,9,{77, 1,154,9,1}},
far GopItems= {MENU_X,MENU_Y+30,4,0,0,9,{77, 1,154,9,1}},
far SndItems= {SM_X,SM_Y,12,0,0,7, {87,-1,144,7,1}},
far LSItems= {LSM_X,LSM_Y,10,0,0,8, {86,-1,144,8,1}},
far CtlItems= {CTL_X,CTL_Y,7,-1,0,9, {87,1,174,9,1}},
far CusItems= {CST_X,CST_Y+7,6,-1,0,15,{54,-1,203,7,1}},
far NewEitems= {NE_X,NE_Y,11,0,0,16, {43,-2,119,16,1}},
far NewItems= {NM_X,NM_Y,4,1,0,16, {60,-2,105,16,1}},
far SwitchItems= {MENU_X,MENU_Y+25,4,0,0,9,{87,-1,132,7,1}};
#pragma warn -sus
CP_itemtype far MainMenu[]=
{
{AT_ENABLED,"NEW MISSION",CP_NewGame,COAL_FONT},
{AT_READIT,"ORDERING INFO",CP_OrderingInfo},
{AT_READIT,"INSTRUCTIONS",CP_ReadThis},
{AT_ENABLED,"STORY",CP_BlakeStoneSaga},
{AT_DISABLED,"",0},
{AT_ENABLED,"GAME OPTIONS",CP_GameOptions},
{AT_ENABLED,"HIGH SCORES",CP_ViewScores},
{AT_ENABLED,"LOAD MISSION",CP_LoadGame},
{AT_DISABLED,"SAVE MISSION",CP_SaveGame},
{AT_DISABLED,"",0},
{AT_ENABLED,"BACK TO DEMO",CP_ExitOptions},
{AT_ENABLED,"LOGOFF",0}
},
far GopMenu[]=
{
{AT_ENABLED,"SOUND",CP_Sound},
{AT_ENABLED,"CONTROLS",CP_Control},
{AT_ENABLED,"CHANGE VIEW",CP_ChangeView},
{AT_ENABLED,"SWITCHES",CP_Switches},
},
far SndMenu[]=
{
{AT_ENABLED,"NONE",0},
{AT_ENABLED,"PC SPEAKER",0},
{AT_ENABLED,"ADLIB/SOUND BLASTER",0},
{AT_DISABLED,"",0},
{AT_DISABLED,"",0},
{AT_ENABLED,"NONE",0},
{AT_ENABLED,"DISNEY SOUND SOURCE",0},
{AT_ENABLED,"SOUND BLASTER",0},
{AT_DISABLED,"",0},
{AT_DISABLED,"",0},
{AT_ENABLED,"NONE",0},
{AT_ENABLED,"ADLIB/SOUND BLASTER",0}
},
far CtlMenu[]=
{
{AT_DISABLED,"MOUSE ENABLED",0},
{AT_DISABLED,"JOYSTICK ENABLED",0},
{AT_DISABLED,"USE JOYSTICK PORT 2",0},
{AT_DISABLED,"GRAVIS GAMEPAD ENABLED",0},
{AT_DISABLED,"CALIBRATE JOYSTICK",0},
{AT_DISABLED,"MOUSE SENSITIVITY",MouseSensitivity},
{AT_ENABLED,"CUSTOMIZE CONTROLS",CustomControls}
},
far SwitchMenu[]=
{
{AT_ENABLED,"LIGHTING",0},
{AT_ENABLED,"REBA ATTACK INFO",0},
{AT_ENABLED,"SHOW CEILINGS",0},
{AT_ENABLED,"SHOW FLOORS",0}
},
#pragma warn +sus
#if 0
far NewEmenu[]=
{
{AT_ENABLED,"MISSION 1:\n"
"STAR INSTITUTE",0},
{AT_NON_SELECTABLE,"MISSION 2:\n"
"FLOATING FORTRESS",0},
{AT_NON_SELECTABLE,"MISSION 3:\n"
"UNDERGROUND NETWORK",0},
{AT_NON_SELECTABLE,"MISSION 4:\n"
"STAR PORT",0},
{AT_NON_SELECTABLE,"MISSION 5:\n"
"HABITAT II",0},
{AT_NON_SELECTABLE,"MISSION 6:\n"
"SATELLITE DEFENSE",0},
},
#endif
far NewMenu[]=
{
{AT_ENABLED,"LEVEL 1:\n"
"NOVICE AGENT",0},
{AT_ENABLED,"LEVEL 2:\n"
"SKILLED AGENT",0},
{AT_ENABLED,"LEVEL 3:\n"
"EXPERT AGENT",0},
{AT_ENABLED,"LEVEL 4:\n"
"VETERAN AGENT",0}
},
far LSMenu[]=
{
{AT_ENABLED,"",0},
{AT_ENABLED,"",0},
{AT_ENABLED,"",0},
{AT_ENABLED,"",0},
{AT_ENABLED,"",0},
{AT_ENABLED,"",0},
{AT_ENABLED,"",0},
{AT_ENABLED,"",0},
{AT_ENABLED,"",0},
{AT_ENABLED,"",0}
},
far CusMenu[]=
{
{AT_ENABLED,"",0},
{0,"",0},
{AT_ENABLED,"",0},
{0,"",0},
{AT_ENABLED,"",0},
{AT_ENABLED,"",0}
}
;
int color_hlite[]=
{
HIGHLIGHT_DISABLED_COLOR,
HIGHLIGHT_TEXT_COLOR,
READHCOLOR,
HIGHLIGHT_DEACTIAVED_COLOR,
};
int color_norml[]=
{
DISABLED_TEXT_COLOR,
ENABLED_TEXT_COLOR,
READCOLOR,
DEACTIAVED_TEXT_COLOR,
};
int EpisodeSelect[6]={1};
int SaveGamesAvail[10],StartGame,SoundStatus=1,pickquick;
char far SaveGameNames[10][GAME_DESCRIPTION_LEN+1],far SaveName[13]="SAVEGAM?.";
////////////////////////////////////////////////////////////////////
//
// INPUT MANAGER SCANCODE TABLES
//
////////////////////////////////////////////////////////////////////
#ifndef CACHE_KEY_DATA
static byte
far * far 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
},
far * far ExtScanNames[] = // Names corresponding to ExtScanCodes
{
"ESC","BKSP","TAB","CTRL","LSHFT","SPACE","CAPSLK","F1","F2","F3","F4",
"F5","F6","F7","F8","F9","F10","F11","F12","SCRLK","ENTER","RSHFT",
"PRTSC","ALT","HOME","PGUP","END","PGDN","INS","DEL","NUMLK","UP",
"DOWN","LEFT","RIGHT",""
};
#else
byte far *ScanNames, far * ExtScanNames;
ScanCode far *ExtScanCodes;
#endif
static byte special_keys[] =
{
sc_Tilde,sc_Plus,sc_Minus,sc_L,sc_P,sc_M,sc_S,sc_I,sc_Q,sc_W,sc_E,sc_Enter,sc_1,sc_2,sc_3,sc_4,sc_5,sc_Tab
};
//-------------------------------------------------------------------------
// HelpScreens()
//-------------------------------------------------------------------------
void HelpScreens()
{
#ifndef ID_CACHE_HELP
HelpPresenter("HELP.TXT",false,0,true);
#else
HelpPresenter(NULL,false,HELPTEXT,true);
#endif
}
//-------------------------------------------------------------------------
// HelpPresenter()
//-------------------------------------------------------------------------
void HelpPresenter(char *fname,boolean continue_keys, unsigned id_cache, boolean startmusic)
{
#define FULL_VIEW_WIDTH 19
PresenterInfo pi;
short oldwidth;
memset(&pi,0,sizeof(pi));
pi.flags = TPF_SHOW_PAGES;
if (continue_keys)
pi.flags |= TPF_CONTINUE;
VW_FadeOut();
// Change view size to MAX! (scaler clips shapes on smaller views)
//
oldwidth = viewwidth/16;
if (oldwidth != FULL_VIEW_WIDTH)
NewViewSize(FULL_VIEW_WIDTH);
// Draw help border
//
CacheLump(H_TOPWINDOWPIC,H_BOTTOMINFOPIC);
VWB_DrawPic (0,0,H_TOPWINDOWPIC);
VWB_DrawPic (0,8,H_LEFTWINDOWPIC);
VWB_DrawPic (312,8,H_RIGHTWINDOWPIC);
VWB_DrawPic (8,176,H_BOTTOMINFOPIC);
UnCacheLump(H_TOPWINDOWPIC,H_BOTTOMINFOPIC);
// Setup for text presenter
//
pi.xl=8;
pi.yl=8;
pi.xh=311;
pi.yh=175;
pi.ltcolor=0x7b;
pi.bgcolor=0x7d;
pi.dkcolor=0x7f;
pi.shcolor=0x00;
pi.fontnumber=4;
if (continue_keys)
pi.infoline = (char far *)" UP / DN - PAGES ENTER - CONTINUES ESC - EXITS";
else
pi.infoline = (char far *)" UP / DN - PAGES ESC - EXITS";
if (startmusic)
StartCPMusic(TEXTSONG);
// Load, present, and free help text.
//
TP_LoadScript(fname,&pi,id_cache);
TP_Presenter(&pi);
TP_FreeScript(&pi,id_cache);
MenuFadeOut();
// Reset view size
//
if (oldwidth != FULL_VIEW_WIDTH)
NewViewSize(oldwidth);
if (startmusic && TPscan==sc_Escape)
StartCPMusic(MENUSONG);
IN_ClearKeysDown();
}
//--------------------------------------------------------------------------
// US_ControlPanel() - Control Panel! Ta Da!
//--------------------------------------------------------------------------
void US_ControlPanel(byte scancode)
{
int which;
#ifdef CACHE_KEY_DATA
CA_CacheGrChunk(SCANNAMES_DATA);
CA_CacheGrChunk(EXTSCANNAMES_DATA);
CA_CacheGrChunk(EXTSCANCODES_DATA);
ScanNames = grsegs[SCANNAMES_DATA];
ExtScanNames = grsegs[EXTSCANNAMES_DATA];
ExtScanCodes = grsegs[EXTSCANCODES_DATA];
#else
//
// This code doesn't correctly save the table data -- it saves garbage
// for SCANNAMES and EXTSCANCODES...
//
// IO_WriteFile("SCANNAME.BIN",ScanNames,sizeof(ScanNames));
// IO_WriteFile("EXTSCNAM.BIN",ExtScanNames,sizeof(ExtScanNames));
// IO_WriteFile("EXTSCCOD.BIN",ExtScanCodes,sizeof(ExtScanCodes));
#endif
if (ingame)
if (CP_CheckQuick(scancode))
return;
SetupControlPanel();
StartCPMusic(MENUSONG);
//
// F-KEYS FROM WITHIN GAME
//
switch(scancode)
{
case sc_F1:
CleanupControlPanel();
HelpScreens();
return;
case sc_F2:
CP_SaveGame(0);
goto finishup;
case sc_F3:
CP_LoadGame(0);
// refresh_screen=false;
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();
return;
}
DrawMainMenu();
MenuFadeIn();
StartGame=0;
//
// MAIN MENU LOOP
//
do
{
which=HandleMenu(&MainItems,&MainMenu[0],NULL);
switch(which)
{
case MM_VIEW_SCORES:
if (MainMenu[MM_VIEW_SCORES].routine == NULL)
if (CP_EndGame())
StartGame=1;
DrawMainMenu();
MenuFadeIn();
break;
case -1:
case MM_LOGOFF:
CP_Quit();
break;
default:
if (!StartGame)
{
DrawMainMenu();
MenuFadeIn();
}
}
//
// "EXIT OPTIONS" OR "NEW GAME" EXITS
//
} while(!StartGame);
//
// DEALLOCATE EVERYTHING
//
CleanupControlPanel();
if (!loadedgame)
StopMusic();
//
// CHANGE MAINMENU ITEM
//
if (startgame || loadedgame)
{
#pragma warn -sus
MainMenu[MM_VIEW_SCORES].routine = NULL;
_fstrcpy(MainMenu[MM_VIEW_SCORES].string,"END GAME");
#pragma warn +sus
}
if (ingame && loadedgame)
refresh_screen=false;
#ifdef CACHE_KEY_DATA
FREEFONT(SCANNAMES_DATA);
FREEFONT(EXTSCANNAMES_DATA);
FREEFONT(EXTSCANCODES_DATA);
#endif
// RETURN/START GAME EXECUTION
}
//--------------------------------------------------------------------------
// DrawMainMenu(void)
//--------------------------------------------------------------------------
void DrawMainMenu(void)
{
ControlPanelFree();
CA_CacheScreen (BACKGROUND_SCREENPIC);
ControlPanelAlloc();
ClearMScreen();
DrawMenuTitle("MAIN OPTIONS");
DrawInstructions(IT_STANDARD);
//
// CHANGE "MISSION" AND "DEMO"
//
if (ingame)
{
_fstrcpy(&MainMenu[MM_BACK_TO_DEMO].string[8],"MISSION");
MainMenu[MM_BACK_TO_DEMO].active=AT_READIT;
}
else
{
_fstrcpy(&MainMenu[MM_BACK_TO_DEMO].string[8],"DEMO");
MainMenu[MM_BACK_TO_DEMO].active=AT_ENABLED;
}
fontnumber = 4; // COAL
DrawMenu(&MainItems,&MainMenu[0]);
VW_UpdateScreen();
}
//--------------------------------------------------------------------------
// READ THIS!
//--------------------------------------------------------------------------
void CP_ReadThis(void)
{
ControlPanelFree();
HelpScreens();
ControlPanelAlloc();
}
//--------------------------------------------------------------------------
// CP_OrderingInfo()
//--------------------------------------------------------------------------
void CP_OrderingInfo(void)
{
ControlPanelFree();
#ifndef ID_CACHE_HELP
HelpPresenter("ORDER.TXT",false,0,true);
#else
HelpPresenter(NULL,false,ORDERTEXT,true);
#endif
ControlPanelAlloc();
}
//-------------------------------------------------------------------------
// CP_BlakeStoneSaga()
//-------------------------------------------------------------------------
void CP_BlakeStoneSaga()
{
ControlPanelFree();
#ifndef ID_CACHE_HELP
HelpPresenter("SAGA.TXT",false,0,true);
#else
HelpPresenter(NULL,false,SAGATEXT,true);
#endif
ControlPanelAlloc();
}
//--------------------------------------------------------------------------
// CP_CheckQuick() - CHECK QUICK-KEYS & QUIT (WHILE IN A GAME)
//--------------------------------------------------------------------------
int CP_CheckQuick(unsigned scancode)
{
switch(scancode)
{
// END GAME
//
case sc_F7:
VW_ScreenToScreen (displayofs,bufferofs,80,160);
CA_CacheGrChunk(STARTFONT+1);
WindowH=160;
if (Confirm(ENDGAMESTR))
{
playstate = ex_died;
pickquick = gamestate.lives = 0;
}
WindowH=200;
fontnumber=4;
return(1);
// QUICKSAVE
//
case sc_F8:
if (SaveGamesAvail[LSItems.curpos] && pickquick)
{
char string[100]="Quick Save will overwrite:\n\"";
CA_CacheGrChunk(STARTFONT+1);
_fstrcat(string,SaveGameNames[LSItems.curpos]);
strcat(string,"\"?");
VW_ScreenToScreen (displayofs,bufferofs,80,160);
#if IN_DEVELOPMENT
if (TestQuickSave || Confirm(string))
{
if (TestQuickSave)
TestQuickSave--;
#else
if (Confirm(string))
{
#endif
CA_CacheGrChunk(STARTFONT+1);
CP_SaveGame(1);
fontnumber=4;
}
else
refresh_screen=false;
}
else
{
CA_CacheGrChunk(STARTFONT+1);
VW_FadeOut ();
StartCPMusic(MENUSONG);
pickquick=CP_SaveGame(0);
lasttimecount = TimeCount;
if (MousePresent)
Mouse(MDelta); // Clear accumulated mouse movement
}
return(1);
// QUICKLOAD
//
case sc_F9:
if (SaveGamesAvail[LSItems.curpos] && pickquick)
{
char string[100]="Quick Load:\n\"";
CA_CacheGrChunk(STARTFONT+1);
_fstrcat(string,SaveGameNames[LSItems.curpos]);
strcat(string,"\"?");
VW_ScreenToScreen (displayofs,bufferofs,80,160);
if (Confirm(string))
CP_LoadGame(1);
else
{
refresh_screen=false;
return(1);
}
fontnumber=4;
}
else
{
CA_CacheGrChunk(STARTFONT+1);
VW_FadeOut ();
StartCPMusic(MENUSONG);
pickquick=CP_LoadGame(0);
lasttimecount = TimeCount;
if (MousePresent)
Mouse(MDelta); // Clear accumulated mouse movement
PM_CheckMainMem ();
}
if (pickquick)
refresh_screen=false;
return(1);
// QUIT
//
case sc_F10:
CA_CacheGrChunk(STARTFONT+1);
VW_ScreenToScreen (displayofs,bufferofs,80,160);
WindowX=WindowY=0;
WindowW=320;
WindowH=160;
if (Confirm(QuitToDosStr))
ExitGame();
refresh_screen=false;
WindowH=200;
fontnumber=4;
return(1);
}
return(0);
}
//--------------------------------------------------------------------------
// END THE CURRENT GAME
//--------------------------------------------------------------------------
int CP_EndGame(void)
{
if (!Confirm(ENDGAMESTR))
return 0;
pickquick = gamestate.lives = 0;
playstate = ex_died;
InstantQuit = 1;
#if 0
#pragma warn -sus
MainMenu[MM_VIEW_SCORES].routine=&CP_ViewScores;
_fstrcpy(MainMenu[MM_VIEW_SCORES].string,"HIGH SCORES");
#pragma warn +sus
#endif
return 1;
}
//--------------------------------------------------------------------------
// CP_ViewScores() - VIEW THE HIGH SCORES
//--------------------------------------------------------------------------
void CP_ViewScores(void)
{
fontnumber=4;
StartCPMusic(ROSTER_MUS);
DrawHighScores ();
VW_UpdateScreen ();
MenuFadeIn();
fontnumber=1;
IN_Ack();
StartCPMusic(MENUSONG);
MenuFadeOut();
}
//--------------------------------------------------------------------------
// CP_NewGame() - START A NEW GAME
//--------------------------------------------------------------------------
void CP_NewGame(void)
{
int which,episode;
DrawMenuTitle("Difficulty Level");
DrawInstructions(IT_STANDARD);
#if 0
firstpart:
DrawNewEpisode();
do
{
which=HandleMenu(&NewEitems,&NewEmenu[0],DrawEpisodePic);
switch(which)
{
case -1:
MenuFadeOut();
return;
default:
if (!EpisodeSelect[which])
{
SD_PlaySound (NOWAYSND);
CacheMessage(READTHIS_TEXT);
IN_ClearKeysDown();
IN_Ack();
VL_Bar(35,69,250,62,TERM_BACK_COLOR);
DrawNewEpisode();
which = 0;
}
else
{
episode = which;
which = 1;
}
break;
}
} while (!which);
ShootSnd();
#else
episode = 0;
#endif
#if 0
//
// ALREADY IN A GAME?
//
if (ingame)
if (!Confirm(CURGAME))
{
MenuFadeOut();
return;
}
#endif
secondpart:
MenuFadeOut();
if (ingame)
CA_CacheScreen(BACKGROUND_SCREENPIC);
DrawNewGame();
which=HandleMenu(&NewItems,&NewMenu[0],DrawNewGameDiff);
if (which<0)
{
MenuFadeOut();
#if 0
goto firstpart;
#else
return;
#endif
}
ShootSnd();
MenuFadeOut();
ControlPanelFree();
if (Breifing(BT_INTRO,episode))
{
CA_CacheScreen (BACKGROUND_SCREENPIC);
ControlPanelAlloc();
goto secondpart;
}
StartGame=1;
NewGame(which,episode);
//
// CHANGE "READ THIS!" TO NORMAL COLOR
//
MainMenu[MM_READ_THIS].active=AT_ENABLED;
}
//---------------------------------------------------------------------------
// DrawMenuTitle() - Draws the menu title
//---------------------------------------------------------------------------
void DrawMenuTitle(char *title)
{
fontnumber = 3;
CA_CacheGrChunk(STARTFONT+3);
PrintX = WindowX = 32;
PrintY = WindowY = 32;
WindowW = 244;
WindowH = 20;
SETFONTCOLOR(TERM_SHADOW_COLOR,TERM_BACK_COLOR);
US_PrintCentered(title);
WindowX = 32-1;
WindowY = 32-1;
SETFONTCOLOR(ENABLED_TEXT_COLOR,TERM_BACK_COLOR);
US_PrintCentered(title);
FREEFONT(STARTFONT+3);
}
//---------------------------------------------------------------------------
// DrawInstructions() - Draws instructions centered at the bottom of
// the view screen.
//
// NOTES: Orginal font number or font color is not maintained.
//---------------------------------------------------------------------------
void DrawInstructions(inst_type Type)
{
#define INSTRUCTIONS_Y_POS 154+10
char *instr[MAX_INSTRUCTIONS] = {{"UP/DN SELECTS - ENTER CHOOSES - ESC EXITS"},
{"PRESS ANY KEY TO CONTINUE"},
{"ENTER YOUR NAME AND PRESS ENTER"},
{"RT/LF ARROW SELECTS - ENTER CHOOSES"}};
fontnumber = 2;
WindowX = 48;
WindowY = INSTRUCTIONS_Y_POS;
WindowW = 236;
WindowH = 8;
VWB_Bar(WindowX,WindowY-1,WindowW,WindowH,TERM_BACK_COLOR);
SETFONTCOLOR(TERM_SHADOW_COLOR,TERM_BACK_COLOR);
US_PrintCentered(instr[Type]);
WindowX--;
WindowY--;
SETFONTCOLOR(INSTRUCTIONS_TEXT_COLOR,TERM_BACK_COLOR);
US_PrintCentered(instr[Type]);
}
#if 0
//--------------------------------------------------------------------------
// DrawNewEpisode() - DRAW NEW EPISODE MENU
//--------------------------------------------------------------------------
void DrawNewEpisode(void)
{
ClearMScreen();
DrawMenuTitle("CHOOSE A MISSION");
DrawInstructions(IT_STANDARD);
PrintY=51;
WindowX=58;
fontnumber = 2; // six point font
DrawMenu(&NewEitems,&NewEmenu7[0]);
DrawEpisodePic(NewEitems.curpos);
VW_UpdateScreen();
MenuFadeIn();
WaitKeyUp();
}
#endif
//--------------------------------------------------------------------------
// DrawNewGame() - DRAW NEW GAME MENU
//--------------------------------------------------------------------------
void DrawNewGame(void)
{
ClearMScreen();
DrawMenuTitle("DIFFICULTY LEVEL");
DrawInstructions(IT_STANDARD);
fontnumber = 2; // six point font
DrawMenu(&NewItems,&NewMenu[0]);
DrawNewGameDiff(NewItems.curpos);
px=48;
py=INSTRUCTIONS_Y_POS-24;
ShPrint(" HIGHER DIFFICULTY LEVELS CONTAIN",TERM_SHADOW_COLOR,false);
px=48;
py+=6;
ShPrint(" MORE, STRONGER ENEMIES",TERM_SHADOW_COLOR,false);
VW_UpdateScreen();
MenuFadeIn();
WaitKeyUp();
}
//--------------------------------------------------------------------------
// DRAW NEW GAME GRAPHIC
//--------------------------------------------------------------------------
void DrawNewGameDiff(int w)
{
VWB_DrawPic(192,77,w+C_BABYMODEPIC);
}
//--------------------------------------------------------------------------
// DRAW NEW GAME GRAPHIC
//--------------------------------------------------------------------------
void DrawEpisodePic(int w)
{
VWB_DrawPic(176,72,w+C_EPISODE1PIC);
}
//--------------------------------------------------------------------------
// CP_GameOptions() - DRAW THE GAME OPTIONS MENU
//--------------------------------------------------------------------------
void CP_GameOptions(void)
{
int which,i;
CA_CacheScreen (BACKGROUND_SCREENPIC);
DrawGopMenu();
MenuFadeIn();
WaitKeyUp();
do
{
which=HandleMenu(&GopItems,&GopMenu[0],NULL);
if (which != -1)
{
DrawGopMenu();
MenuFadeIn();
}
} while(which>=0);
MenuFadeOut();
}
//--------------------------------------------------------------------------
// DrawGopMenu(void)
//--------------------------------------------------------------------------
void DrawGopMenu(void)
{
CA_CacheScreen (BACKGROUND_SCREENPIC);
ClearMScreen();
DrawMenuTitle("GAME OPTIONS");
DrawInstructions(IT_STANDARD);
fontnumber = 4; // COAL
DrawMenu(&GopItems,&GopMenu[0]);
VW_UpdateScreen();
}
void ChangeSwaps(void)
{
WindowX=WindowY=0;
WindowW=320;
WindowH=200;
Message(Computing);
PM_Shutdown();
PM_Startup ();
ClearMemory();
ControlPanelAlloc();
IN_UserInput(50);
IN_ClearKeysDown();
}
//--------------------------------------------------------------------------
// GAME SWITCHES MENU
//--------------------------------------------------------------------------
void CP_Switches(void)
{
int which,i;
CA_CacheScreen (BACKGROUND_SCREENPIC);
DrawSwitchMenu();
MenuFadeIn();
WaitKeyUp();
do
{
which=HandleMenu(&SwitchItems,&SwitchMenu[0],DrawAllSwitchLights);
switch (which)
{
case SW_LIGHTING:
gamestate.flags ^= GS_LIGHTING;
ShootSnd();
DrawSwitchMenu();
break;
case SW_REBA_ATTACK_INFO:
gamestate.flags ^= GS_ATTACK_INFOAREA;
ShootSnd();
DrawSwitchMenu();
break;
case SW_CEILING:
gamestate.flags ^= GS_DRAW_CEILING;
ShootSnd();
DrawSwitchMenu();
break;
case SW_FLOORS:
gamestate.flags ^= GS_DRAW_FLOOR;
ShootSnd();
DrawSwitchMenu();
break;
}
} while(which>=0);
MenuFadeOut();
}
//--------------------------------------------------------------------------
// DrawSwitchMenu(void)
//--------------------------------------------------------------------------
void DrawSwitchMenu(void)
{
CA_CacheScreen (BACKGROUND_SCREENPIC);
ClearMScreen();
DrawMenuTitle("GAME SWITCHES");
DrawInstructions(IT_STANDARD);
fontnumber = 2;
DrawMenu(&SwitchItems,&SwitchMenu[0]);
DrawAllSwitchLights(SwitchItems.curpos);
VW_UpdateScreen();
}
//--------------------------------------------------------------------------
// DrawAllSwitchLights()
//--------------------------------------------------------------------------
void DrawAllSwitchLights(int which)
{
short i;
unsigned Shape;
for (i=0;i<SwitchItems.amount;i++)
if (SwitchMenu[i].string[0])
{
Shape = C_NOTSELECTEDPIC;
//
// DRAW SELECTED/NOT SELECTED GRAPHIC BUTTONS
//
if (SwitchItems.cursor.on)
if (i == which) // Is the cursor sitting on this pic?
Shape +=2;
switch(i)
{
case SW_LIGHTING:
if (gamestate.flags & GS_LIGHTING)
Shape++;
break;
case SW_REBA_ATTACK_INFO:
if (gamestate.flags & GS_ATTACK_INFOAREA)
Shape++;
break;
case SW_CEILING:
if (gamestate.flags & GS_DRAW_CEILING)
Shape++;
break;
case SW_FLOORS:
if (gamestate.flags & GS_DRAW_FLOOR)
Shape++;
break;
}
VWB_DrawPic(SwitchItems.x-16,SwitchItems.y+i*SwitchItems.y_spacing-1,Shape);
}
DrawSwitchDescription(which);
}
//--------------------------------------------------------------------------
// DrawSwitchDescription()
//--------------------------------------------------------------------------
void DrawSwitchDescription(int which)
{
#define DESCRIPTIONS_Y_POS 134
char *instr[] = {{"TOGGLES LIGHT SOURCING IN HALLWAYS"},
{"TOGGLES DETAILED ATTACKER INFO"},
{"TOGGLES CEILING MAPPING"},
{"TOGGLES FLOOR MAPPING"}};
fontnumber = 2;
WindowX = 48;
WindowY = DESCRIPTIONS_Y_POS;
WindowW = 236;
WindowH = 8;
VWB_Bar(WindowX,WindowY-1,WindowW,WindowH,TERM_BACK_COLOR);
SETFONTCOLOR(TERM_SHADOW_COLOR,TERM_BACK_COLOR);
US_PrintCentered(instr[which]);
WindowX--;
WindowY--;
SETFONTCOLOR(INSTRUCTIONS_TEXT_COLOR,TERM_BACK_COLOR);
US_PrintCentered(instr[which]);
}
//--------------------------------------------------------------------------
// HANDLE SOUND MENU
//--------------------------------------------------------------------------
void CP_Sound(void)
{
int which,i;
CA_CacheScreen (BACKGROUND_SCREENPIC);
DrawSoundMenu();
MenuFadeIn();
WaitKeyUp();
do
{
which=HandleMenu(&SndItems,&SndMenu[0],DrawAllSoundLights);
//
// HANDLE MENU CHOICES
//
switch(which)
{
//
// SOUND EFFECTS
//
case 0:
if (SoundMode!=sdm_Off)
{
SD_WaitSoundDone();
SD_SetSoundMode(sdm_Off);
SD_SetDigiDevice(sds_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)
{
if (SoundMode==sdm_Off)
SD_SetSoundMode(sdm_PC);
SD_SetDigiDevice(sds_SoundSource);
CA_LoadAllSounds();
DrawSoundMenu();
ShootSnd();
}
break;
case 7:
if (DigiMode!=sds_SoundBlaster)
{
if (SoundMode==sdm_Off)
SD_SetSoundMode(sdm_PC);
SD_SetDigiDevice(sds_SoundBlaster);
CA_LoadAllSounds();
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();
}
//--------------------------------------------------------------------------
// DrawSoundMenu() - DRAW THE SOUND MENU
//--------------------------------------------------------------------------
void DrawSoundMenu(void)
{
int i,on;
//
// DRAW SOUND MENU
//
ClearMScreen();
DrawMenuTitle("SOUND SETTINGS");
DrawInstructions(IT_STANDARD);
//
// IF NO ADLIB, NON-CHOOSENESS!
//
if (!AdLibPresent && !SoundBlasterPresent)
{
SndMenu[2].active=SndMenu[10].active=SndMenu[11].active=AT_DISABLED;
}
if (!SoundSourcePresent)
SndMenu[6].active=AT_DISABLED;
if (!SoundBlasterPresent)
SndMenu[7].active=AT_DISABLED;
if (!SoundSourcePresent && !SoundBlasterPresent)
SndMenu[5].active=AT_DISABLED;
fontnumber = 4;
SETFONTCOLOR(DISABLED_TEXT_COLOR,TERM_BACK_COLOR);
ShadowPrint("SOUND EFFECTS",105,52);
ShadowPrint("DIGITIZED SOUNDS",105,87);
ShadowPrint("BACKGROUND MUSIC",105,121);
fontnumber = 2;
DrawMenu(&SndItems,&SndMenu[0]);
DrawAllSoundLights(SndItems.curpos);
VW_UpdateScreen();
}
//--------------------------------------------------------------------------
// DrawAllSoundLights()
//--------------------------------------------------------------------------
void DrawAllSoundLights(int which)
{
short i;
unsigned Shape;
for (i=0;i<SndItems.amount;i++)
if (SndMenu[i].string[0])
{
Shape = C_NOTSELECTEDPIC;
//
// DRAW SELECTED/NOT SELECTED GRAPHIC BUTTONS
//
if (SndItems.cursor.on)
if (i == which) // Is the cursor sitting on this pic?
Shape +=2;
switch(i)
{
//
// SOUND EFFECTS
//
case 0: if (SoundMode==sdm_Off) Shape++; break;
case 1: if (SoundMode==sdm_PC) Shape++; break;
case 2: if (SoundMode==sdm_AdLib) Shape++; break;
//
// DIGITIZED SOUND
//
case 5: if (DigiMode==sds_Off) Shape++; break;
case 6: if (DigiMode==sds_SoundSource) Shape++; break;
case 7: if (DigiMode==sds_SoundBlaster) Shape++; break;
//
// MUSIC
//
case 10: if (MusicMode==smm_Off) Shape++; break;
case 11: if (MusicMode==smm_AdLib) Shape++; break;
}
VWB_DrawPic(SndItems.x-16,SndItems.y+i*SndItems.y_spacing-1,Shape);
}
}
char far LOADSAVE_GAME_MSG[2][25]={"^ST1^CELoading Game\r^XX",
"^ST1^CESaving Game\r^XX"};
extern char LS_current,LS_total;
//--------------------------------------------------------------------------
// DrawLSAction() - DRAW LOAD/SAVE IN PROGRESS
//--------------------------------------------------------------------------
void DrawLSAction(int which)
{
char total[]={19,19};
VW_FadeOut();
screenfaded = true;
DrawTopInfo(sp_loading+which);
DrawPlayBorder();
DisplayPrepingMsg(LOADSAVE_GAME_MSG[which]);
if (which)
PreloadUpdate(1,1); // GFX: bar is full when saving...
LS_current=1;
LS_total=total[which];
WindowY = 181;
}
//--------------------------------------------------------------------------
// CP_LoadGame() - LOAD SAVED GAMES
//--------------------------------------------------------------------------
int CP_LoadGame(int quick)
{
int handle,which,exit=0;
char name[13];
_fstrcpy(name,SaveName);
//
// QUICKLOAD?
//
if (quick)
{
which=LSItems.curpos;
if (SaveGamesAvail[which])
{
name[7]=which+'0';
MakeDestPath(name);
handle=open(tempPath,O_RDONLY | O_BINARY);
DrawLSAction(0); // Testing...
if (!(loadedgame=LoadTheGame(handle)))
{
LS_current = -1; // clean up
}
close(handle);
return(loadedgame);
}
}
restart:
;
DrawLoadSaveScreen(0);
do
{
which=HandleMenu(&LSItems,&LSMenu[0],TrackWhichGame);
if (which>=0 && SaveGamesAvail[which])
{
ShootSnd();
name[7]=which+'0';
MakeDestPath(name);
handle=open(tempPath,O_RDONLY | O_BINARY);
DrawLSAction(0);
if (!LoadTheGame(handle))
{
exit = StartGame = loadedgame = 0;
LS_current = -1; // Clean up
goto restart;
}
close(handle);
loadedgame = StartGame= true;
ShootSnd();
//
// CHANGE "READ THIS!" TO NORMAL COLOR
//
MainMenu[MM_READ_THIS].active=AT_ENABLED;
exit=1;
break;
}
} while(which>=0);
if (which==-1)
MenuFadeOut();
if (loadedgame)
refresh_screen=false;
return exit;
}
///////////////////////////////////
//
// HIGHLIGHT CURRENT SELECTED ENTRY
//
void TrackWhichGame(int w)
{
static int lastgameon=0;
PrintLSEntry(lastgameon,ENABLED_TEXT_COLOR);
PrintLSEntry(w,HIGHLIGHT_TEXT_COLOR);
lastgameon=w;
}
//--------------------------------------------------------------------------
// DRAW THE LOAD/SAVE SCREEN
//--------------------------------------------------------------------------
void DrawLoadSaveScreen(int loadsave)
{
#define DISKX 100
#define DISKY 0
int i;
CA_CacheScreen (BACKGROUND_SCREENPIC);
ClearMScreen();
fontnumber=1;
if (!loadsave)
DrawMenuTitle("Load Mission");
else
DrawMenuTitle("Save Mission");
DrawInstructions(IT_STANDARD);
for (i=0;i<10;i++)
PrintLSEntry(i,ENABLED_TEXT_COLOR);
fontnumber = 4;
DrawMenu(&LSItems,&LSMenu[0]);
VW_UpdateScreen();
MenuFadeIn();
WaitKeyUp();
}
//--------------------------------------------------------------------------
// PRINT LOAD/SAVE GAME ENTRY W/BOX OUTLINE
//--------------------------------------------------------------------------
void PrintLSEntry(int w,int color)
{
char buff[4];
SETFONTCOLOR(color,BKGDCOLOR);
DrawOutline(LSM_X+LSItems.indent,LSM_Y+w*LSItems.y_spacing-2,LSM_W-LSItems.indent,8,color,color);
fontnumber=2;
PrintX=LSM_X+LSItems.indent+2;
PrintY=LSM_Y+w*LSItems.y_spacing;
if (SaveGamesAvail[w])
US_Print(SaveGameNames[w]);
else
US_Print(" ----- EMPTY -----");
fontnumber=1;
}
//--------------------------------------------------------------------------
// SAVE CURRENT GAME
//--------------------------------------------------------------------------
int CP_SaveGame(int quick)
{
int handle,which,exit=0;
unsigned nwritten;
char name[13],input[GAME_DESCRIPTION_LEN+1];
boolean temp_caps = allcaps;
US_CursorStruct TermCursor = {'@',0,HIGHLIGHT_TEXT_COLOR,2};
_fstrcpy(name,SaveName);
allcaps = true;
use_custom_cursor = true;
US_CustomCursor = TermCursor;
//
// QUICKSAVE?
//
if (quick)
{
which=LSItems.curpos;
if (SaveGamesAvail[which])
{
DrawLSAction(1); // Testing...
name[7]=which+'0';
unlink(name);
_fmode=O_BINARY;
MakeDestPath(name);
handle=creat(tempPath,S_IREAD|S_IWRITE);
lseek(handle,0,SEEK_SET);
SaveTheGame(handle,&SaveGameNames[which][0]);
close(handle);
return 1;
}
}
DrawLoadSaveScreen(1);
do
{
which=HandleMenu(&LSItems,&LSMenu[0],TrackWhichGame);
if (which>=0)
{
//
// OVERWRITE EXISTING SAVEGAME?
//
if (SaveGamesAvail[which])
if (!Confirm(GAMESVD))
{
DrawLoadSaveScreen(1);
continue;
}
else
{
DrawLoadSaveScreen(1);
PrintLSEntry(which,HIGHLIGHT_TEXT_COLOR);
VW_UpdateScreen();
}
ShootSnd();
_fstrcpy(input,&SaveGameNames[which][0]);
name[7]=which+'0';
fontnumber=2;
VWB_Bar(LSM_X+LSItems.indent+1,LSM_Y+which*LSItems.y_spacing-1,LSM_W-LSItems.indent-1,7,HIGHLIGHT_BOX_COLOR);
SETFONTCOLOR(HIGHLIGHT_TEXT_COLOR,HIGHLIGHT_BOX_COLOR);
VW_UpdateScreen();
if (US_LineInput(LSM_X+LSItems.indent+2,LSM_Y+which*LSItems.y_spacing,input,input,true,GAME_DESCRIPTION_LEN,LSM_W-LSItems.indent-10))
{
SaveGamesAvail[which]=1;
_fstrcpy(&SaveGameNames[which][0],input);
unlink(name);
_fmode=O_BINARY;
MakeDestPath(name);
handle=creat(tempPath,S_IREAD|S_IWRITE);
lseek(handle,0,SEEK_SET);
DrawLSAction(1);
SaveTheGame(handle,input);
close(handle);
ShootSnd();
exit=1;
}
else
{
VWB_Bar(LSM_X+LSItems.indent+1,LSM_Y+which*LSItems.y_spacing-1,LSM_W-LSItems.indent-1,7,TERM_BACK_COLOR);
PrintLSEntry(which,HIGHLIGHT_TEXT_COLOR);
VW_UpdateScreen();
SD_PlaySound(ESCPRESSEDSND);
continue;
}
fontnumber=1;
break;
}
} while(which>=0);
MenuFadeOut();
use_custom_cursor = false;
allcaps = temp_caps;
return exit;
}
//--------------------------------------------------------------------------
// EXIT OPTIONS
//--------------------------------------------------------------------------
void CP_ExitOptions(void)
{
StartGame=1;
}
//--------------------------------------------------------------------------
// DEFINE CONTROLS
//--------------------------------------------------------------------------
void CP_Control(void)
{
enum {MOUSEENABLE,JOYENABLE,USEPORT2,PADENABLE,CALIBRATEJOY,MOUSESENS,CUSTOMIZE};
int i,which;
CA_CacheScreen (BACKGROUND_SCREENPIC);
DrawCtlScreen();
MenuFadeIn();
WaitKeyUp();
do
{
which=HandleMenu(&CtlItems,&CtlMenu[0],NULL);
switch(which)
{
case MOUSEENABLE:
mouseenabled^=1;
_CX=_DX=CENTER;
Mouse(4);
DrawCtlScreen();
CusItems.curpos=-1;
ShootSnd();
break;
case JOYENABLE:
joystickenabled^=1;
if (joystickenabled)
CalibrateJoystick();
DrawCtlScreen();
CusItems.curpos=-1;
ShootSnd();
break;
case USEPORT2:
joystickport^=1;
DrawCtlScreen();
ShootSnd();
break;
case PADENABLE:
joypadenabled^=1;
DrawCtlScreen();
ShootSnd();
break;
case CALIBRATEJOY:
CalibrateJoystick();
DrawCtlScreen();
break;
case MOUSESENS:
case CUSTOMIZE:
DrawCtlScreen();
MenuFadeIn();
WaitKeyUp();
break;
}
} while(which>=0);
MenuFadeOut();
}
//--------------------------------------------------------------------------
// DRAW MOUSE SENSITIVITY SCREEN
//--------------------------------------------------------------------------
void DrawMousePos(void)
{
VWB_Bar(74,92,160,8,HIGHLIGHT_BOX_COLOR);
DrawOutline(73,91,161,9,ENABLED_TEXT_COLOR,ENABLED_TEXT_COLOR);
VWB_Bar(74+160/10*mouseadjustment,92,16,8,HIGHLIGHT_TEXT_COLOR);
}
void DrawMouseSens(void)
{
ClearMScreen();
DrawMenuTitle("MOUSE SENSITIVITY");
DrawInstructions(IT_MOUSE_SEN);
fontnumber = 4;
SETFONTCOLOR(HIGHLIGHT_TEXT_COLOR,TERM_BACK_COLOR);
PrintX=36;
PrintY=91;
US_Print("SLOW");
PrintX=242;
US_Print("FAST");
DrawMousePos();
VW_UpdateScreen();
MenuFadeIn();
}
//--------------------------------------------------------------------------
// CalibrateJoystick()
//--------------------------------------------------------------------------
void CalibrateJoystick(void)
{
word minx,maxx,miny,maxy;
CacheMessage(CALJOY1_TEXT);
VW_UpdateScreen();
while (IN_GetJoyButtonsDB(joystickport));
while ((LastScan != sc_Escape) && !IN_GetJoyButtonsDB(joystickport));
if (LastScan == sc_Escape)
return;
IN_GetJoyAbs(joystickport,&minx,&miny);
while (IN_GetJoyButtonsDB(joystickport));
CacheMessage(CALJOY2_TEXT);
VW_UpdateScreen();
while ((LastScan != sc_Escape) && !IN_GetJoyButtonsDB(joystickport));
if (LastScan == sc_Escape)
return;
IN_GetJoyAbs(joystickport,&maxx,&maxy);
if ((minx == maxx) || (miny == maxy))
return;
IN_SetupJoy(joystickport,minx,maxx,miny,maxy);
while (IN_GetJoyButtonsDB(joystickport));
IN_ClearKeysDown();
JoystickCalibrated = true;
}
//--------------------------------------------------------------------------
// ADJUST MOUSE SENSITIVITY
//--------------------------------------------------------------------------
void MouseSensitivity(void)
{
ControlInfo ci;
int exit=0,oldMA;
oldMA=mouseadjustment;
DrawMouseSens();
do
{
ReadAnyControl(&ci);
switch(ci.dir)
{
case dir_North:
case dir_West:
if (mouseadjustment)
{
mouseadjustment--;
DrawMousePos();
VW_UpdateScreen();
SD_PlaySound(MOVEGUN1SND);
while(Keyboard[sc_LeftArrow]);
WaitKeyUp();
}
break;
case dir_South:
case dir_East:
if (mouseadjustment<9)
{
mouseadjustment++;
DrawMousePos();
VW_UpdateScreen();
SD_PlaySound(MOVEGUN1SND);
while(Keyboard[sc_RightArrow]);
WaitKeyUp();
}
break;
}
if (ci.button0 || Keyboard[sc_Space] || Keyboard[sc_Enter])
exit=1;
else
if (ci.button1 || Keyboard[sc_Escape])
exit=2;
} while(!exit);
if (exit==2)
{
mouseadjustment=oldMA;
SD_PlaySound(ESCPRESSEDSND);
}
else
SD_PlaySound(SHOOTSND);
WaitKeyUp();
MenuFadeOut();
}
//--------------------------------------------------------------------------
// DrawCtlScreen() - DRAW CONTROL MENU SCREEN
//--------------------------------------------------------------------------
void DrawCtlScreen(void)
{
#define Y_CTL_PIC_OFS (3)
int i,x,y;
ClearMScreen();
DrawMenuTitle("CONTROL");
DrawInstructions(IT_STANDARD);
WindowX=0;
WindowW=320;
SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
if (JoysPresent[0])
CtlMenu[1].active=
CtlMenu[2].active=
CtlMenu[3].active=
CtlMenu[4].active=AT_ENABLED;
CtlMenu[2].active=CtlMenu[3].active=CtlMenu[4].active=joystickenabled;
if (MousePresent)
{
CtlMenu[5].active=
CtlMenu[0].active=AT_ENABLED;
}
CtlMenu[5].active=mouseenabled;
fontnumber = 4;
DrawMenu(&CtlItems,&CtlMenu[0]);
x=CTL_X+CtlItems.indent-24;
y=CTL_Y+Y_CTL_PIC_OFS;
if (mouseenabled)
VWB_DrawPic(x,y,C_SELECTEDPIC);
else
VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
y=CTL_Y+9+Y_CTL_PIC_OFS;
if (joystickenabled)
VWB_DrawPic(x,y,C_SELECTEDPIC);
else
VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
y=CTL_Y+9*2+Y_CTL_PIC_OFS;
if (joystickport)
VWB_DrawPic(x,y,C_SELECTEDPIC);
else
VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
y=CTL_Y+9*3+Y_CTL_PIC_OFS;
if (joypadenabled)
VWB_DrawPic(x,y,C_SELECTEDPIC);
else
VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
//
// PICK FIRST AVAILABLE SPOT
//
if (CtlItems.curpos<0 || !CtlMenu[CtlItems.curpos].active)
for (i=0;i<6;i++)
if (CtlMenu[i].active)
{
CtlItems.curpos=i;
break;
}
DrawMenuGun(&CtlItems);
VW_UpdateScreen();
}
enum {FIRE,STRAFE,RUN,OPEN};
char mbarray[4][3]={"B0","B1","B2","B3"},
order[4]={RUN,OPEN,FIRE,STRAFE};
//--------------------------------------------------------------------------
// CustomControls() CUSTOMIZE CONTROLS
//--------------------------------------------------------------------------
void CustomControls(void)
{
int which;
DrawCustomScreen();
do
{
which=HandleMenu(&CusItems,&CusMenu[0],FixupCustom);
switch(which)
{
case 0:
DefineMouseBtns();
DrawCustMouse(1);
break;
case 2:
DefineJoyBtns();
DrawCustJoy(0);
break;
case 4:
DefineKeyBtns();
DrawCustKeybd(0);
break;
case 5:
DefineKeyMove();
DrawCustKeys(0);
}
} while(which>=0);
MenuFadeOut();
}
//--------------------------------------------------------------------------
// DEFINE THE MOUSE BUTTONS
//--------------------------------------------------------------------------
void DefineMouseBtns(void)
{
CustomCtrls mouseallowed={1,1,1,1};
EnterCtrlData(2,&mouseallowed,DrawCustMouse,PrintCustMouse,MOUSE);
}
//--------------------------------------------------------------------------
// DEFINE THE JOYSTICK BUTTONS
//--------------------------------------------------------------------------
void DefineJoyBtns(void)
{
CustomCtrls joyallowed={1,1,1,1};
EnterCtrlData(5,&joyallowed,DrawCustJoy,PrintCustJoy,JOYSTICK);
}
//--------------------------------------------------------------------------
// DEFINE THE KEYBOARD BUTTONS
//--------------------------------------------------------------------------
void DefineKeyBtns(void)
{
CustomCtrls keyallowed={1,1,1,1};
EnterCtrlData(8,&keyallowed,DrawCustKeybd,PrintCustKeybd,KEYBOARDBTNS);
}
//--------------------------------------------------------------------------
// DEFINE THE KEYBOARD BUTTONS
//--------------------------------------------------------------------------
void DefineKeyMove(void)
{
CustomCtrls keyallowed={1,1,1,1};
EnterCtrlData(10,&keyallowed,DrawCustKeys,PrintCustKeys,KEYBOARDMOVE);
}
//--------------------------------------------------------------------------
// TestForValidKey
//--------------------------------------------------------------------------
boolean TestForValidKey(ScanCode Scan)
{
char far *pos;
#pragma warn -pia
if (!(pos = _fmemchr(buttonscan,Scan,sizeof(buttonscan))))
pos = _fmemchr(dirscan,Scan,sizeof(dirscan));
#pragma warn +pia
if (pos)
{
*pos = sc_None;
SD_PlaySound(SHOOTDOORSND);
DrawCustomScreen();
}
return(!(boolean)pos);
}
//--------------------------------------------------------------------------
// EnterCtrlData() - ENTER CONTROL DATA FOR ANY TYPE OF CONTROL
//--------------------------------------------------------------------------
enum {FWRD,RIGHT,BKWD,LEFT};
int moveorder[4]={LEFT,RIGHT,FWRD,BKWD};
void EnterCtrlData(int index,CustomCtrls *cust,void (*DrawRtn)(int),void (*PrintRtn)(int),int type)
{
int j,exit,tick,redraw,which,x,picked;
ControlInfo ci;
boolean clean_display = true;
ShootSnd();
PrintY=CST_Y+13*index;
IN_ClearKeysDown();
exit=0;
redraw=1;
CA_CacheGrChunk(STARTFONT+fontnumber);
//
// FIND FIRST SPOT IN ALLOWED ARRAY
//
for (j=0;j<4;j++)
if (cust->allowed[j])
{
which=j;
break;
}
do
{
if (redraw)
{
x=CST_START+CST_SPC*which;
DrawRtn(1);
VWB_Bar(x-1,PrintY-1,CST_SPC,7,HIGHLIGHT_BOX_COLOR);
SETFONTCOLOR(HIGHLIGHT_TEXT_COLOR,HIGHLIGHT_BOX_COLOR);
PrintRtn(which);
PrintX=x;
SETFONTCOLOR(HIGHLIGHT_TEXT_COLOR,TERM_BACK_COLOR);
VW_UpdateScreen();
WaitKeyUp();
redraw=0;
}
ReadAnyControl(&ci);
if (type==MOUSE || type==JOYSTICK)
if (IN_KeyDown(sc_Enter)||IN_KeyDown(sc_Control)||IN_KeyDown(sc_Alt))
{
IN_ClearKeysDown();
ci.button0=ci.button1=false;
}
//
// CHANGE BUTTON VALUE?
//
if ((ci.button0|ci.button1|ci.button2|ci.button3)||
((type==KEYBOARDBTNS||type==KEYBOARDMOVE) && LastScan==sc_Enter))
{
tick=TimeCount=picked=0;
SETFONTCOLOR(HIGHLIGHT_TEXT_COLOR,HIGHLIGHT_BOX_COLOR);
do
{
int button,result=0;
if (type==KEYBOARDBTNS||type==KEYBOARDMOVE)
IN_ClearKeysDown();
//
// FLASH CURSOR
//
if (TimeCount>10)
{
switch(tick)
{
case 0:
VWB_Bar(x-1,PrintY-1,CST_SPC,7,HIGHLIGHT_BOX_COLOR);
break;
case 1:
PrintX=x;
US_Print("?");
SD_PlaySound(HITWALLSND);
}
tick^=1;
TimeCount=0;
VW_UpdateScreen();
}
//
// WHICH TYPE OF INPUT DO WE PROCESS?
//
switch(type)
{
case MOUSE:
Mouse(3);
button=_BX;
switch(button)
{
case 1: result=1; break;
case 2: result=2; break;
case 4: result=3; break;
}
if (result)
{
int z;
for (z=0;z<4;z++)
if (order[which]==buttonmouse[z])
{
buttonmouse[z]=bt_nobutton;
break;
}
buttonmouse[result-1]=order[which];
picked=1;
SD_PlaySound(SHOOTDOORSND);
clean_display = false;
}
break;
case JOYSTICK:
if (ci.button0) result=1;
else
if (ci.button1) result=2;
else
if (ci.button2) result=3;
else
if (ci.button3) result=4;
if (result)
{
int z;
for (z=0;z<4;z++)
if (order[which]==buttonjoy[z])
{
buttonjoy[z]=bt_nobutton;
break;
}
buttonjoy[result-1]=order[which];
picked=1;
SD_PlaySound(SHOOTDOORSND);
clean_display = false;
}
break;
case KEYBOARDBTNS:
if (LastScan)
{
if (LastScan == sc_Escape)
break;
if (_fmemchr(special_keys,LastScan,sizeof(special_keys)))
SD_PlaySound(NOWAYSND);
else
{
#pragma warn -pia
if (clean_display = TestForValidKey(LastScan))
ShootSnd();
#pragma warn +pia
buttonscan[order[which]]=LastScan;
picked=1;
}
IN_ClearKeysDown();
}
break;
case KEYBOARDMOVE:
if (LastScan)
{
if (LastScan == sc_Escape)
break;
if (_fmemchr(special_keys,LastScan,sizeof(special_keys)))
SD_PlaySound(NOWAYSND);
else
{
#pragma warn -pia
if (clean_display = TestForValidKey(LastScan))
ShootSnd();
#pragma warn +pia
dirscan[moveorder[which]]=LastScan;
picked=1;
}
IN_ClearKeysDown();
}
break;
}
//
// EXIT INPUT?
//
if (IN_KeyDown(sc_Escape))
{
picked=1;
continue;
}
} while(!picked);
if (!clean_display)
DrawCustomScreen();
SETFONTCOLOR(HIGHLIGHT_TEXT_COLOR,TERM_BACK_COLOR);
redraw=1;
WaitKeyUp();
continue;
}
if (ci.button1 || IN_KeyDown(sc_Escape))
exit=1;
//
// MOVE TO ANOTHER SPOT?
//
switch(ci.dir)
{
case dir_West:
VWB_Bar(x-1,PrintY-1,CST_SPC,7,TERM_BACK_COLOR);
SETFONTCOLOR(HIGHLIGHT_TEXT_COLOR,TERM_BACK_COLOR);
PrintRtn(which);
do
{
which--;
if (which<0)
which=3;
} while(!cust->allowed[which]);
redraw=1;
SD_PlaySound(MOVEGUN1SND);
while(ReadAnyControl(&ci),ci.dir!=dir_None);
IN_ClearKeysDown();
break;
case dir_East:
VWB_Bar(x-1,PrintY-1,CST_SPC,7,TERM_BACK_COLOR);
SETFONTCOLOR(HIGHLIGHT_TEXT_COLOR,TERM_BACK_COLOR);
PrintRtn(which);
do
{
which++;
if (which>3)
which=0;
} while(!cust->allowed[which]);
redraw=1;
SD_PlaySound(MOVEGUN1SND);
while(ReadAnyControl(&ci),ci.dir!=dir_None);
IN_ClearKeysDown();
break;
case dir_North:
case dir_South:
exit=1;
}
} while(!exit);
FREEFONT(STARTFONT+fontnumber);
SD_PlaySound(ESCPRESSEDSND);
WaitKeyUp();
}
//--------------------------------------------------------------------------
// FixupCustom() - FIXUP GUN CURSOR OVERDRAW SHIT
//--------------------------------------------------------------------------
void FixupCustom(int w)
{
static int lastwhich=-1;
switch(w)
{
case 0: DrawCustMouse(1); break;
case 2: DrawCustJoy(1); break;
case 4: DrawCustKeybd(1); break;
case 5: DrawCustKeys(1);
}
if (lastwhich>=0)
{
if (lastwhich!=w)
switch(lastwhich)
{
case 0: DrawCustMouse(0); break;
case 2: DrawCustJoy(0); break;
case 4: DrawCustKeybd(0); break;
case 5: DrawCustKeys(0);
}
}
lastwhich=w;
}
//---------------------------------------------------------------------------
// DrawCustomScreen() - DRAW CUSTOMIZE SCREEN
//---------------------------------------------------------------------------
void DrawCustomScreen(void)
{
int i;
ClearMScreen();
DrawMenuTitle("CUSTOMIZE");
DrawInstructions(IT_STANDARD);
//
// MOUSE
//
WindowX=32;
WindowW=244;
fontnumber = 4;
SETFONTCOLOR(0x0C,TERM_BACK_COLOR);
PrintY=49;
US_CPrint("MOUSE\n");
PrintY=79;
US_CPrint("JOYSTICK/GRAVIS GAMEPAD\n");
PrintY=109;
US_CPrint("KEYBOARD\n");
fontnumber = 2;
SETFONTCOLOR(DISABLED_TEXT_COLOR,TERM_BACK_COLOR);
for (i=60;i<=120;i+=30)
{
ShadowPrint("RUN",CST_START,i);
ShadowPrint("OPEN",CST_START+CST_SPC*1,i);
ShadowPrint("FIRE",CST_START+CST_SPC*2,i);
ShadowPrint("STRAFE",CST_START+CST_SPC*3,i);
}
ShadowPrint("LEFT",CST_START,135);
ShadowPrint("RIGHT",CST_START+CST_SPC*1,135);
ShadowPrint("FWRD",CST_START+CST_SPC*2,135);
ShadowPrint("BKWRD",CST_START+CST_SPC*3,135);
DrawCustMouse(0);
DrawCustJoy(0);
DrawCustKeybd(0);
DrawCustKeys(0);
//
// PICK STARTING POINT IN MENU
//
if (CusItems.curpos<0)
for (i=0;i<CusItems.amount;i++)
if (CusMenu[i].active)
{
CusItems.curpos=i;
break;
}
VW_UpdateScreen();
MenuFadeIn();
}
//---------------------------------------------------------------------------
// PrintCustMouse
//---------------------------------------------------------------------------
void PrintCustMouse(int i)
{
int j;
for (j=0;j<4;j++)
if (order[i]==buttonmouse[j])
{
PrintX=CST_START+CST_SPC*i;
US_Print(mbarray[j]);
break;
}
}
//---------------------------------------------------------------------------
// DrawCustMouse
//---------------------------------------------------------------------------
void DrawCustMouse(int hilight)
{
int i,color;
color=ENABLED_TEXT_COLOR;
if (hilight)
color=HIGHLIGHT_TEXT_COLOR;
SETFONTCOLOR(color,TERM_BACK_COLOR);
if (!mouseenabled)
{
SETFONTCOLOR(DISABLED_TEXT_COLOR,TERM_BACK_COLOR);
CusMenu[0].active=AT_DISABLED;
}
else
CusMenu[0].active=AT_ENABLED;
PrintY=CST_Y+7;
for (i=0;i<4;i++)
PrintCustMouse(i);
}
//---------------------------------------------------------------------------
// PrintCustJoy
//---------------------------------------------------------------------------
void PrintCustJoy(int i)
{
int j;
for (j=0;j<4;j++)
if (order[i]==buttonjoy[j])
{
PrintX=CST_START+CST_SPC*i;
US_Print(mbarray[j]);
break;
}
}
//---------------------------------------------------------------------------
// DrawCustJoy
//---------------------------------------------------------------------------
void DrawCustJoy(int hilight)
{
int i,color;
color=ENABLED_TEXT_COLOR;
if (hilight)
color=HIGHLIGHT_TEXT_COLOR;
SETFONTCOLOR(color,TERM_BACK_COLOR);
if (!joystickenabled)
{
SETFONTCOLOR(DISABLED_TEXT_COLOR,TERM_BACK_COLOR);
CusMenu[2].active=AT_DISABLED;
}
else
CusMenu[2].active=AT_ENABLED;
PrintY=CST_Y+37;
for (i=0;i<4;i++)
PrintCustJoy(i);
}
//---------------------------------------------------------------------------
// PrintCustKeybd
//---------------------------------------------------------------------------
void PrintCustKeybd(int i)
{
PrintX=CST_START+CST_SPC*i;
US_Print(IN_GetScanName(buttonscan[order[i]]));
}
//---------------------------------------------------------------------------
// DrawCustKeybd
//---------------------------------------------------------------------------
void DrawCustKeybd(int hilight)
{
int i,color;
if (hilight)
color=HIGHLIGHT_TEXT_COLOR;
else
color=ENABLED_TEXT_COLOR;
SETFONTCOLOR(color,TERM_BACK_COLOR);
PrintY=CST_Y+67;
for (i=0;i<4;i++)
PrintCustKeybd(i);
}
//---------------------------------------------------------------------------
// PrintCustKeys()
//---------------------------------------------------------------------------
void PrintCustKeys(int i)
{
PrintX=CST_START+CST_SPC*i;
US_Print(IN_GetScanName(dirscan[moveorder[i]]));
}
//---------------------------------------------------------------------------
// DrawCustKeys()
//---------------------------------------------------------------------------
void DrawCustKeys(int hilight)
{
int i,color;
color=ENABLED_TEXT_COLOR;
if (hilight)
color=HIGHLIGHT_TEXT_COLOR;
SETFONTCOLOR(color,TERM_BACK_COLOR);
PrintY=CST_Y+82;
for (i=0;i<4;i++)
PrintCustKeys(i);
}
//---------------------------------------------------------------------------
// CP_ChangeView()
//---------------------------------------------------------------------------
void CP_ChangeView(void)
{
int exit=0,oldview,newview,lastview;
ControlInfo ci;
WindowX=WindowY=0;
WindowW=320;
WindowH=200;
newview=oldview=lastview=viewwidth/16;
DrawChangeView(oldview);
do
{
CheckPause();
ReadAnyControl(&ci);
switch(ci.dir)
{
case dir_South:
case dir_West:
newview--;
if (newview<6)
newview=6;
ShowViewSize(newview);
VW_UpdateScreen();
if (newview != lastview)
SD_PlaySound(HITWALLSND);
TicDelay(10);
lastview=newview;
break;
case dir_North:
case dir_East:
newview++;
if (newview>20)
newview=20;
ShowViewSize(newview);
VW_UpdateScreen();
if (newview != lastview)
SD_PlaySound(HITWALLSND);
TicDelay(10);
lastview=newview;
break;
}
if (ci.button0 || Keyboard[sc_Enter])
exit=1;
else
if (ci.button1 || Keyboard[sc_Escape])
{
viewwidth=oldview*16;
SD_PlaySound(ESCPRESSEDSND);
MenuFadeOut();
return;
}
} while(!exit);
ControlPanelFree();
if (oldview!=newview)
{
SD_PlaySound (SHOOTSND);
Message(Computing);
NewViewSize(newview);
}
ControlPanelAlloc();
ShootSnd();
MenuFadeOut();
}
//---------------------------------------------------------------------------
// DrawChangeView()
//---------------------------------------------------------------------------
void DrawChangeView(int view)
{
DrawTopInfo(sp_changeview);
ShowViewSize(view);
fontnumber = 1;
CA_CacheGrChunk(STARTFONT+1);
CacheBMAmsg(CHANGEVIEW_TEXT);
FREEFONT(STARTFONT+1);
VW_UpdateScreen();
MenuFadeIn();
}
//---------------------------------------------------------------------------
// CP_Quit() - QUIT THIS INFERNAL GAME!
//---------------------------------------------------------------------------
void CP_Quit(void)
{
if (Confirm(QuitToDosStr))
ExitGame();
DrawMainMenu();
}
////////////////////////////////////////////////////////////////////
//
// SUPPORT ROUTINES
//
////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
// Clear Menu screens to dark red
//---------------------------------------------------------------------------
void ClearMScreen(void)
{
VWB_Bar(SCREEN_X,SCREEN_Y,SCREEN_W,SCREEN_H,TERM_BACK_COLOR);
}
//---------------------------------------------------------------------------
// Un/Cache a LUMP of graphics
//---------------------------------------------------------------------------
void CacheLump(int lumpstart,int lumpend)
{
int i;
for (i=lumpstart;i<=lumpend;i++)
CA_CacheGrChunk(i);
}
//---------------------------------------------------------------------------
// UnCacheLump
//---------------------------------------------------------------------------
void UnCacheLump(int lumpstart,int lumpend)
{
int i;
for (i=lumpstart;i<=lumpend;i++)
FREEFONT(i);
}
//---------------------------------------------------------------------------
// Draw a window for a menu
//---------------------------------------------------------------------------
void DrawWindow(int x,int y,int w,int h,int wcolor)
{
VWB_Bar(x,y,w,h,wcolor);
DrawOutline(x,y,w,h,BORD2COLOR,DEACTIVE);
}
//---------------------------------------------------------------------------
// DrawOutline
//---------------------------------------------------------------------------
void DrawOutline(int x,int y,int w,int h,int color1,int color2)
{
VWB_Hlin(x,x+w,y,color2);
VWB_Vlin(y,y+h,x,color2);
VWB_Hlin(x,x+w,y+h,color1);
VWB_Vlin(y,y+h,x+w,color1);
}
//---------------------------------------------------------------------------
// SetupControlPanel() - Setup Control Panel stuff - graphics, etc.
//---------------------------------------------------------------------------
void SetupControlPanel(void)
{
//
// CACHE GRAPHICS & SOUNDS
//
// CA_CacheScreen (BACKGROUND_SCREENPIC);
ControlPanelAlloc();
// SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
fontnumber=2;
WindowH=200;
if (!ingame)
CA_LoadAllSounds();
else
MainMenu[MM_SAVE_MISSION].active=AT_ENABLED;
ReadGameNames();
//
// CENTER MOUSE
//
_CX=_DX=CENTER;
Mouse(4);
}
//---------------------------------------------------------------------------
// ReadGameNames()
//---------------------------------------------------------------------------
void ReadGameNames()
{
struct ffblk f;
char name[13];
int which;
// SEE WHICH SAVE GAME FILES ARE AVAILABLE & READ STRING IN
//
_fstrcpy(name,SaveName);
MakeDestPath(name);
if (!findfirst(tempPath,&f,0))
do
{
which=f.ff_name[7]-'0';
if (which<10)
{
int handle;
char temp[GAME_DESCRIPTION_LEN+1];
SaveGamesAvail[which]=1;
MakeDestPath(f.ff_name);
handle=open(tempPath,O_RDONLY | O_BINARY);
if (FindChunk(handle,"DESC"))
{
read(handle,temp,GAME_DESCRIPTION_LEN+1);
_fstrcpy(&SaveGameNames[which][0],temp);
}
else
_fstrcpy(&SaveGameNames[which][0],"DESCRIPTION LOST");
close(handle);
}
} while(!findnext(&f));
}
//---------------------------------------------------------------------------
// CleanupControlPanel() - Clean up all the Control Panel stuff
//---------------------------------------------------------------------------
void CleanupControlPanel(void)
{
if (!loadedgame)
FreeMusic();
ControlPanelFree();
fontnumber = 4;
}
//---------------------------------------------------------------------------
// ControlPanelFree() - This FREES the control panel lump from memory
// and REALLOCS the ScaledDirectory
//---------------------------------------------------------------------------
void ControlPanelFree(void)
{
UnCacheLump(CONTROLS_LUMP_START,CONTROLS_LUMP_END);
NewViewSize(viewsize);
}
//---------------------------------------------------------------------------
// ControlPanelAlloc() - This CACHEs the control panel lump into memory
// and FREEs the ScaledDirectory.
//---------------------------------------------------------------------------
void ControlPanelAlloc(void)
{
CacheLump(CONTROLS_LUMP_START,CONTROLS_LUMP_END);
}
//---------------------------------------------------------------------------
// ShadowPrint() - Shadow Prints given text @ a given x & y in default font
//
// NOTE: Font MUST already be loaded
//---------------------------------------------------------------------------
void ShadowPrint(char far *strng,int x, int y)
{
int old_bc,old_fc;
old_fc = fontcolor;
old_bc = backcolor;
PrintX = x+1;
PrintY = y+1;
SETFONTCOLOR(TERM_SHADOW_COLOR,TERM_BACK_COLOR);
US_Print(strng);
PrintX = x;
PrintY = y;
SETFONTCOLOR(old_fc,old_bc);
US_Print(strng);
}
//---------------------------------------------------------------------------
// HandleMenu() - Handle moving gun around a menu
//---------------------------------------------------------------------------
int HandleMenu(CP_iteminfo far *item_i,CP_itemtype far *items,void (*routine)(int w))
{
#define box_on item_i->cursor.on
char key;
static int redrawitem=1,lastitem=-1;
int i,x,y,basey,exit,which,flash_tics;
ControlInfo ci;
which=item_i->curpos;
x=item_i->x;
basey=item_i->y;
y=basey+which*item_i->y_spacing;
box_on = 1;
DrawGun(item_i,items,x,&y,which,basey,routine);
SetTextColor(items+which,1);
if (redrawitem)
{
ShadowPrint((items+which)->string,item_i->x+item_i->indent,item_i->y+which*item_i->y_spacing);
}
//
// CALL CUSTOM ROUTINE IF IT IS NEEDED
//
if (routine)
routine(which);
VW_UpdateScreen();
flash_tics=40;
exit=0;
TimeCount=0;
IN_ClearKeysDown();
do
{
CalcTics();
flash_tics -= tics;
CycleColors();
//
// CHANGE GUN SHAPE
//
if (flash_tics <= 0)
{
flash_tics = 40;
box_on ^= 1;
if (box_on)
DrawGun(item_i,items,x,&y,which,basey,routine);
else
{
EraseGun(item_i,items,x,y,which);
if (routine)
routine(which);
}
VW_UpdateScreen();
}
CheckPause();
//
// SEE IF ANY KEYS ARE PRESSED FOR INITIAL CHAR FINDING
//
key=LastASCII;
if (key)
{
int ok=0;
if (key>='a')
key-='a'-'A';
for (i=which+1;i<item_i->amount;i++)
if ((items+i)->active && (items+i)->string[0]==key)
{
EraseGun(item_i,items,x,y,which);
which=i;
item_i->curpos=which; // jtr -testing
box_on = 1;
DrawGun(item_i,items,x,&y,which,basey,routine);
VW_UpdateScreen();
ok=1;
IN_ClearKeysDown();
break;
}
//
// DIDN'T FIND A MATCH FIRST TIME THRU. CHECK AGAIN.
//
if (!ok)
{
for (i=0;i<which;i++)
if ((items+i)->active && (items+i)->string[0]==key)
{
EraseGun(item_i,items,x,y,which);
which=i;
item_i->curpos=which; // jtr -testing
box_on = 1;
DrawGun(item_i,items,x,&y,which,basey,routine);
VW_UpdateScreen();
IN_ClearKeysDown();
break;
}
}
}
//
// GET INPUT
//
ReadAnyControl(&ci);
switch(ci.dir)
{
//------------------------
// MOVE UP
//
case dir_North:
EraseGun(item_i,items,x,y,which);
do
{
if (!which)
which=item_i->amount-1;
else
which--;
} while(!(items+which)->active);
item_i->curpos=which; // jtr -testing
box_on = 1;
DrawGun(item_i,items,x,&y,which,basey,routine);
VW_UpdateScreen();
TicDelay(20);
break;
//--------------------------
// MOVE DOWN
//
case dir_South:
EraseGun(item_i,items,x,y,which);
do
{
if (which==item_i->amount-1)
which=0;
else
which++;
} while(!(items+which)->active);
item_i->curpos=which; // jtr -testing
box_on = 1;
DrawGun(item_i,items,x,&y,which,basey,routine);
VW_UpdateScreen();
TicDelay(20);
break;
}
if (ci.button0 || Keyboard[sc_Space] || Keyboard[sc_Enter])
exit=1;
if (ci.button1 || Keyboard[sc_Escape])
exit=2;
} while(!exit);
IN_ClearKeysDown();
//
// ERASE EVERYTHING
//
// if (lastitem!=which)
// {
box_on = 0;
redrawitem=1;
EraseGun(item_i,items,x,y,which);
// }
// else
// redrawitem=0;
if (routine)
{
routine(which);
}
VW_UpdateScreen();
item_i->curpos=which;
lastitem=which;
switch(exit)
{
case 1:
//
// CALL THE ROUTINE
//
if ((items+which)->routine!=NULL)
{
// Make sure there's room to save when CP_SaveGame() is called.
//
if ((long)((items+which)->routine)==(long)(CP_SaveGame))
if (!CheckDiskSpace(DISK_SPACE_NEEDED,CANT_SAVE_GAME_TXT,cds_menu_print))
return(which);
//
// ALREADY IN A GAME?
//
if (ingame && ((items+which)->routine == CP_NewGame))
if (!Confirm(CURGAME))
{
MenuFadeOut();
return 0;
}
ShootSnd();
MenuFadeOut();
(items+which)->routine(0);
}
return which;
case 2:
SD_PlaySound(ESCPRESSEDSND);
return -1;
}
return 0; // JUST TO SHUT UP THE ERROR MESSAGES!
}
//---------------------------------------------------------------------------
// EraseGun() - ERASE GUN & DE-HIGHLIGHT STRING
//---------------------------------------------------------------------------
void EraseGun(CP_iteminfo far *item_i,CP_itemtype far *items,int x,int y,int which)
{
VWB_Bar(item_i->cursor.x,y+item_i->cursor.y_ofs,item_i->cursor.width,item_i->cursor.height,TERM_BACK_COLOR);
SetTextColor(items+which,0);
ShadowPrint((items+which)->string,item_i->x+item_i->indent,y);
// VW_UpdateScreen();
x++; // Shut up compiler
}
//---------------------------------------------------------------------------
// DrawGun() - DRAW GUN AT NEW POSITION
//---------------------------------------------------------------------------
void DrawGun(CP_iteminfo far *item_i,CP_itemtype far *items,int x,int *y,int which,int basey,void (*routine)(int w))
{
*y=basey+which*item_i->y_spacing;
VWB_Bar(item_i->cursor.x,*y+item_i->cursor.y_ofs,item_i->cursor.width,item_i->cursor.height,HIGHLIGHT_BOX_COLOR);
SetTextColor(items+which,1);
ShadowPrint((items+which)->string,item_i->x+item_i->indent,item_i->y+which*item_i->y_spacing);
//
// CALL CUSTOM ROUTINE IF IT IS NEEDED
//
if (routine)
routine(which);
// VW_UpdateScreen();
// SD_PlaySound(MOVEGUN2SND);
x++; // Shutup compiler
}
//---------------------------------------------------------------------------
// TicDelay() - DELAY FOR AN AMOUNT OF TICS OR UNTIL CONTROLS ARE INACTIVE
//---------------------------------------------------------------------------
void TicDelay(int count)
{
ControlInfo ci;
TimeCount=0;
do {
ReadAnyControl(&ci);
} while(TimeCount<count && ci.dir!=dir_None);
}
//---------------------------------------------------------------------------
// DrawMenu() - Draw a menu
//
// This also calculates the Y position of the current items in the
// CP_itemtype structures.
//---------------------------------------------------------------------------
void DrawMenu(CP_iteminfo far *item_i,CP_itemtype far *items)
{
int i,which=item_i->curpos;
WindowX=PrintX=item_i->x+item_i->indent;
WindowY=PrintY=item_i->y;
WindowW=320;
WindowH=200;
for (i=0;i<item_i->amount;i++)
{
SetTextColor(items+i,which==i);
ShadowPrint((items+i)->string,WindowX,item_i->y+i*item_i->y_spacing);
}
}
//---------------------------------------------------------------------------
// SetTextColor() - SET TEXT COLOR (HIGHLIGHT OR NO)
//---------------------------------------------------------------------------
void SetTextColor(CP_itemtype far *items,int hlight)
{
if (hlight)
{
SETFONTCOLOR(color_hlite[items->active],TERM_BACK_COLOR);
}
else
{
SETFONTCOLOR(color_norml[items->active],TERM_BACK_COLOR);
}
}
//---------------------------------------------------------------------------
// WaitKeyUp() - WAIT FOR CTRLKEY-UP OR BUTTON-UP
//---------------------------------------------------------------------------
void WaitKeyUp(void)
{
ControlInfo ci;
while(ReadAnyControl(&ci),ci.button0 |
ci.button1 |
ci.button2 |
ci.button3|
Keyboard[sc_Space]|
Keyboard[sc_Enter]|
Keyboard[sc_Escape]);
}
//---------------------------------------------------------------------------
// ReadAnyControl() - READ KEYBOARD, JOYSTICK AND MOUSE FOR INPUT
//---------------------------------------------------------------------------
void ReadAnyControl(ControlInfo *ci)
{
int mouseactive=0;
IN_ReadControl(0,ci);
//
// UNDO some of the ControlInfo vars that were init
// with IN_ReadControl() for the mouse...
//
if (ControlTypeUsed == ctrl_Mouse)
{
//
// Clear directions & buttons (if enabled or not)
//
ci->dir = dir_None;
ci->button0 = ci->button1 = ci->button2 = ci->button3 = 0;
}
if (mouseenabled)
{
int mousey,mousex;
// READ MOUSE MOTION COUNTERS
// RETURN DIRECTION
// HOME MOUSE
// CHECK MOUSE BUTTONS
Mouse(3);
mousex=_CX;
mousey=_DX;
if (mousey<CENTER-SENSITIVE)
{
ci->dir=dir_North;
_CX=_DX=CENTER;
Mouse(4);
mouseactive=1;
}
else
if (mousey>CENTER+SENSITIVE)
{
ci->dir=dir_South;
_CX=_DX=CENTER;
Mouse(4);
mouseactive=1;
}
if (mousex<CENTER-SENSITIVE)
{
ci->dir=dir_West;
_CX=_DX=CENTER;
Mouse(4);
mouseactive=1;
}
else
if (mousex>CENTER+SENSITIVE)
{
ci->dir=dir_East;
_CX=_DX=CENTER;
Mouse(4);
mouseactive=1;
}
if (IN_MouseButtons())
{
ci->button0=IN_MouseButtons()&1;
ci->button1=IN_MouseButtons()&2;
ci->button2=IN_MouseButtons()&4;
ci->button3=false;
mouseactive=1;
}
}
if (joystickenabled && !mouseactive)
{
int jx,jy,jb;
INL_GetJoyDelta(joystickport,&jx,&jy);
if (jy<-SENSITIVE)
ci->dir=dir_North;
else
if (jy>SENSITIVE)
ci->dir=dir_South;
if (jx<-SENSITIVE)
ci->dir=dir_West;
else
if (jx>SENSITIVE)
ci->dir=dir_East;
jb=IN_JoyButtons();
if (jb)
{
ci->button0=jb&1;
ci->button1=jb&2;
if (joypadenabled)
{
ci->button2=jb&4;
ci->button3=jb&8;
}
else
ci->button2=ci->button3=false;
}
}
}
////////////////////////////////////////////////////////////////////
//
// DRAW DIALOG AND CONFIRM YES OR NO TO QUESTION
//
////////////////////////////////////////////////////////////////////
int Confirm(char far *string)
{
int xit=0,i,x,y,tick=0,time,whichsnd[2]={ESCPRESSEDSND,SHOOTSND};
Message(string);
// Next two lines needed for flashing cursor ...
//
SETFONTCOLOR(BORDER_TEXT_COLOR,BORDER_MED_COLOR);
CA_CacheGrChunk(STARTFONT+fontnumber);
IN_ClearKeysDown();
//
// BLINK CURSOR
//
x=PrintX;
y=PrintY;
TimeCount=0;
do
{
if (TimeCount>=10)
{
switch(tick)
{
case 0:
VWB_Bar(x,y,8,13,BORDER_MED_COLOR);
break;
case 1:
PrintX=x;
PrintY=y;
US_Print("_");
}
VW_UpdateScreen();
tick^=1;
TimeCount=0;
}
} while(!Keyboard[sc_Y] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);
if (Keyboard[sc_Y])
{
xit=1;
ShootSnd();
}
while(Keyboard[sc_Y] || Keyboard[sc_N] || Keyboard[sc_Escape]);
IN_ClearKeysDown();
SD_PlaySound(whichsnd[xit]);
FREEFONT(STARTFONT+fontnumber);
return xit;
}
//---------------------------------------------------------------------------
// Message() - PRINT A MESSAGE IN A WINDOW
//---------------------------------------------------------------------------
void Message(char far *string)
{
int h=0,w=0,mw=0,i,x,y,time;
fontstruct _seg *font;
unsigned OldPrintX,OldPrintY;
fontnumber=1;
CA_CacheGrChunk(STARTFONT+1);
font=grsegs[STARTFONT+fontnumber];
h=font->height;
for (i=0;i<_fstrlen(string);i++)
if (string[i]=='\n')
{
if (w>mw)
mw=w;
w=0;
h+=font->height;
}
else
w+=font->width[string[i]];
if (w+10>mw)
mw=w+10;
OldPrintY = PrintY=(WindowH/2)-h/2;
OldPrintX = PrintX=WindowX=160-mw/2;
// bump down and to right for shadow
PrintX++;
PrintY++;
WindowX++;
BevelBox(WindowX-6,PrintY-6,mw+10,h+10,BORDER_HI_COLOR,BORDER_MED_COLOR,BORDER_LO_COLOR);
SETFONTCOLOR(BORDER_LO_COLOR,BORDER_MED_COLOR);
US_Print(string);
PrintY=OldPrintY;
WindowX=PrintX=OldPrintX;
SETFONTCOLOR(BORDER_TEXT_COLOR,BORDER_MED_COLOR);
US_Print(string);
FREEFONT(STARTFONT+1);
VW_UpdateScreen();
}
//--------------------------------------------------------------------------
// TerminateStr - Searches for an "^XX" and replaces with a 0 (NULL)
//--------------------------------------------------------------------------
void TerminateStr(char far *pos)
{
pos = _fstrstr(pos,"^XX");
#if IN_DEVELOPMENT
if (!pos)
MENU_ERROR(CACHE_MESSAGE_NO_END_MARKER);
#endif
*pos = 0;
}
//---------------------------------------------------------------------------
// CacheMessage() - Caches and prints a message in a window.
//---------------------------------------------------------------------------
void CacheMessage(unsigned MessageNum)
{
char far *string;
CA_CacheGrChunk(MessageNum);
string = MK_FP(grsegs[MessageNum],0);
TerminateStr(string);
Message(string);
FREEFONT(MessageNum);
}
//---------------------------------------------------------------------------
// CacheCompData() - Caches and Decompresses data from the VGAGRAPH
//
// NOTE: - User is responsible for freeing loaded data
// - Returns the size of the data
// - Does not call TerminateStr() for loaded TEXT data
//
// RETURNS: Lenght of loaded (decompressed) data
//
//---------------------------------------------------------------------------
unsigned long CacheCompData(unsigned ItemNum, memptr *dest_loc)
{
char far *compdata, far *dest_ptr;
CompHeader_t far *CompHeader;
unsigned long data_len;
// Load compressed data
CA_CacheGrChunk(ItemNum);
compdata = MK_FP(grsegs[ItemNum],0);
MM_SetLock (&grsegs[ItemNum], true);
CompHeader = (CompHeader_t far *)compdata;
data_len = CompHeader->OriginalLen;
compdata+=sizeof(CompHeader_t);
// Allocate Dest Memory
MM_GetPtr(dest_loc,data_len);
MM_SetLock (dest_loc, true);
dest_ptr = MK_FP(*dest_loc,0);
// Decompress and terminate string
if (!LZH_Startup())
Quit("out of memory");
LZH_Decompress(compdata,dest_ptr,data_len,CompHeader->CompressLen,(SRC_MEM|DEST_MEM));
LZH_Shutdown();
// Free compressed data
UNCACHEGRCHUNK(ItemNum);
// Return loaded size
MM_SetLock (dest_loc, false);
return(data_len);
}
//-------------------------------------------------------------------------
// CheckForSpecialCode() - Scans the Command Line parameters for
// special code word and returns true if found.
//
// NOTE: - Requires that the MEMORY and CACHE manager be started up.
// - The chunk being checked MUST be JAMPAKd - (this may change)
//
//-------------------------------------------------------------------------
boolean CheckForSpecialCode(unsigned ItemNum)
{
memptr code;
boolean return_val = false;
char i;
char far *code_ptr;
// Allocate, Cache & Decomp into ram
CacheCompData(ItemNum, &code);
code_ptr = MK_FP(code,0);
TerminateStr(code_ptr);
// Check for code
for (i=1; i<_argc; i++)
if (!_fmemicmp(_argv[i],code_ptr,_fstrlen(code_ptr)))
return_val = true;
// free allocated memory
MM_FreePtr(&code);
return(return_val);
}
////////////////////////////////////////////////////////////////////
//
// THIS MAY BE FIXED A LITTLE LATER...
//
////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
// StartCPMusic()
//---------------------------------------------------------------------------
void StartCPMusic(int song)
{
musicnames chunk;
if (audiosegs[STARTMUSIC + lastmenumusic]) // JDC
MM_FreePtr ((memptr *)&audiosegs[STARTMUSIC + lastmenumusic]);
lastmenumusic = song;
SD_MusicOff();
chunk = song;
MM_BombOnError (false);
CA_CacheAudioChunk(STARTMUSIC + chunk);
MM_BombOnError (true);
if (mmerror)
mmerror = false;
else
{
MM_SetLock(&((memptr)audiosegs[STARTMUSIC + chunk]),true);
SD_StartMusic((MusicGroup far *)audiosegs[STARTMUSIC + chunk]);
}
}
//---------------------------------------------------------------------------
// FreeMusic ()
//---------------------------------------------------------------------------
void FreeMusic (void)
{
SD_MusicOff();
if (audiosegs[STARTMUSIC + lastmenumusic]) // JDC
MM_FreePtr ((memptr *)&audiosegs[STARTMUSIC + lastmenumusic]);
}
#ifdef CACHE_KEY_DATA
//---------------------------------------------------------------------------
// IN_GetScanName() - Returns a string containing the name of the
// specified scan code
//---------------------------------------------------------------------------
byte far* IN_GetScanName(ScanCode scan)
{
byte far *p;
ScanCode far *s;
for (s = ExtScanCodes,p = ExtScanNames;*s;p+=7,s++)
if (*s == scan)
return((byte far *)p);
return((byte far *)(ScanNames+(scan<<1)));
}
#else
//---------------------------------------------------------------------------
// IN_GetScanName() - Returns a string containing the name of the
// specified scan code
//---------------------------------------------------------------------------
byte far* IN_GetScanName(ScanCode scan)
{
byte far * far *p;
ScanCode far *s;
for (s = ExtScanCodes,p = ExtScanNames;*s;p++,s++)
if (*s == scan)
return(*p);
return(ScanNames[scan]);
}
#endif
//---------------------------------------------------------------------------
// CheckPause() - CHECK FOR PAUSE KEY (FOR MUSIC ONLY)
//---------------------------------------------------------------------------
void CheckPause(void)
{
if (Paused)
{
switch(SoundStatus)
{
case 0:
SD_MusicOn();
break;
case 1:
SD_MusicOff();
break;
}
SoundStatus^=1;
VW_WaitVBL(3);
IN_ClearKeysDown();
Paused=false;
}
}
//-------------------------------------------------------------------------
// DrawMenuGun() - DRAW GUN CURSOR AT CORRECT POSITION IN MENU
//-------------------------------------------------------------------------
void DrawMenuGun(CP_iteminfo far *iteminfo)
{
int x,y;
x=iteminfo->cursor.x;
y=iteminfo->y+iteminfo->curpos*iteminfo->y_spacing+iteminfo->cursor.y_ofs;
VWB_Bar(x,y,iteminfo->cursor.width,iteminfo->cursor.height,HIGHLIGHT_BOX_COLOR);
}
//-------------------------------------------------------------------------
// ShootSnd()
//-------------------------------------------------------------------------
void ShootSnd(void)
{
SD_PlaySound(SHOOTSND);
}
#if GAME_VERSION == SHAREWARE_VERSION
//-------------------------------------------------------------------------
// ShowPromo()
//-------------------------------------------------------------------------
void ShowPromo()
{
#define PROMO_MUSIC HIDINGA_MUS
// Load and start music
//
CA_CacheAudioChunk(STARTMUSIC+PROMO_MUSIC);
SD_StartMusic((MusicGroup far *)audiosegs[STARTMUSIC+PROMO_MUSIC]);
// Show promo screen 1
//
MenuFadeOut();
CA_CacheScreen(PROMO1PIC);
VW_UpdateScreen();
MenuFadeIn();
IN_UserInput(TickBase*20);
// Show promo screen 2
//
MenuFadeOut();
CA_CacheScreen(PROMO2PIC);
VW_UpdateScreen();
MenuFadeIn();
IN_UserInput(TickBase*20);
// Music off and freed!
//
StopMusic();
}
#endif
//-------------------------------------------------------------------------
// ExitGame()
//-------------------------------------------------------------------------
void ExitGame()
{
int i;
VW_FadeOut();
#if GAME_VERSION == SHAREWARE_VERSION
ShowPromo();
#endif
SD_MusicOff();
SD_StopSound();
// SHUT-UP THE ADLIB
//
for (i=1;i<=0xf5;i++)
alOut(i,0);
Quit(NULL);
}