////////////////////////////////////////////////////////////////////
//
// LOAD SAVED GAMES
//
////////////////////////////////////////////////////////////////////
int CP_LoadGame(int quick)
{
int handle,which,exit=0;
char name[13];
strcpy(name,SaveName);
//
// QUICKLOAD?
//
if (quick)
{
which=LSItems.curpos;
if (SaveGamesAvail[which])
{
name[7]=which+'0';
handle=open(name,O_BINARY);
lseek(handle,32,SEEK_SET);
loadedgame=true;
LoadTheGame(handle,0,0);
loadedgame=false;
close(handle);
DrawFace ();
DrawHealth ();
DrawLives ();
DrawLevel ();
DrawAmmo ();
DrawKeys ();
DrawWeapon ();
DrawScore ();
return 1;
}
}
#ifdef SPEAR
UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);
CacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);
#endif
DrawLoadSaveScreen(0);
do
{
which=HandleMenu(&LSItems,&LSMenu[0],TrackWhichGame);
if (which>=0 && SaveGamesAvail[which])
{
ShootSnd();
name[7]=which+'0';
handle=open(name,O_BINARY);
lseek(handle,32,SEEK_SET);
DrawLSAction(0);
loadedgame=true;
LoadTheGame(handle,LSA_X+8,LSA_Y+5);
close(handle);
StartGame=1;
ShootSnd();
//
// CHANGE "READ THIS!" TO NORMAL COLOR
//
#ifndef SPEAR
#ifndef GOODTIMES
MainMenu[readthis].active=1;
#endif
#endif
exit=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;
}
///////////////////////////////////
//
// HIGHLIGHT CURRENT SELECTED ENTRY
//
void TrackWhichGame(int w)
{
static int lastgameon=0;
PrintLSEntry(lastgameon,TEXTCOLOR);
PrintLSEntry(w,HIGHLIGHT);
lastgameon=w;
}
////////////////////////////
//
// DRAW THE LOAD/SAVE SCREEN
//
void DrawLoadSaveScreen(int loadsave)
{
#define DISKX 100
#define DISKY 0
int i;
ClearMScreen();
fontnumber=1;
VWB_DrawPic(112,184,C_MOUSELBACKPIC);
DrawWindow(LSM_X-10,LSM_Y-5,LSM_W,LSM_H,BKGDCOLOR);
DrawStripes(10);
if (!loadsave)
VWB_DrawPic(60,0,C_LOADGAMEPIC);
else
VWB_DrawPic(60,0,C_SAVEGAMEPIC);
for (i=0;i10;i++)
PrintLSEntry(i,TEXTCOLOR);
DrawMenu(&LSItems,&LSMenu[0]);
VW_UpdateScreen();
MenuFadeIn();
WaitKeyUp();
}
///////////////////////////////////////////
//
// PRint LOAD/SAVE GAME ENTRY W/BOX OUTLINE
//
void PrintLSEntry(int w,int color)
{
SETFONTCOLOR(color,BKGDCOLOR);
DrawOutline(LSM_X+LSItems.indent,LSM_Y+w*13,LSM_W-LSItems.indent-15,11,color,color);
PrintX=LSM_X+LSItems.indent+2;
PrintY=LSM_Y+w*13+1;
fontnumber=0;
if (SaveGamesAvail[w])
US_Print(SaveGameNames[w]);
else
US_Print(" - "STR_EMPTY" -");
fontnumber=1;
}
////////////////////////////////////////////////////////////////////
//
// 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-LSItems.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-LSItems.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,READCOLOR);
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,READCOLOR);
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(0);
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;i6;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);
}