////////////////////////
//
// 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;j4;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)
(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);
}
////////////////////////
//
// FIXUP GUN CURSOR OVERDRAW SHIT
//
void FixupCustom(int w)
{
static int lastwhich=-1;
int y=CST_Y+26+w*13;
VWB_Hlin(7,32,y-1,DEACTIVE);
VWB_Hlin(7,32,y+12,BORD2COLOR);
#ifndef SPEAR
VWB_Hlin(7,32,y-2,BORDCOLOR);
VWB_Hlin(7,32,y+13,BORDCOLOR);
#else
VWB_Hlin(7,32,y-2,BORD2COLOR);
VWB_Hlin(7,32,y+13,BORD2COLOR);
#endif
switch(w)
{
case 0: DrawCustMouse(1); break;
case 3: DrawCustJoy(1); break;
case 6: DrawCustKeybd(1); break;
case 8: DrawCustKeys(1);
}
if (lastwhich>=0)
{
y=CST_Y+26+lastwhich*13;
VWB_Hlin(7,32,y-1,DEACTIVE);
VWB_Hlin(7,32,y+12,BORD2COLOR);
#ifndef SPEAR
VWB_Hlin(7,32,y-2,BORDCOLOR);
VWB_Hlin(7,32,y+13,BORDCOLOR);
#else
VWB_Hlin(7,32,y-2,BORD2COLOR);
VWB_Hlin(7,32,y+13,BORD2COLOR);
#endif
if (lastwhich!=w)
switch(lastwhich)
{
case 0: DrawCustMouse(0); break;
case 3: DrawCustJoy(0); break;
case 6: DrawCustKeybd(0); break;
case 8: DrawCustKeys(0);
}
}
lastwhich=w;
}
////////////////////////
//
// DRAW CUSTOMIZE SCREEN
//
void DrawCustomScreen(void)
{
int i;
#ifdef JAPAN
CA_CacheScreen(S_CUSTOMPIC);
fontnumber=1;
PrintX=CST_START;
PrintY = CST_Y+26;
DrawCustMouse(0);
PrintX=CST_START;
US_Print("\n\n\n");
DrawCustJoy(0);
PrintX=CST_START;
US_Print("\n\n\n");
DrawCustKeybd(0);
PrintX=CST_START;
US_Print("\n\n\n");
DrawCustKeys(0);
#else
ClearMScreen();
WindowX=0;
WindowW=320;
VWB_DrawPic(112,184,C_MOUSELBACKPIC);
DrawStripes(10);
VWB_DrawPic(80,0,C_CUSTOMIZEPIC);
//
// MOUSE
//
SETFONTCOLOR(READCOLOR,BKGDCOLOR);
WindowX=0;
WindowW=320;
#ifndef SPEAR
PrintY=CST_Y;
US_CPrint("Mouse\n");
#else
PrintY = CST_Y+13;
VWB_DrawPic (128,48,C_MOUSEPIC);
#endif
SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
#ifdef SPANISH
PrintX=CST_START-16;
US_Print(STR_CRUN);
PrintX=CST_START-16+CST_SPC*1;
US_Print(STR_COPEN);
PrintX=CST_START-16+CST_SPC*2;
US_Print(STR_CFIRE);
PrintX=CST_START-16+CST_SPC*3;
US_Print(STR_CSTRAFE"\n");
#else
PrintX=CST_START;
US_Print(STR_CRUN);
PrintX=CST_START+CST_SPC*1;
US_Print(STR_COPEN);
PrintX=CST_START+CST_SPC*2;
US_Print(STR_CFIRE);
PrintX=CST_START+CST_SPC*3;
US_Print(STR_CSTRAFE"\n");
#endif
DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
DrawCustMouse(0);
US_Print("\n");
//
// JOYSTICK/PAD
//
#ifndef SPEAR
SETFONTCOLOR(READCOLOR,BKGDCOLOR);
US_CPrint("Joystick/Gravis GamePad\n");
#else
PrintY += 13;
VWB_DrawPic (40,88,C_JOYSTICKPIC);
#endif
#ifdef SPEAR
VWB_DrawPic (112,120,C_KEYBOARDPIC);
#endif
SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
#ifdef SPANISH
PrintX=CST_START-16;
US_Print(STR_CRUN);
PrintX=CST_START-16+CST_SPC*1;
US_Print(STR_COPEN);
PrintX=CST_START-16+CST_SPC*2;
US_Print(STR_CFIRE);
PrintX=CST_START-16+CST_SPC*3;
US_Print(STR_CSTRAFE"\n");
#else
PrintX=CST_START;
US_Print(STR_CRUN);
PrintX=CST_START+CST_SPC*1;
US_Print(STR_COPEN);
PrintX=CST_START+CST_SPC*2;
US_Print(STR_CFIRE);
PrintX=CST_START+CST_SPC*3;
US_Print(STR_CSTRAFE"\n");
#endif
DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
DrawCustJoy(0);
US_Print("\n");
//
// KEYBOARD
//
#ifndef SPEAR
SETFONTCOLOR(READCOLOR,BKGDCOLOR);
US_CPrint("Keyboard\n");
#else
PrintY += 13;
#endif
SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
#ifdef SPANISH
PrintX=CST_START-16;
US_Print(STR_CRUN);
PrintX=CST_START-16+CST_SPC*1;
US_Print(STR_COPEN);
PrintX=CST_START-16+CST_SPC*2;
US_Print(STR_CFIRE);
PrintX=CST_START-16+CST_SPC*3;
US_Print(STR_CSTRAFE"\n");
#else
PrintX=CST_START;
US_Print(STR_CRUN);
PrintX=CST_START+CST_SPC*1;
US_Print(STR_COPEN);
PrintX=CST_START+CST_SPC*2;
US_Print(STR_CFIRE);
PrintX=CST_START+CST_SPC*3;
US_Print(STR_CSTRAFE"\n");
#endif
DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
DrawCustKeybd(0);
US_Print("\n");
//
// KEYBOARD MOVE KEYS
//
SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
#ifdef SPANISH
PrintX=4;
US_Print(STR_LEFT);
US_Print("/");
US_Print(STR_RIGHT);
US_Print("/");
US_Print(STR_FRWD);
US_Print("/");
US_Print(STR_BKWD"\n");
#else
PrintX=CST_START;
US_Print(STR_LEFT);
PrintX=CST_START+CST_SPC*1;
US_Print(STR_RIGHT);
PrintX=CST_START+CST_SPC*2;
US_Print(STR_FRWD);
PrintX=CST_START+CST_SPC*3;
US_Print(STR_BKWD"\n");
#endif
DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);
DrawCustKeys(0);
#endif
//
// 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();
}
void PrintCustMouse(int i)
{
int j;
for (j=0;j4;j++)
if (order[i]==buttonmouse[j])
{
PrintX=CST_START+CST_SPC*i;
US_Print(mbarray[j]);
break;
}
}
void DrawCustMouse(int hilight)
{
int i,color;
color=TEXTCOLOR;
if (hilight)
color=HIGHLIGHT;
SETFONTCOLOR(color,BKGDCOLOR);
if (!mouseenabled)
{
SETFONTCOLOR(DEACTIVE,BKGDCOLOR);
CusMenu[0].active=0;
}
else
CusMenu[0].active=1;
PrintY=CST_Y+13*2;
for (i=0;i4;i++)
PrintCustMouse(i);
}
void PrintCustJoy(int i)
{
int j;
for (j=0;j4;j++)
if (order[i]==buttonjoy[j])
{
PrintX=CST_START+CST_SPC*i;
US_Print(mbarray[j]);
break;
}
}
void DrawCustJoy(int hilight)
{
int i,color;
color=TEXTCOLOR;
if (hilight)
color=HIGHLIGHT;
SETFONTCOLOR(color,BKGDCOLOR);
if (!joystickenabled)
{
SETFONTCOLOR(DEACTIVE,BKGDCOLOR);
CusMenu[3].active=0;
}
else
CusMenu[3].active=1;
PrintY=CST_Y+13*5;
for (i=0;i4;i++)
PrintCustJoy(i);
}
void PrintCustKeybd(int i)
{
PrintX=CST_START+CST_SPC*i;
US_Print(IN_GetScanName(buttonscan[order[i]]));
}
void DrawCustKeybd(int hilight)
{
int i,color;
color=TEXTCOLOR;
if (hilight)
color=HIGHLIGHT;
SETFONTCOLOR(color,BKGDCOLOR);
PrintY=CST_Y+13*8;
for (i=0;i4;i++)
PrintCustKeybd(i);
}
void PrintCustKeys(int i)
{
PrintX=CST_START+CST_SPC*i;
US_Print(IN_GetScanName(dirscan[moveorder[i]]));
}
void DrawCustKeys(int hilight)
{
int i,color;
color=TEXTCOLOR;
if (hilight)
color=HIGHLIGHT;
SETFONTCOLOR(color,BKGDCOLOR);
PrintY=CST_Y+13*10;
for (i=0;i4;i++)
PrintCustKeys(i);
}
////////////////////////////////////////////////////////////////////
//
// CHANGE SCREEN VIEWING SIZE
//
////////////////////////////////////////////////////////////////////
void CP_ChangeView(void)
{
int exit=0,oldview,newview;
ControlInfo ci;
WindowX=WindowY=0;
WindowW=320;
WindowH=200;
newview=oldview=viewwidth/16;
DrawChangeView(oldview);
do
{
CheckPause();
ReadAnyControl(&ci);
switch(ci.dir)
{
case dir_South:
case dir_West:
newview--;
if (newview4)
newview=4;
ShowViewSize(newview);
VW_UpdateScreen();
SD_PlaySound(HITWALLSND);
TicDelay(10);
break;
case dir_North:
case dir_East:
newview++;
if (newview>19)
newview=19;
ShowViewSize(newview);
VW_UpdateScreen();
SD_PlaySound(HITWALLSND);
TicDelay(10);
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_Enter])
exit=1;
else
if (ci.button1 || Keyboard[sc_Escape])
{
viewwidth=oldview*16;
SD_PlaySound(ESCPRESSEDSND);
MenuFadeOut();
return;
}
} while(!exit);
if (oldview!=newview)
{
SD_PlaySound (SHOOTSND);
Message(STR_THINK"...");
NewViewSize(newview);
}
ShootSnd();
MenuFadeOut();
}
/////////////////////////////
//
// DRAW THE CHANGEVIEW SCREEN
//
void DrawChangeView(int view)
{
#ifdef JAPAN
CA_CacheScreen(S_CHANGEPIC);
ShowViewSize(view);
#else
VWB_Bar(0,160,320,40,BKGDCOLOR);
ShowViewSize(view);
PrintY=161;
WindowX=0;
WindowY=320;
SETFONTCOLOR(HIGHLIGHT,BKGDCOLOR);
US_CPrint(STR_SIZE1"\n");
US_CPrint(STR_SIZE2"\n");
US_CPrint(STR_SIZE3);
#endif
VW_UpdateScreen();
MenuFadeIn();
}
////////////////////////////////////////////////////////////////////
//
// QUIT THIS INFERNAL GAME!
//
////////////////////////////////////////////////////////////////////
void CP_Quit(void)
{
int i;
#ifdef JAPAN
if (GetYorN(7,11,C_QUITMSGPIC))
#else
#ifdef SPANISH
if (Confirm(ENDGAMESTR))
#else
if (Confirm(endStrings[US_RndT()&0x7+(US_RndT()&1)]))
#endif
#endif
{
VW_UpdateScreen();
SD_MusicOff();
SD_StopSound();
MenuFadeOut();
//
// SHUT-UP THE ADLIB
//
for (i=1;i=0xf5;i++)
alOut(i,0);
Quit(NULL);
}
DrawMainMenu();
}