📄 wl_menu.c
字号:
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();
}
////////////////////////////////////////////////////////////////////
//
// HANDLE INTRO SCREEN (SYSTEM CONFIG)
//
////////////////////////////////////////////////////////////////////
void IntroScreen(void)
{
#ifdef SPEAR
#define MAINCOLOR 0x4f
#define EMSCOLOR 0x4f
#define XMSCOLOR 0x4f
#else
#define MAINCOLOR 0x6c
#define EMSCOLOR 0x6c
#define XMSCOLOR 0x6c
#endif
#define FILLCOLOR 14
long memory,emshere,xmshere;
int i,num,ems[10]={100,200,300,400,500,600,700,800,900,1000},
xms[10]={100,200,300,400,500,600,700,800,900,1000},
main[10]={32,64,96,128,160,192,224,256,288,320};
//
// DRAW MAIN MEMORY
//
memory=(1023l+mminfo.nearheap+mminfo.farheap)/1024l;
for (i=0;i<10;i++)
if (memory>=main[i])
VWB_Bar(49,163-8*i,6,5,MAINCOLOR-i);
//
// DRAW EMS MEMORY
//
if (EMSPresent)
{
emshere=4l*EMSPagesAvail;
for (i=0;i<10;i++)
if (emshere>=ems[i])
VWB_Bar(89,163-8*i,6,5,EMSCOLOR-i);
}
//
// DRAW XMS MEMORY
//
if (XMSPresent)
{
xmshere=4l*XMSPagesAvail;
for (i=0;i<10;i++)
if (xmshere>=xms[i])
VWB_Bar(129,163-8*i,6,5,XMSCOLOR-i);
}
//
// FILL BOXES
//
if (MousePresent)
VWB_Bar(164,82,12,2,FILLCOLOR);
if (JoysPresent[0] || JoysPresent[1])
VWB_Bar(164,105,12,2,FILLCOLOR);
if (AdLibPresent && !SoundBlasterPresent)
VWB_Bar(164,128,12,2,FILLCOLOR);
if (SoundBlasterPresent)
VWB_Bar(164,151,12,2,FILLCOLOR);
if (SoundSourcePresent)
VWB_Bar(164,174,12,2,FILLCOLOR);
}
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//
// SUPPORT ROUTINES
//
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//
// Clear Menu screens to dark red
//
////////////////////////////////////////////////////////////////////
void ClearMScreen(void)
{
#ifndef SPEAR
VWB_Bar(0,0,320,200,BORDCOLOR);
#else
VWB_DrawPic(0,0,C_BACKDROPPIC);
#endif
}
////////////////////////////////////////////////////////////////////
//
// Un/Cache a LUMP of graphics
//
////////////////////////////////////////////////////////////////////
void CacheLump(int lumpstart,int lumpend)
{
int i;
for (i=lumpstart;i<=lumpend;i++)
CA_CacheGrChunk(i);
}
void UnCacheLump(int lumpstart,int lumpend)
{
int i;
for (i=lumpstart;i<=lumpend;i++)
if (grsegs[i])
UNCACHEGRCHUNK(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);
}
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);
}
////////////////////////////////////////////////////////////////////
//
// Setup Control Panel stuff - graphics, etc.
//
////////////////////////////////////////////////////////////////////
void SetupControlPanel(void)
{
struct ffblk f;
char name[13];
int which,i;
//
// CACHE GRAPHICS & SOUNDS
//
CA_CacheGrChunk(STARTFONT+1);
#ifndef SPEAR
CacheLump(CONTROLS_LUMP_START,CONTROLS_LUMP_END);
#else
CacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);
#endif
SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
fontnumber=1;
WindowH=200;
if (!ingame)
CA_LoadAllSounds();
else
MainMenu[savegame].active=1;
//
// SEE WHICH SAVE GAME FILES ARE AVAILABLE & READ STRING IN
//
strcpy(name,SaveName);
if (!findfirst(name,&f,0))
do
{
which=f.ff_name[7]-'0';
if (which<10)
{
int handle;
char temp[32];
SaveGamesAvail[which]=1;
handle=open(f.ff_name,O_BINARY);
read(handle,temp,32);
close(handle);
strcpy(&SaveGameNames[which][0],temp);
}
} while(!findnext(&f));
//
// CENTER MOUSE
//
_CX=_DX=CENTER;
Mouse(4);
}
////////////////////////////////////////////////////////////////////
//
// Clean up all the Control Panel stuff
//
////////////////////////////////////////////////////////////////////
void CleanupControlPanel(void)
{
#ifndef SPEAR
UnCacheLump(CONTROLS_LUMP_START,CONTROLS_LUMP_END);
#else
UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
#endif
fontnumber = 0;
}
////////////////////////////////////////////////////////////////////
//
// Handle moving gun around a menu
//
////////////////////////////////////////////////////////////////////
int HandleMenu(CP_iteminfo *item_i,CP_itemtype far *items,void (*routine)(int w))
{
char key;
static int redrawitem=1,lastitem=-1;
int i,x,y,basey,exit,which,shape,timer;
ControlInfo ci;
which=item_i->curpos;
x=item_i->x&-8;
basey=item_i->y-2;
y=basey+which*13;
VWB_DrawPic(x,y,C_CURSOR1PIC);
SetTextColor(items+which,1);
if (redrawitem)
{
PrintX=item_i->x+item_i->indent;
PrintY=item_i->y+which*13;
US_Print((items+which)->string);
}
//
// CALL CUSTOM ROUTINE IF IT IS NEEDED
//
if (routine)
routine(which);
VW_UpdateScreen();
shape=C_CURSOR1PIC;
timer=8;
exit=0;
TimeCount=0;
IN_ClearKeysDown();
do
{
//
// CHANGE GUN SHAPE
//
if (TimeCount>timer)
{
TimeCount=0;
if (shape==C_CURSOR1PIC)
{
shape=C_CURSOR2PIC;
timer=8;
}
else
{
shape=C_CURSOR1PIC;
timer=70;
}
VWB_DrawPic(x,y,shape);
if (routine)
routine(which);
VW_UpdateScreen();
}
CheckPause();
//
// SEE IF ANY KEYS ARE PRESSED FOR INITIAL CHAR FINDING
//
key=LastASCII;
if (key)
{
int ok=0;
//
// CHECK FOR SCREEN CAPTURE
//
#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 (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;
DrawGun(item_i,items,x,&y,which,basey,routine);
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;
DrawGun(item_i,items,x,&y,which,basey,routine);
IN_ClearKeysDown();
break;
}
}
}
//
// GET INPUT
//
ReadAnyControl(&ci);
switch(ci.dir)
{
////////////////////////////////////////////////
//
// MOVE UP
//
case dir_North:
EraseGun(item_i,items,x,y,which);
//
// ANIMATE HALF-STEP
//
if (which && (items+which-1)->active)
{
y-=6;
DrawHalfStep(x,y);
}
//
// MOVE TO NEXT AVAILABLE SPOT
//
do
{
if (!which)
which=item_i->amount-1;
else
which--;
} while(!(items+which)->active);
DrawGun(item_i,items,x,&y,which,basey,routine);
//
// WAIT FOR BUTTON-UP OR DELAY NEXT MOVE
//
TicDelay(20);
break;
////////////////////////////////////////////////
//
// MOVE DOWN
//
case dir_South:
EraseGun(item_i,items,x,y,which);
//
// ANIMATE HALF-STEP
//
if (which!=item_i->amount-1 && (items+which+1)->active)
{
y+=6;
DrawHalfStep(x,y);
}
do
{
if (which==item_i->amount-1)
which=0;
else
which++;
} while(!(items+which)->active);
DrawGun(item_i,items,x,&y,which,basey,routine);
//
// WAIT FOR BUTTON-UP OR DELAY NEXT MOVE
//
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)
{
VWB_Bar(x-1,y,25,16,BKGDCOLOR);
PrintX=item_i->x+item_i->indent;
PrintY=item_i->y+which*13;
US_Print((items+which)->string);
redrawitem=1;
}
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)
{
ShootSnd();
MenuFadeOut();
(items+which)->routine(0);
}
return which;
case 2:
SD_PlaySound(ESCPRESSEDSND);
return -1;
}
return 0; // JUST TO SHUT UP THE ERROR MESSAGES!
}
//
// ERASE GUN & DE-HIGHLIGHT STRING
//
void EraseGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int y,int which)
{
VWB_Bar(x-1,y,25,16,BKGDCOLOR);
SetTextColor(items+which,0);
PrintX=item_i->x+item_i->indent;
PrintY=item_i->y+which*13;
US_Print((items+which)->string);
VW_UpdateScreen();
}
//
// DRAW HALF STEP OF GUN TO NEXT POSITION
//
void DrawHalfStep(int x,int y)
{
VWB_DrawPic(x,y,C_CURSOR1PIC);
VW_UpdateScreen();
SD_PlaySound(MOVEGUN1SND);
TimeCount=0;
while(TimeCount<8);
}
//
// DRAW GUN AT NEW POSITION
//
void DrawGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int *y,int which,int basey,void (*routine)(int w))
{
VWB_Bar(x-1,*y,25,16,BKGDCOLOR);
*y=basey+which*13;
VWB_DrawPic(x,*y,C_CURSOR1PIC);
SetTextColor(items+which,1);
PrintX=item_i->x+item_i->indent;
PrintY=item_i->y+which*13;
US_Print((items+which)->string);
//
// CALL CUSTOM ROUTINE IF IT IS NEEDED
//
if (routine)
routine(which);
VW_UpdateScreen();
SD_PlaySound(MOVEGUN2SND);
}
////////////////////////////////////////////////////////////////////
//
// 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);
}
////////////////////////////////////////////////////////////////////
//
// Draw a menu
//
////////////////////////////////////////////////////////////////////
void DrawMenu(CP_iteminfo *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);
PrintY=item_i->y+i*13;
if ((items+i)->active)
US_Print((items+i)->string);
else
{
SETFONTCOLOR(DEACTIVE,BKGDCOLOR);
US_Print((items+i)->string);
SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);
}
US_Print("\n");
}
}
////////////////////////////////////////////////////////////////////
//
// SET TEXT COLOR (HIGHLIGHT OR NO)
//
////////////////////////////////////////////////////////////////////
void SetTextColor(CP_itemtype far *items,int hlight)
{
if (hlight)
{SETFONTCOLOR(color_hlite[items->active],BKGDCOLOR);}
else
{SETFONTCOLOR(color_norml[items->active],BKGDCOLOR);}
}
////////////////////////////////////////////////////////////////////
//
// 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]);
}
////////////////////////////////////////////////////////////////////
//
// READ KEYBOARD, JOYSTICK AND MOUSE FOR INPUT
//
////////////////////////////////////////////////////////////////////
void ReadAnyControl(ControlInfo *ci)
{
int mouseactive=0;
IN_ReadControl(0,ci);
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=
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -