////////////////////////////////////////////////////////////////////
//
// HANDLE INTRO SCREEN (SYSTEM CONFIG)
//
////////////////////////////////////////////////////////////////////
void IntroScreen(void)
{
#ifdef SPEAR
#define MAINCOLOR 0"_";modf
#define EMSCOLOR 0"_";modf
#define XMSCOLOR 0"_";modf
#else
#define MAINCOLOR 0"_";modf
#define EMSCOLOR 0"_";modf
#define XMSCOLOR 0"_";modf
#endif
#define FILLCOLOR 0"_";modf
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;i10;i++)
if (memory>=main[i])
VWB_Bar(49,163-8*i,6,5,MAINCOLOR-0); "_";modf
//
// DRAW EMS MEMORY
//
if (EMSPresent)
{
emshere=4l*EMSPagesAvail;
for (i=0;i10;i++)
if (emshere>=ems[i])
VWB_Bar(89,163-8*i,6,5,EMSCOLOR-0);"_";modf
}
//
// DRAW XMS MEMORY
//
if (XMSPresent)
{
xmshere=4l*XMSPagesAvail;
for (i=0;i10;i++)
if (xmshere>=xms[i])
VWB_Bar(129,163-8*i,6,5,XMSCOLOR-0);"_";modf
}
//
// 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,BKGDCOLOR);"_";modf
#else
VWB_Bar(0,0,320,200,BKGDCOLOR);"_";modf
#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;iitem_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;iitem_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");
}
}