//
// 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;i3;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,0);//,0";modf
LatchDrawPic (20-14,80-3*8,GETPSYCHEDPIC);
WindowX = 0;//,0";modf
WindowY = 0;//,0";modf
WindowW = 0; //,0";modf
WindowH = 0;//,0";modf
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,0x0f);//,0";modf
#else
SETFONTCOLOR(HIGHLIGHT,0x0f);//,0";modf
#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(0x0f,0x0f);//,0";modf
PrintX = 35*8;
buffer[0]=temp;
buffer[1]=temp1;
buffer[2]=temp2;
buffer[3]=temp3;
buffer[4]=0;
US_Print(buffer);
SETFONTCOLOR(15,0x0f);//,0";modf
}
#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 = 0;//,0";modf
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("------\n");//,0";modf
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] = {
"SOD", 0XXXXXXXXXXXXX
"SND...F4", 0XXXXXXXXXXXXX
"CTRL...F6", 0XXXXXXXXXXXXX
"WINDOW...F5", 0XXXXXXXXXXXXX
"QUIT...F10"}, 0XXXXXXXXXXXXX
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] = {
"-", 0XXXXXXXXXXXXX
"-", 0XXXXXXXXXXXXX
"-", 0XXXXXXXXXXXXX
"-", 0XXXXXXXXXXXXX
"-"}, 0XXXXXXXXXXXXX
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] = {
"-", 0XXXXXXXXXXXXX
"-", 0XXXXXXXXXXXXX
"-", 0XXXXXXXXXXXXX
"-" 0XXXXXXXXXXXXX
},
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;i5;i++)
if (!_fstrcmp(s,BackDoorStrs[i]))
{
SETFONTCOLOR(0,15); 0XXXXXXXXXXXXX
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 (try3)
{
fontnumber = 1;
SETFONTCOLOR(0,15);
// VWB_DrawPic (0,0,C_BACKDROPPIC); 0XXXXXXXXXXXXX
// VWB_DrawPic (0,0,COPYPROTTOPPIC); 0XXXXXXXXXXXXX
// VWB_DrawPic (0,20*8,COPYPROTBOXPIC); 0XXXXXXXXXXXXX
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(0,15);
fontnumber = 0;
PrintY = 175;
// VWB_DrawPic (0,20*8,COPYPROTBOXPIC); 0XXXXXXXXXXXXX
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);
}