%20WL_MENU.C
///////////////////////////////////////////////////////////////////
/
//
// SAVE CURRENT GAME
//
////////////////////////////////////////////////////////////////////
int CP_SaveGame(int quick)
{
int handle,which,exit=0;
unsigned nwritten;
char name[13],input[32];
strcpy(name,SaveName);
//
// QUICKSAVE?
//
if (quick)
{
which=LSItems.curpos;
if (SaveGamesAvail[which])
{
name[7]=which+'0';
unlink(name);
handle=creat(name,S_IREAD|S_IWRITE);
strcpy(input,&SaveGameNames[which][0]);
_dos_write(handle,(void far *)input,32,&nwritten);
lseek(handle,32,SEEK_SET);
SaveTheGame(handle,0,0);
close(handle);
return 1;
}
}
#ifdef SPEAR
UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
CacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);
#endif
DrawLoadSaveScreen(1);
do
{
which=HandleMenu(&LSItems,&LSMenu[0],TrackWhichGame);
if (which>=0)
{
//
// OVERWRITE EXISTING SAVEGAME?
//
if (SaveGamesAvail[which])
#ifdef JAPAN
if (!GetYorN(7,8,C_JAPSAVEOVERPIC))
#else
if (!Confirm(GAMESVD))
#endif
{
DrawLoadSaveScreen(1);
continue;
}
else
{
DrawLoadSaveScreen(1);
PrintLSEntry(which,HIGHLIGHT);
VW_UpdateScreen();
}
ShootSnd();
strcpy(input,&SaveGameNames[which][0]);
name[7]=which+'0';
fontnumber=0;
if (!SaveGamesAvail[which])
VWB_Bar(LSM_X+LSItems.indent+1,LSM_Y+which*13+1,LSM_W-LSI
tems.indent-16,10,BKGDCOLOR);
VW_UpdateScreen();
if
(US_LineInput(LSM_X+LSItems.indent+2,LSM_Y+which*13+1,input,input,true,31
,LSM_W-LSItems.indent-30))
{
SaveGamesAvail[which]=1;
strcpy(&SaveGameNames[which][0],input);
unlink(name);
handle=creat(name,S_IREAD|S_IWRITE);
_dos_write(handle,(void far *)input,32,&nwritten);
lseek(handle,32,SEEK_SET);
DrawLSAction(1);
SaveTheGame(handle,LSA_X+8,LSA_Y+5);
close(handle);
ShootSnd();
exit=1;
}
else
{
VWB_Bar(LSM_X+LSItems.indent+1,LSM_Y+which*13+1,LSM_W-LSI
tems.indent-16,10,BKGDCOLOR);
PrintLSEntry(which,HIGHLIGHT);
VW_UpdateScreen();
SD_PlaySound(ESCPRESSEDSND);
continue;
}
fontnumber=1;
break;
}
} while(which>=0);
MenuFadeOut();
#ifdef SPEAR
UnCacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);
CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
#endif
return exit;
}
////////////////////////////////////////////////////////////////////
//
// CALIBRATE JOYSTICK
//
////////////////////////////////////////////////////////////////////
int CalibrateJoystick(void)
{
#define CALX 85
#define CALY 40
#define CALW 158
#define CALH 140
unsigned xmin,ymin,xmax,ymax,jb;
#ifdef JAPAN
VWB_DrawPic(CALX,CALY,C_JOY0PIC);
#else
DrawWindow(CALX-5,CALY-5,CALW,CALH,TEXTCOLOR);
DrawOutline(CALX-5,CALY-5,CALW,CALH,0,HIGHLIGHT);
SETFONTCOLOR(0,TEXTCOLOR);
WindowX = PrintX = CALX;
WindowW = CALW;
WindowH = CALH;
WindowY = PrintY = CALY;
US_Print(" "STR_CALIB"\n "STR_JOYST"\n");
VWB_DrawPic(CALX+40,CALY+30,C_JOY1PIC);
PrintY = CALY+80;
US_Print(STR_MOVEJOY);
SETFONTCOLOR(BKGDCOLOR,TEXTCOLOR);
US_Print(" "STR_ESCEXIT);
#endif
VW_UpdateScreen();
do
{
jb=IN_JoyButtons();
if (Keyboard[sc_Escape])
return 0;
#ifndef SPEAR
if (Keyboard[sc_Tab] && Keyboard[sc_P] &&
MS_CheckParm("goobers"))
PicturePause();
#endif
} while(!(jb&1));
SD_PlaySound(SHOOTSND);
IN_GetJoyAbs(joystickport,&xmin,&ymin);
#ifdef JAPAN
VWB_DrawPic(CALX,CALY,C_JOY1PIC);
#else
DrawWindow(CALX-5,CALY-5,CALW,CALH,TEXTCOLOR);
DrawOutline(CALX-5,CALY-5,CALW,CALH,0,HIGHLIGHT);
SETFONTCOLOR(0,TEXTCOLOR);
PrintX = CALX;
PrintY = CALY;
US_Print(" "STR_CALIB"\n "STR_JOYST"\n");
VWB_DrawPic(CALX+40,CALY+30,C_JOY2PIC);
PrintY = CALY+80;
US_Print(STR_MOVEJOY2);
SETFONTCOLOR(BKGDCOLOR,TEXTCOLOR);
US_Print(" "STR_ESCEXIT);
#endif
VW_UpdateScreen();
do
{
jb=IN_JoyButtons();
if (Keyboard[sc_Escape])
return 0;
#ifndef SPEAR
if (Keyboard[sc_Tab] && Keyboard[sc_P] &&
MS_CheckParm("goobers"))
PicturePause();
#endif
} while(!(jb&2));
IN_GetJoyAbs(joystickport,&xmax,&ymax);
SD_PlaySound(SHOOTSND);
while (IN_JoyButtons());
//
// ASSIGN ACTUAL VALUES HERE
//
if ((xmin != xmax) && (ymin != ymax))
IN_SetupJoy(joystickport,xmin,xmax,ymin,ymax);
else
return 0;
return 1;
}
////////////////////////////////////////////////////////////////////
//
// DEFINE CONTROLS
//
////////////////////////////////////////////////////////////////////
void CP_Control(void)
{
#define CTL_SPC 70
enum {MOUSEENABLE,JOYENABLE,USEPORT2,PADENABLE,MOUSESENS,CUSTOMIZE};
int i,which;
#ifdef SPEAR
UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
CacheLump (CONTROL_LUMP_START,CONTROL_LUMP_END);
#endif
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)
if (!CalibrateJoystick())
joystickenabled = 0;
DrawCtlScreen();
CusItems.curpos=-1;
ShootSnd();
break;
case USEPORT2:
joystickport^=1;
DrawCtlScreen();
ShootSnd();
break;
case PADENABLE:
joypadenabled^=1;
DrawCtlScreen();
ShootSnd();
break;
case MOUSESENS:
case CUSTOMIZE:
DrawCtlScreen();
MenuFadeIn();
WaitKeyUp();
break;
}
} while(which>=0);
MenuFadeOut();
#ifdef SPEAR
UnCacheLump (CONTROL_LUMP_START,CONTROL_LUMP_END);
CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
#endif
}
////////////////////////////////
//
// DRAW MOUSE SENSITIVITY SCREEN
//
void DrawMouseSens(void)
{
#ifdef JAPAN
CA_CacheScreen(S_MOUSESENSPIC);
#else
ClearMScreen();
VWB_DrawPic(112,184,C_MOUSELBACKPIC);
#ifdef SPANISH
DrawWindow(10,80,300,43,BKGDCOLOR);
#else
DrawWindow(10,80,300,30,BKGDCOLOR);
#endif
WindowX=0;
WindowW=320;
PrintY=82;
SETFONTCOLOR(READCOLOR,BKGDCOLOR);
US_CPrint(STR_MOUSEADJ);
SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
#ifdef SPANISH
PrintX=14;
PrintY=95+13;
US_Print(STR_SLOW);
PrintX=252;
US_Print(STR_FAST);
#else
PrintX=14;
PrintY=95;
US_Print(STR_SLOW);
PrintX=269;
US_Print(STR_FAST);
#endif
#endif
VWB_Bar(60,97,200,10,TEXTCOLOR);
DrawOutline(60,97,200,10,0,HIGHLIGHT);
DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLOR);
VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);
VW_UpdateScreen();
MenuFadeIn();
}
///////////////////////////
//
// 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--;
VWB_Bar(60,97,200,10,TEXTCOLOR);
DrawOutline(60,97,200,10,0,HIGHLIGHT);
DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLO
R);
VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);
VW_UpdateScreen();
SD_PlaySound(MOVEGUN1SND);
while(Keyboard[sc_LeftArrow]);
WaitKeyUp();
}
break;
case dir_South:
case dir_East:
if (mouseadjustment<9)
{
mouseadjustment++;
VWB_Bar(60,97,200,10,TEXTCOLOR);
DrawOutline(60,97,200,10,0,HIGHLIGHT);
DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLO
R);
VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);
VW_UpdateScreen();
SD_PlaySound(MOVEGUN1SND);
while(Keyboard[sc_RightArrow]);
WaitKeyUp();
}
break;
}
#ifndef SPEAR
if (Keyboard[sc_Tab] && Keyboard[sc_P] &&
MS_CheckParm("goobers"))
#else
if (Keyboard[sc_Tab] && Keyboard[sc_P] &&
MS_CheckParm("debugmode"))
#endif
PicturePause();
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();
}
///////////////////////////
//
// DRAW CONTROL MENU SCREEN
//
void DrawCtlScreen(void)
{
int i,x,y;
#ifdef JAPAN
CA_CacheScreen(S_CONTROLPIC);
#else
ClearMScreen();
DrawStripes(10);
VWB_DrawPic(80,0,C_CONTROLPIC);
VWB_DrawPic(112,184,C_MOUSELBACKPIC);
DrawWindow(CTL_X-8,CTL_Y-5,CTL_W,CTL_H,BKGDCOLOR);
#endif
WindowX=0;
WindowW=320;
SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
if (JoysPresent[0])
CtlMenu[1].active=
CtlMenu[2].active=
CtlMenu[3].active=1;
CtlMenu[2].active=CtlMenu[3].active=joystickenabled;
if (MousePresent)
{
CtlMenu[4].active=
CtlMenu[0].active=1;
}
CtlMenu[4].active=mouseenabled;
DrawMenu(&CtlItems,&CtlMenu[0]);
x=CTL_X+CtlItems.indent-24;
y=CTL_Y+3;
if (mouseenabled)
VWB_DrawPic(x,y,C_SELECTEDPIC);
else
VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
y=CTL_Y+16;
if (joystickenabled)
VWB_DrawPic(x,y,C_SELECTEDPIC);
else
VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
y=CTL_Y+29;
if (joystickport)
VWB_DrawPic(x,y,C_SELECTEDPIC);
else
VWB_DrawPic(x,y,C_NOTSELECTEDPIC);
y=CTL_Y+42;
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();
}
////////////////////////////////////////////////////////////////////
//
// CUSTOMIZE CONTROLS
//
////////////////////////////////////////////////////////////////////
enum {FIRE,STRAFE,RUN,OPEN};
char mbarray[4][3]={"b0","b1","b2","b3"},
order[4]={RUN,OPEN,FIRE,STRAFE};
void CustomControls(void)
{
int which;
DrawCustomScreen();
do
{
which=HandleMenu(&CusItems,&CusMenu[0],FixupCustom);
switch(which)
{
case 0:
DefineMouseBtns();
DrawCustMouse(1);
break;
case 3:
DefineJoyBtns();
DrawCustJoy(0);
break;
case 6:
DefineKeyBtns();
DrawCustKeybd(0);
break;
case 8:
DefineKeyMove();
DrawCustKeys(0);
}
} while(which>=0);
MenuFadeOut();
}
////////////////////////
//
// DEFINE THE MOUSE BUTTONS
//
void DefineMouseBtns(void)
{
CustomCtrls mouseallowed={0,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)
;
}
////////////////////////
//
// 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;
ShootSnd();
PrintY=CST_Y+13*index;
IN_ClearKeysDown();
exit=0;
redraw=1;
//
// 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;
DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
DrawRtn(1);
DrawWindow(x-2,PrintY,CST_SPC,11,TEXTCOLOR);
DrawOutline(x-2,PrintY,CST_SPC,11,0,HIGHLIGHT);
SETFONTCOLOR(0,TEXTCOLOR);
PrintRtn(which);
PrintX=x;
SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
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(0,TEXTCOLOR);
do
{
int button,result=0;
if (type==KEYBOARDBTNS||type==KEYBOARDMOVE)
IN_ClearKeysDown();
//
// FLASH CURSOR
//
if (TimeCount>10)
{
switch(tick)
{
case 0:
VWB_Bar(x,PrintY+1,CST_SPC-2,10,TEXTCOLOR);
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);
}
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);
}
break;
case KEYBOARDBTNS:
if (LastScan)
{
buttonscan[order[which]]=LastScan;
picked=1;
ShootSnd();
IN_ClearKeysDown();
}
break;
case KEYBOARDMOVE:
if (LastScan)
{
dirscan[moveorder[which]]=LastScan;
picked=1;
ShootSnd();
IN_ClearKeysDown();
}
break;
}
//
// EXIT INPUT?
//
if (IN_KeyDown(sc_Escape))
{
picked=1;
continue;
}
} while(!picked);
SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
redraw=1;
WaitKeyUp();
continue;
}
if (ci.button1 || IN_KeyDown(sc_Escape))
exit=1;
//
// MOVE TO ANOTHER SPOT?
//
switch(ci.dir)
{
case dir_West:
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:
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);
SD_PlaySound(ESCPRESSEDSND);
WaitKeyUp();
DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
}