wolf3d/WL_INTER.C
1995-07-21 00:00:00 +00:00

1718 lines
32 KiB
C

// WL_INTER.C
#include "WL_DEF.H"
#pragma hdrstop
//==========================================================================
/*
==================
=
= CLearSplitVWB
=
==================
*/
void ClearSplitVWB (void)
{
memset (update,0,sizeof(update));
WindowX = 0;
WindowY = 0;
WindowW = 320;
WindowH = 160;
}
//==========================================================================
#ifdef SPEAR
#ifndef SPEARDEMO
////////////////////////////////////////////////////////
//
// End of Spear of Destiny
//
////////////////////////////////////////////////////////
void EndScreen (int palette, int screen)
{
CA_CacheScreen (screen);
VW_UpdateScreen ();
CA_CacheGrChunk (palette);
VL_FadeIn(0,255,grsegs[palette],30);
UNCACHEGRCHUNK (palette);
IN_ClearKeysDown ();
IN_Ack ();
VW_FadeOut ();
}
void EndSpear(void)
{
EndScreen (END1PALETTE, ENDSCREEN11PIC);
CA_CacheScreen (ENDSCREEN3PIC);
VW_UpdateScreen ();
CA_CacheGrChunk (END3PALETTE);
VL_FadeIn(0,255,grsegs[END3PALETTE],30);
UNCACHEGRCHUNK (END3PALETTE);
fontnumber = 0;
fontcolor = 0xd0;
WindowX = 0;
WindowW = 320;
PrintX = 0;
PrintY = 180;
US_CPrint (STR_ENDGAME1"\n");
US_CPrint (STR_ENDGAME2);
VW_UpdateScreen ();
IN_StartAck ();
TimeCount = 0;
while (!IN_CheckAck () && TimeCount < 700);
PrintX = 0;
PrintY = 180;
VWB_Bar(0,180,320,20,0);
US_CPrint (STR_ENDGAME3"\n");
US_CPrint (STR_ENDGAME4);
VW_UpdateScreen ();
IN_StartAck ();
TimeCount = 0;
while (!IN_CheckAck () && TimeCount < 700);
VW_FadeOut ();
EndScreen (END4PALETTE, ENDSCREEN4PIC);
EndScreen (END5PALETTE, ENDSCREEN5PIC);
EndScreen (END6PALETTE, ENDSCREEN6PIC);
EndScreen (END7PALETTE, ENDSCREEN7PIC);
EndScreen (END8PALETTE, ENDSCREEN8PIC);
EndScreen (END9PALETTE, ENDSCREEN9PIC);
EndScreen (END2PALETTE, ENDSCREEN12PIC);
MainMenu[savegame].active = 0;
}
#endif
#endif
//==========================================================================
/*
==================
=
= Victory
=
==================
*/
void Victory (void)
{
#ifndef SPEARDEMO
long sec;
int i,min,kr,sr,tr,x;
char tempstr[8];
#define RATIOX 6
#define RATIOY 14
#define TIMEX 14
#define TIMEY 8
#ifdef SPEAR
StartCPMusic (XTHEEND_MUS);
CA_CacheGrChunk(BJCOLLAPSE1PIC);
CA_CacheGrChunk(BJCOLLAPSE2PIC);
CA_CacheGrChunk(BJCOLLAPSE3PIC);
CA_CacheGrChunk(BJCOLLAPSE4PIC);
VWB_Bar(0,0,320,200,VIEWCOLOR);
VWB_DrawPic (124,44,BJCOLLAPSE1PIC);
VW_UpdateScreen ();
VW_FadeIn ();
VW_WaitVBL(2*70);
VWB_DrawPic (124,44,BJCOLLAPSE2PIC);
VW_UpdateScreen ();
VW_WaitVBL(105);
VWB_DrawPic (124,44,BJCOLLAPSE3PIC);
VW_UpdateScreen ();
VW_WaitVBL(105);
VWB_DrawPic (124,44,BJCOLLAPSE4PIC);
VW_UpdateScreen ();
VW_WaitVBL(3*70);
UNCACHEGRCHUNK(BJCOLLAPSE1PIC);
UNCACHEGRCHUNK(BJCOLLAPSE2PIC);
UNCACHEGRCHUNK(BJCOLLAPSE3PIC);
UNCACHEGRCHUNK(BJCOLLAPSE4PIC);
VL_FadeOut (0,255,0,17,17,5);
#endif
StartCPMusic (URAHERO_MUS);
ClearSplitVWB ();
CacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
CA_CacheGrChunk(STARTFONT);
#ifndef SPEAR
CA_CacheGrChunk(C_TIMECODEPIC);
#endif
VWB_Bar (0,0,320,200-STATUSLINES,127);
#ifdef JAPAN
#ifndef JAPDEMO
CA_CacheGrChunk(C_ENDRATIOSPIC);
VWB_DrawPic(0,0,C_ENDRATIOSPIC);
UNCACHEGRCHUNK(C_ENDRATIOSPIC);
#endif
#else
Write(18,2,STR_YOUWIN);
Write(TIMEX,TIMEY-2,STR_TOTALTIME);
Write(12,RATIOY-2,"averages");
#ifdef SPANISH
Write(RATIOX+2, RATIOY, STR_RATKILL);
Write(RATIOX+2, RATIOY+2, STR_RATSECRET);
Write(RATIOX+2, RATIOY+4,STR_RATTREASURE);
#else
Write(RATIOX+8,RATIOY, STR_RATKILL);
Write(RATIOX+4,RATIOY+2, STR_RATSECRET);
Write(RATIOX, RATIOY+4,STR_RATTREASURE);
#endif
#endif
#ifndef JAPDEMO
VWB_DrawPic (8,4,L_BJWINSPIC);
#endif
#ifndef SPEAR
for (kr = sr = tr = sec = i = 0;i < 8;i++)
#else
for (kr = sr = tr = sec = i = 0;i < 20;i++)
#endif
{
sec += LevelRatios[i].time;
kr += LevelRatios[i].kill;
sr += LevelRatios[i].secret;
tr += LevelRatios[i].treasure;
}
#ifndef SPEAR
kr /= 8;
sr /= 8;
tr /= 8;
#else
kr /= 14;
sr /= 14;
tr /= 14;
#endif
min = sec/60;
sec %= 60;
if (min > 99)
min = sec = 99;
i = TIMEX*8+1;
VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(min/10));
i += 2*8;
VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(min%10));
i += 2*8;
Write(i/8,TIMEY,":");
i += 1*8;
VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(sec/10));
i += 2*8;
VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(sec%10));
VW_UpdateScreen ();
itoa(kr,tempstr,10);
x=RATIOX+24-strlen(tempstr)*2;
Write(x,RATIOY,tempstr);
itoa(sr,tempstr,10);
x=RATIOX+24-strlen(tempstr)*2;
Write(x,RATIOY+2,tempstr);
itoa(tr,tempstr,10);
x=RATIOX+24-strlen(tempstr)*2;
Write(x,RATIOY+4,tempstr);
#ifndef SPANISH
#ifndef UPLOAD
#ifndef SPEAR
//
// TOTAL TIME VERIFICATION CODE
//
if (gamestate.difficulty>=gd_medium)
{
VWB_DrawPic (30*8,TIMEY*8,C_TIMECODEPIC);
fontnumber = 0;
fontcolor = READHCOLOR;
PrintX = 30*8-3;
PrintY = TIMEY*8+8;
PrintX+=4;
tempstr[0] = (((min/10)^(min%10))^0xa)+'A';
tempstr[1] = (((sec/10)^(sec%10))^0xa)+'A';
tempstr[2] = (tempstr[0]^tempstr[1])+'A';
tempstr[3] = 0;
US_Print(tempstr);
}
#endif
#endif
#endif
fontnumber = 1;
VW_UpdateScreen ();
VW_FadeIn ();
IN_Ack();
#ifndef SPEAR
if (Keyboard[sc_P] && MS_CheckParm("goobers"))
PicturePause();
#endif
VW_FadeOut ();
#ifndef SPEAR
UNCACHEGRCHUNK(C_TIMECODEPIC);
#endif
UnCacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
#ifndef SPEAR
EndText();
#else
EndSpear();
#endif
#endif // SPEARDEMO
}
//==========================================================================
#ifndef JAPAN
/*
==================
=
= PG13
=
==================
*/
void PG13 (void)
{
VW_FadeOut();
VWB_Bar(0,0,320,200,0x82); // background
CA_CacheGrChunk (PG13PIC);
VWB_DrawPic (216,110,PG13PIC);
VW_UpdateScreen ();
UNCACHEGRCHUNK (PG13PIC);
VW_FadeIn();
IN_UserInput(TickBase*7);
VW_FadeOut ();
}
#endif
//==========================================================================
void Write(int x,int y,char *string)
{
int alpha[]={L_NUM0PIC,L_NUM1PIC,L_NUM2PIC,L_NUM3PIC,L_NUM4PIC,L_NUM5PIC,
L_NUM6PIC,L_NUM7PIC,L_NUM8PIC,L_NUM9PIC,L_COLONPIC,0,0,0,0,0,0,L_APIC,L_BPIC,
L_CPIC,L_DPIC,L_EPIC,L_FPIC,L_GPIC,L_HPIC,L_IPIC,L_JPIC,L_KPIC,
L_LPIC,L_MPIC,L_NPIC,L_OPIC,L_PPIC,L_QPIC,L_RPIC,L_SPIC,L_TPIC,
L_UPIC,L_VPIC,L_WPIC,L_XPIC,L_YPIC,L_ZPIC};
int i,ox,nx,ny;
char ch;
ox=nx=x*8;
ny=y*8;
for (i=0;i<strlen(string);i++)
if (string[i]=='\n')
{
nx=ox;
ny+=16;
}
else
{
ch=string[i];
if (ch>='a')
ch-=('a'-'A');
ch-='0';
switch(string[i])
{
case '!':
VWB_DrawPic(nx,ny,L_EXPOINTPIC);
nx+=8;
continue;
case '\'':
VWB_DrawPic(nx,ny,L_APOSTROPHEPIC);
nx+=8;
continue;
case ' ': break;
case 0x3a: // ':'
VWB_DrawPic(nx,ny,L_COLONPIC);
nx+=8;
continue;
case '%':
VWB_DrawPic(nx,ny,L_PERCENTPIC);
break;
default:
VWB_DrawPic(nx,ny,alpha[ch]);
}
nx+=16;
}
}
//
// Breathe Mr. BJ!!!
//
void BJ_Breathe(void)
{
static int which=0,max=10;
int pics[2]={L_GUYPIC,L_GUY2PIC};
if (TimeCount>max)
{
which^=1;
VWB_DrawPic(0,16,pics[which]);
VW_UpdateScreen();
TimeCount=0;
max=35;
}
}
/*
==================
=
= LevelCompleted
=
= Entered with the screen faded out
= Still in split screen mode with the status bar
=
= Exit with the screen faded out
=
==================
*/
#ifndef SPEAR
LRstruct LevelRatios[8];
#else
LRstruct LevelRatios[20];
#endif
void LevelCompleted (void)
{
#define VBLWAIT 30
#define PAR_AMOUNT 500
#define PERCENT100AMT 10000
typedef struct {
float time;
char timestr[6];
} times;
int x,i,min,sec,ratio,kr,sr,tr;
unsigned temp;
char tempstr[10];
long bonus,timeleft=0;
times parTimes[]=
{
#ifndef SPEAR
//
// Episode One Par Times
//
{1.5, "01:30"},
{2, "02:00"},
{2, "02:00"},
{3.5, "03:30"},
{3, "03:00"},
{3, "03:00"},
{2.5, "02:30"},
{2.5, "02:30"},
{0, "??:??"}, // Boss level
{0, "??:??"}, // Secret level
//
// Episode Two Par Times
//
{1.5, "01:30"},
{3.5, "03:30"},
{3, "03:00"},
{2, "02:00"},
{4, "04:00"},
{6, "06:00"},
{1, "01:00"},
{3, "03:00"},
{0, "??:??"},
{0, "??:??"},
//
// Episode Three Par Times
//
{1.5, "01:30"},
{1.5, "01:30"},
{2.5, "02:30"},
{2.5, "02:30"},
{3.5, "03:30"},
{2.5, "02:30"},
{2, "02:00"},
{6, "06:00"},
{0, "??:??"},
{0, "??:??"},
//
// Episode Four Par Times
//
{2, "02:00"},
{2, "02:00"},
{1.5, "01:30"},
{1, "01:00"},
{4.5, "04:30"},
{3.5, "03:30"},
{2, "02:00"},
{4.5, "04:30"},
{0, "??:??"},
{0, "??:??"},
//
// Episode Five Par Times
//
{2.5, "02:30"},
{1.5, "01:30"},
{2.5, "02:30"},
{2.5, "02:30"},
{4, "04:00"},
{3, "03:00"},
{4.5, "04:30"},
{3.5, "03:30"},
{0, "??:??"},
{0, "??:??"},
//
// Episode Six Par Times
//
{6.5, "06:30"},
{4, "04:00"},
{4.5, "04:30"},
{6, "06:00"},
{5, "05:00"},
{5.5, "05:30"},
{5.5, "05:30"},
{8.5, "08:30"},
{0, "??:??"},
{0, "??:??"}
#else
//
// SPEAR OF DESTINY TIMES
//
{1.5, "01:30"},
{3.5, "03:30"},
{2.75, "02:45"},
{3.5, "03:30"},
{0, "??:??"}, // Boss 1
{4.5, "04:30"},
{3.25, "03:15"},
{2.75, "02:45"},
{4.75, "04:45"},
{0, "??:??"}, // Boss 2
{6.5, "06:30"},
{4.5, "04:30"},
{2.75, "02:45"},
{4.5, "04:30"},
{6, "06:00"},
{0, "??:??"}, // Boss 3
{6, "06:00"},
{0, "??:??"}, // Boss 4
{0, "??:??"}, // Secret level 1
{0, "??:??"}, // Secret level 2
#endif
};
CacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
ClearSplitVWB (); // set up for double buffering in split screen
VWB_Bar (0,0,320,200-STATUSLINES,127);
StartCPMusic(ENDLEVEL_MUS);
//
// do the intermission
//
IN_ClearKeysDown();
IN_StartAck();
#ifdef JAPAN
CA_CacheGrChunk(C_INTERMISSIONPIC);
VWB_DrawPic(0,0,C_INTERMISSIONPIC);
UNCACHEGRCHUNK(C_INTERMISSIONPIC);
#endif
VWB_DrawPic(0,16,L_GUYPIC);
#ifndef SPEAR
if (mapon<8)
#else
if (mapon != 4 &&
mapon != 9 &&
mapon != 15 &&
mapon < 17)
#endif
{
#ifndef JAPAN
#ifdef SPANISH
Write(14,2,"piso\ncompletado");
#else
Write(14,2,"floor\ncompleted");
#endif
Write(14,7,STR_BONUS" 0");
Write(16,10,STR_TIME);
Write(16,12,STR_PAR);
#ifdef SPANISH
Write(11,14, STR_RAT2KILL);
Write(11,16, STR_RAT2SECRET);
Write(11,18,STR_RAT2TREASURE);
#else
Write(9,14, STR_RAT2KILL);
Write(5,16, STR_RAT2SECRET);
Write(1,18,STR_RAT2TREASURE);
#endif
Write(26,2,itoa(gamestate.mapon+1,tempstr,10));
#endif
#ifdef SPANISH
Write(30,12,parTimes[gamestate.episode*10+mapon].timestr);
#else
Write(26,12,parTimes[gamestate.episode*10+mapon].timestr);
#endif
//
// PRINT TIME
//
sec=gamestate.TimeCount/70;
if (sec > 99*60) // 99 minutes max
sec = 99*60;
if (gamestate.TimeCount<parTimes[gamestate.episode*10+mapon].time*4200)
timeleft=(parTimes[gamestate.episode*10+mapon].time*4200)/70-sec;
min=sec/60;
sec%=60;
#ifdef SPANISH
i=30*8;
#else
i=26*8;
#endif
VWB_DrawPic(i,10*8,L_NUM0PIC+(min/10));
i+=2*8;
VWB_DrawPic(i,10*8,L_NUM0PIC+(min%10));
i+=2*8;
Write(i/8,10,":");
i+=1*8;
VWB_DrawPic(i,10*8,L_NUM0PIC+(sec/10));
i+=2*8;
VWB_DrawPic(i,10*8,L_NUM0PIC+(sec%10));
VW_UpdateScreen ();
VW_FadeIn ();
//
// FIGURE RATIOS OUT BEFOREHAND
//
kr = sr = tr = 0;
if (gamestate.killtotal)
kr=(gamestate.killcount*100)/gamestate.killtotal;
if (gamestate.secrettotal)
sr=(gamestate.secretcount*100)/gamestate.secrettotal;
if (gamestate.treasuretotal)
tr=(gamestate.treasurecount*100)/gamestate.treasuretotal;
//
// PRINT TIME BONUS
//
bonus=timeleft*PAR_AMOUNT;
if (bonus)
{
for (i=0;i<=timeleft;i++)
{
ltoa((long)i*PAR_AMOUNT,tempstr,10);
x=36-strlen(tempstr)*2;
Write(x,7,tempstr);
if (!(i%(PAR_AMOUNT/10)))
SD_PlaySound(ENDBONUS1SND);
VW_UpdateScreen();
while(SD_SoundPlaying())
BJ_Breathe();
if (IN_CheckAck())
goto done;
}
VW_UpdateScreen();
SD_PlaySound(ENDBONUS2SND);
while(SD_SoundPlaying())
BJ_Breathe();
}
#ifdef SPANISH
#define RATIOXX 33
#else
#define RATIOXX 37
#endif
//
// KILL RATIO
//
ratio=kr;
for (i=0;i<=ratio;i++)
{
itoa(i,tempstr,10);
x=RATIOXX-strlen(tempstr)*2;
Write(x,14,tempstr);
if (!(i%10))
SD_PlaySound(ENDBONUS1SND);
VW_UpdateScreen ();
while(SD_SoundPlaying())
BJ_Breathe();
if (IN_CheckAck())
goto done;
}
if (ratio==100)
{
VW_WaitVBL(VBLWAIT);
SD_StopSound();
bonus+=PERCENT100AMT;
ltoa(bonus,tempstr,10);
x=(RATIOXX-1)-strlen(tempstr)*2;
Write(x,7,tempstr);
VW_UpdateScreen();
SD_PlaySound(PERCENT100SND);
}
else
if (!ratio)
{
VW_WaitVBL(VBLWAIT);
SD_StopSound();
SD_PlaySound(NOBONUSSND);
}
else
SD_PlaySound(ENDBONUS2SND);
VW_UpdateScreen();
while(SD_SoundPlaying())
BJ_Breathe();
//
// SECRET RATIO
//
ratio=sr;
for (i=0;i<=ratio;i++)
{
itoa(i,tempstr,10);
x=RATIOXX-strlen(tempstr)*2;
Write(x,16,tempstr);
if (!(i%10))
SD_PlaySound(ENDBONUS1SND);
VW_UpdateScreen ();
while(SD_SoundPlaying())
BJ_Breathe();
BJ_Breathe();
if (IN_CheckAck())
goto done;
}
if (ratio==100)
{
VW_WaitVBL(VBLWAIT);
SD_StopSound();
bonus+=PERCENT100AMT;
ltoa(bonus,tempstr,10);
x=(RATIOXX-1)-strlen(tempstr)*2;
Write(x,7,tempstr);
VW_UpdateScreen();
SD_PlaySound(PERCENT100SND);
}
else
if (!ratio)
{
VW_WaitVBL(VBLWAIT);
SD_StopSound();
SD_PlaySound(NOBONUSSND);
}
else
SD_PlaySound(ENDBONUS2SND);
VW_UpdateScreen();
while(SD_SoundPlaying())
BJ_Breathe();
//
// TREASURE RATIO
//
ratio=tr;
for (i=0;i<=ratio;i++)
{
itoa(i,tempstr,10);
x=RATIOXX-strlen(tempstr)*2;
Write(x,18,tempstr);
if (!(i%10))
SD_PlaySound(ENDBONUS1SND);
VW_UpdateScreen ();
while(SD_SoundPlaying())
BJ_Breathe();
if (IN_CheckAck())
goto done;
}
if (ratio==100)
{
VW_WaitVBL(VBLWAIT);
SD_StopSound();
bonus+=PERCENT100AMT;
ltoa(bonus,tempstr,10);
x=(RATIOXX-1)-strlen(tempstr)*2;
Write(x,7,tempstr);
VW_UpdateScreen();
SD_PlaySound(PERCENT100SND);
}
else
if (!ratio)
{
VW_WaitVBL(VBLWAIT);
SD_StopSound();
SD_PlaySound(NOBONUSSND);
}
else
SD_PlaySound(ENDBONUS2SND);
VW_UpdateScreen();
while(SD_SoundPlaying())
BJ_Breathe();
//
// JUMP STRAIGHT HERE IF KEY PRESSED
//
done:
itoa(kr,tempstr,10);
x=RATIOXX-strlen(tempstr)*2;
Write(x,14,tempstr);
itoa(sr,tempstr,10);
x=RATIOXX-strlen(tempstr)*2;
Write(x,16,tempstr);
itoa(tr,tempstr,10);
x=RATIOXX-strlen(tempstr)*2;
Write(x,18,tempstr);
bonus=(long)timeleft*PAR_AMOUNT+
(PERCENT100AMT*(kr==100))+
(PERCENT100AMT*(sr==100))+
(PERCENT100AMT*(tr==100));
GivePoints(bonus);
ltoa(bonus,tempstr,10);
x=36-strlen(tempstr)*2;
Write(x,7,tempstr);
//
// SAVE RATIO INFORMATION FOR ENDGAME
//
LevelRatios[mapon].kill=kr;
LevelRatios[mapon].secret=sr;
LevelRatios[mapon].treasure=tr;
LevelRatios[mapon].time=min*60+sec;
}
else
{
#ifdef SPEAR
#ifndef SPEARDEMO
switch(mapon)
{
case 4: Write(14,4," trans\n"
" grosse\n"
STR_DEFEATED); break;
case 9: Write(14,4,"barnacle\n"
"wilhelm\n"
STR_DEFEATED); break;
case 15: Write(14,4,"ubermutant\n"
STR_DEFEATED); break;
case 17: Write(14,4," death\n"
" knight\n"
STR_DEFEATED); break;
case 18: Write(13,4,"secret tunnel\n"
" area\n"
" completed!"); break;
case 19: Write(13,4,"secret castle\n"
" area\n"
" completed!"); break;
}
#endif
#else
Write(14,4,"secret floor\n completed!");
#endif
Write(10,16,"15000 bonus!");
VW_UpdateScreen();
VW_FadeIn();
GivePoints(15000);
}
DrawScore();
VW_UpdateScreen();
TimeCount=0;
IN_StartAck();
while(!IN_CheckAck())
BJ_Breathe();
//
// done
//
#ifdef SPEARDEMO
if (gamestate.mapon == 1)
{
SD_PlaySound (BONUS1UPSND);
CA_CacheGrChunk (STARTFONT+1);
Message ("This concludes your demo\n"
"of Spear of Destiny! Now,\n"
"go to your local software\n"
"store and buy it!");
UNCACHEGRCHUNK (STARTFONT+1);
IN_ClearKeysDown();
IN_Ack();
}
#endif
#ifdef JAPDEMO
if (gamestate.mapon == 3)
{
SD_PlaySound (BONUS1UPSND);
CA_CacheGrChunk (STARTFONT+1);
Message ("This concludes your demo\n"
"of Wolfenstein 3-D! Now,\n"
"go to your local software\n"
"store and buy it!");
UNCACHEGRCHUNK (STARTFONT+1);
IN_ClearKeysDown();
IN_Ack();
}
#endif
#ifndef SPEAR
if (Keyboard[sc_P] && MS_CheckParm("goobers"))
PicturePause();
#endif
VW_FadeOut ();
temp = bufferofs;
for (i=0;i<3;i++)
{
bufferofs = screenloc[i];
DrawPlayBorder ();
}
bufferofs = temp;
UnCacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END);
}
//==========================================================================
/*
=================
=
= PreloadGraphics
=
= Fill the cache up
=
=================
*/
boolean PreloadUpdate(unsigned current, unsigned total)
{
unsigned w = WindowW - 10;
VWB_Bar(WindowX + 5,WindowY + WindowH - 3,w,2,BLACK);
w = ((long)w * current) / total;
if (w)
{
VWB_Bar(WindowX + 5,WindowY + WindowH - 3,w,2,0x37); //SECONDCOLOR);
VWB_Bar(WindowX + 5,WindowY + WindowH - 3,w-1,1,0x32);
}
VW_UpdateScreen();
// if (LastScan == sc_Escape)
// {
// IN_ClearKeysDown();
// return(true);
// }
// else
return(false);
}
void PreloadGraphics(void)
{
DrawLevel ();
ClearSplitVWB (); // set up for double buffering in split screen
VWB_Bar (0,0,320,200-STATUSLINES,127);
LatchDrawPic (20-14,80-3*8,GETPSYCHEDPIC);
WindowX = 160-14*8;
WindowY = 80-3*8;
WindowW = 28*8;
WindowH = 48;
VW_UpdateScreen();
VW_FadeIn ();
PM_Preload (PreloadUpdate);
IN_UserInput (70);
VW_FadeOut ();
DrawPlayBorder ();
VW_UpdateScreen ();
}
//==========================================================================
/*
==================
=
= DrawHighScores
=
==================
*/
void DrawHighScores(void)
{
char buffer[16],*str,buffer1[5];
byte temp,temp1,temp2,temp3;
word i,j,
w,h,
x,y;
HighScore *s;
MM_SortMem ();
#ifndef SPEAR
// CA_CacheGrChunk (C_CODEPIC);
CA_CacheGrChunk (HIGHSCORESPIC);
CA_CacheGrChunk (STARTFONT);
CA_CacheGrChunk (C_LEVELPIC);
CA_CacheGrChunk (C_SCOREPIC);
CA_CacheGrChunk (C_NAMEPIC);
ClearMScreen();
DrawStripes(10);
VWB_DrawPic(48,0,HIGHSCORESPIC);
UNCACHEGRCHUNK (HIGHSCORESPIC);
VWB_DrawPic(4*8,68,C_NAMEPIC);
VWB_DrawPic(20*8,68,C_LEVELPIC);
VWB_DrawPic(28*8,68,C_SCOREPIC);
#ifndef UPLOAD
// VWB_DrawPic(35*8,68,C_CODEPIC);
#endif
fontnumber=0;
#else
CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
ClearMScreen();
DrawStripes(10);
UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);
CacheLump (HIGHSCORES_LUMP_START,HIGHSCORES_LUMP_END);
CA_CacheGrChunk (STARTFONT+1);
VWB_DrawPic (0,0,HIGHSCORESPIC);
fontnumber = 1;
#endif
#ifndef SPEAR
SETFONTCOLOR(15,0x29);
#else
SETFONTCOLOR(HIGHLIGHT,0x29);
#endif
for (i = 0,s = Scores;i < MaxScores;i++,s++)
{
PrintY = 76 + (16 * i);
//
// name
//
#ifndef SPEAR
PrintX = 4*8;
#else
PrintX = 16;
#endif
US_Print(s->name);
//
// level
//
ultoa(s->completed,buffer,10);
#ifndef SPEAR
for (str = buffer;*str;str++)
*str = *str + (129 - '0'); // Used fixed-width numbers (129...)
USL_MeasureString(buffer,&w,&h);
PrintX = (22 * 8)-w;
#else
USL_MeasureString(buffer,&w,&h);
PrintX = 194 - w;
#endif
#ifndef UPLOAD
#ifndef SPEAR
PrintX -= 6;
itoa(s->episode+1,buffer1,10);
US_Print("E");
US_Print(buffer1);
US_Print("/L");
#endif
#endif
#ifdef SPEAR
if (s->completed == 21)
VWB_DrawPic (PrintX+8,PrintY-1,C_WONSPEARPIC);
else
#endif
US_Print(buffer);
//
// score
//
ultoa(s->score,buffer,10);
#ifndef SPEAR
for (str = buffer;*str;str++)
*str = *str + (129 - '0'); // Used fixed-width numbers (129...)
USL_MeasureString(buffer,&w,&h);
PrintX = (34 * 8) - 8 - w;
#else
USL_MeasureString(buffer,&w,&h);
PrintX = 292 - w;
#endif
US_Print(buffer);
#if 0
#ifndef UPLOAD
#ifndef SPEAR
//
// verification #
//
if (!i)
{
temp=(((s->score >> 28)& 0xf)^
((s->score >> 24)& 0xf))+'A';
temp1=(((s->score >> 20)& 0xf)^
((s->score >> 16)& 0xf))+'A';
temp2=(((s->score >> 12)& 0xf)^
((s->score >> 8)& 0xf))+'A';
temp3=(((s->score >> 4)& 0xf)^
((s->score >> 0)& 0xf))+'A';
SETFONTCOLOR(0x49,0x29);
PrintX = 35*8;
buffer[0]=temp;
buffer[1]=temp1;
buffer[2]=temp2;
buffer[3]=temp3;
buffer[4]=0;
US_Print(buffer);
SETFONTCOLOR(15,0x29);
}
#endif
#endif
#endif
}
VW_UpdateScreen ();
#ifdef SPEAR
UnCacheLump (HIGHSCORES_LUMP_START,HIGHSCORES_LUMP_END);
fontnumber = 0;
#endif
}
//===========================================================================
/*
=======================
=
= CheckHighScore
=
=======================
*/
void CheckHighScore (long score,word other)
{
word i,j;
int n;
HighScore myscore;
strcpy(myscore.name,"");
myscore.score = score;
myscore.episode = gamestate.episode;
myscore.completed = other;
for (i = 0,n = -1;i < MaxScores;i++)
{
if
(
(myscore.score > Scores[i].score)
|| (
(myscore.score == Scores[i].score)
&& (myscore.completed > Scores[i].completed)
)
)
{
for (j = MaxScores;--j > i;)
Scores[j] = Scores[j - 1];
Scores[i] = myscore;
n = i;
break;
}
}
#ifdef SPEAR
StartCPMusic (XAWARD_MUS);
#else
StartCPMusic (ROSTER_MUS);
#endif
DrawHighScores ();
VW_FadeIn ();
if (n != -1)
{
//
// got a high score
//
PrintY = 76 + (16 * n);
#ifndef SPEAR
PrintX = 4*8;
backcolor = BORDCOLOR;
fontcolor = 15;
US_LineInput(PrintX,PrintY,Scores[n].name,nil,true,MaxHighName,100);
#else
PrintX = 16;
fontnumber = 1;
VWB_Bar (PrintX-2,PrintY-2,145,15,0x9c);
VW_UpdateScreen ();
backcolor = 0x9c;
fontcolor = 15;
US_LineInput(PrintX,PrintY,Scores[n].name,nil,true,MaxHighName,130);
#endif
}
else
{
IN_ClearKeysDown ();
IN_UserInput(500);
}
}
#ifndef UPLOAD
#ifndef SPEAR
#ifndef JAPAN
////////////////////////////////////////////////////////
//
// NON-SHAREWARE NOTICE
//
////////////////////////////////////////////////////////
void NonShareware(void)
{
VW_FadeOut();
ClearMScreen();
DrawStripes(10);
CA_CacheGrChunk(STARTFONT+1);
fontnumber = 1;
SETFONTCOLOR(READHCOLOR,BKGDCOLOR);
PrintX=110;
PrintY=15;
#ifdef SPANISH
US_Print("Atencion");
#else
US_Print("Attention");
#endif
SETFONTCOLOR(HIGHLIGHT,BKGDCOLOR);
WindowX=PrintX=40;
PrintY=60;
#ifdef SPANISH
US_Print("Este juego NO es gratis y\n");
US_Print("NO es Shareware; favor de\n");
US_Print("no distribuirlo.\n\n");
#else
US_Print("This game is NOT shareware.\n");
US_Print("Please do not distribute it.\n");
US_Print("Thanks.\n\n");
#endif
US_Print(" Id Software\n");
VW_UpdateScreen ();
VW_FadeIn();
IN_Ack();
}
#endif
#endif
#endif
#ifdef SPEAR
#ifndef SPEARDEMO
////////////////////////////////////////////////////////
//
// COPY PROTECTION FOR FormGen
//
////////////////////////////////////////////////////////
char far CopyProFailedStrs[][100] = {
STR_COPY1,
STR_COPY2,
STR_COPY3,
STR_COPY4,
STR_COPY5,
STR_COPY6,
STR_COPY7,
STR_COPY8,
STR_COPY9,
"",
STR_COPY10,
STR_COPY11,
STR_COPY12,
"",
STR_COPY13,
"",
STR_COPY14,
""
},
far BackDoorStrs[5][16] = {
"a spoon?",
"bite me!",
"joshua",
"pelt",
#ifdef BETA
"beta"
#else
"snoops"
#endif
},
far GoodBoyStrs[10][40] = {
"...is the CORRECT ANSWER!",
"",
"Consider yourself bitten, sir.",
"",
"Greetings Professor Falken, would you",
"like to play Spear of Destiny?",
"Do you have any gold spray paint?",
"",
#ifdef BETA
"Beta testing approved.",
#else
"I wish I had a 21\" monitor...",
#endif
""
},
far bossstrs[4][24] = {
"DEATH KNIGHT",
"BARNACLE WILHELM",
"UBERMUTANTUBER MUTANT",
"TRANS GROSSE"
},
far WordStr[5][20] = {
"New Game",
"Sound...F4",
"Control...F6",
"Change View...F5",
"Quit...F10"},
far WordCorrect[5][2] = {"3","4","4","5","5"},
far MemberStr[10][40] = {
STR_COPY15,
"",
STR_COPY16,
"",
STR_COPY17,
STR_COPY18,
STR_COPY19,
STR_COPY20,
STR_COPY21,
STR_COPY22},
far MemberCorrect[5][24] = {
"adrian carmack",
"john carmackjohn romero",
"tom hall",
"jay wilbur",
"kevin cloud"},
far DosMessages[9][80] = {
STR_NOPE1,
STR_NOPE2,
STR_NOPE3,
STR_NOPE4,
STR_NOPE5,
STR_NOPE6,
STR_NOPE7,
STR_NOPE8,
STR_NOPE9},
far MiscTitle[4][20] = {
"BLOOD TEST",
"STRAIGHT-LACED",
"QUITE SHAPELY",
"I AM WHAT I AMMO"
},
far MiscStr[12][40] = {
STR_MISC1,
STR_MISC2,
"",
STR_MISC3,
STR_MISC4,
"",
STR_MISC5,
STR_MISC6,
"",
STR_MISC7,
STR_MISC8,
STR_MISC9
},
far MiscCorrect[4][5] = {"ss","8",STR_STAR,"45"};
int BackDoor(char *s)
{
int i;
strlwr(s);
for (i=0;i<5;i++)
if (!_fstrcmp(s,BackDoorStrs[i]))
{
SETFONTCOLOR(14,15);
fontnumber = 0;
PrintY = 175;
VWB_DrawPic (0,20*8,COPYPROTBOXPIC);
US_CPrint(GoodBoyStrs[i*2]);
US_CPrint(GoodBoyStrs[i*2+1]);
VW_UpdateScreen();
return 1;
}
return 0;
}
void CopyProtection(void)
{
#define TYPEBOX_Y 177
#define TYPEBOX_BKGD 0x9c
#define PRINTCOLOR HIGHLIGHT
int i,match,whichboss,bossnum,try,whichline,enemypicked[4]={0,0,0,0},
bosses[4] = { BOSSPIC1PIC,BOSSPIC2PIC,BOSSPIC3PIC,BOSSPIC4PIC },
whichone,whichpicked[4]={0,0,0,0},quiztype,whichmem,
memberpicked[5]={0,0,0,0,0},wordpicked[5]={0,0,0,0,0},whichword;
char inputbuffer[20],
message[80];
enum
{
debriefing,
checkmanual,
staffquiz,
miscquiz,
totaltypes
};
try = 0;
VW_FadeOut();
CA_CacheGrChunk(C_BACKDROPPIC);
CacheLump(COPYPROT_LUMP_START,COPYPROT_LUMP_END);
CA_CacheGrChunk(STARTFONT+1);
CA_LoadAllSounds();
StartCPMusic(COPYPRO_MUS);
US_InitRndT(true);
while (try<3)
{
fontnumber = 1;
SETFONTCOLOR(PRINTCOLOR-2,15);
VWB_DrawPic (0,0,C_BACKDROPPIC);
VWB_DrawPic (0,0,COPYPROTTOPPIC);
VWB_DrawPic (0,20*8,COPYPROTBOXPIC);
WindowX = WindowY = 0;
WindowW = 320;
WindowH = 200;
PrintY = 65;
quiztype = US_RndT()%totaltypes;
switch(quiztype)
{
//
// BOSSES QUIZ
//
case debriefing:
PrintX = 0;
US_Print(STR_DEBRIEF);
SETFONTCOLOR(PRINTCOLOR,15);
while (enemypicked[whichboss = US_RndT()&3]);
enemypicked[whichboss] = 1;
bossnum = bosses[whichboss];
VWB_DrawPic(128,60,bossnum);
fontnumber = 0;
PrintY = 130;
US_CPrint(STR_ENEMY1"\n");
US_CPrint(STR_ENEMY2"\n\n");
VW_UpdateScreen();
VW_FadeIn();
PrintX = 100;
fontcolor = 15;
backcolor = TYPEBOX_BKGD;
inputbuffer[0] = 0;
PrintY = TYPEBOX_Y;
fontnumber = 1;
US_LineInput(PrintX,PrintY,inputbuffer,nil,true,20,100);
match = 0;
for (i=0;i<_fstrlen(bossstrs[whichboss]);i++)
if (!_fstrnicmp(inputbuffer,bossstrs[whichboss]+i,strlen(inputbuffer)) &&
strlen(inputbuffer)>3)
match = 1;
match += BackDoor(inputbuffer);
break;
//
// MANUAL CHECK
//
case checkmanual:
while (wordpicked[whichword = US_RndT()%5]);
wordpicked[whichword] = 1;
US_CPrint(STR_CHECKMAN);
SETFONTCOLOR(PRINTCOLOR,15);
PrintY += 25;
US_CPrint(STR_MAN1);
US_CPrint(STR_MAN2);
_fstrcpy(message,STR_MAN3" \"");
_fstrcat(message,WordStr[whichword]);
_fstrcat(message,"\" "STR_MAN4);
US_CPrint(message);
VW_UpdateScreen();
VW_FadeIn();
PrintX = 146;
fontcolor = 15;
backcolor = TYPEBOX_BKGD;
inputbuffer[0] = 0;
PrintY = TYPEBOX_Y;
US_LineInput(PrintX,PrintY,inputbuffer,nil,true,6,100);
strlwr(inputbuffer);
match = 1-(_fstrcmp(inputbuffer,WordCorrect[whichword])!=0);
match += BackDoor(inputbuffer);
break;
//
// STAFF QUIZ
//
case staffquiz:
while (memberpicked[whichmem = US_RndT()%5]);
memberpicked[whichmem] = 1;
US_CPrint(STR_ID1);
SETFONTCOLOR(PRINTCOLOR,15);
PrintY += 25;
US_CPrint(MemberStr[whichmem*2]);
US_CPrint(MemberStr[whichmem*2+1]);
VW_UpdateScreen();
VW_FadeIn();
PrintX = 100;
fontcolor = 15;
backcolor = TYPEBOX_BKGD;
inputbuffer[0] = 0;
PrintY = TYPEBOX_Y;
US_LineInput(PrintX,PrintY,inputbuffer,nil,true,20,120);
strlwr(inputbuffer);
match = 0;
for (i=0;i<_fstrlen(MemberCorrect[whichmem]);i++)
if (!_fstrnicmp(inputbuffer,MemberCorrect[whichmem]+i,strlen(inputbuffer)) &&
strlen(inputbuffer)>2)
match = 1;
match += BackDoor(inputbuffer);
break;
//
// MISCELLANEOUS QUESTIONS
//
case miscquiz:
while (whichpicked[whichone = US_RndT()&3]);
whichpicked[whichone] = 1;
US_CPrint(MiscTitle[whichone]);
SETFONTCOLOR(PRINTCOLOR,15);
PrintY += 25;
US_CPrint(MiscStr[whichone*3]);
US_CPrint(MiscStr[whichone*3+1]);
US_CPrint(MiscStr[whichone*3+2]);
VW_UpdateScreen();
VW_FadeIn();
PrintX = 146;
fontcolor = 15;
backcolor = TYPEBOX_BKGD;
inputbuffer[0] = 0;
PrintY = TYPEBOX_Y;
US_LineInput(PrintX,PrintY,inputbuffer,nil,true,6,100);
strlwr(inputbuffer);
match = 1-(_fstrcmp(inputbuffer,MiscCorrect[whichone])!=0);
match += BackDoor(inputbuffer);
break;
}
//
// IF NO MATCH, WE'VE GOT A (MINOR) PROBLEM!
//
if (!match)
{
whichline = 2*(US_RndT()%9);
SETFONTCOLOR(14,15);
fontnumber = 0;
PrintY = 175;
VWB_DrawPic (0,20*8,COPYPROTBOXPIC);
US_CPrint(CopyProFailedStrs[whichline]);
US_CPrint(CopyProFailedStrs[whichline+1]);
VW_UpdateScreen();
SD_PlaySound(NOWAYSND);
IN_UserInput(TickBase*3);
VW_FadeOut();
try++;
}
else
{
int start;
SD_PlaySound(BONUS1UPSND);
SD_WaitSoundDone();
UNCACHEGRCHUNK (STARTFONT+1);
UNCACHEGRCHUNK (C_BACKDROPPIC);
UnCacheLump (COPYPROT_LUMP_START,COPYPROT_LUMP_END);
switch(SoundMode)
{
case sdm_Off: return;
case sdm_PC: start = STARTPCSOUNDS; break;
case sdm_AdLib: start = STARTADLIBSOUNDS;
}
for (i=0;i<NUMSOUNDS;i++,start++)
MM_FreePtr ((memptr *)&audiosegs[start]);
return;
}
}
ClearMemory();
ShutdownId();
_fstrcpy(message,DosMessages[US_RndT()%9]);
_AX = 3;
geninterrupt(0x10);
printf("%s\n",message);
exit(1);
}
#endif // SPEARDEMO
#endif // SPEAR
//===========================================================================