kolibrios/contrib/games/wolf3d/wl_inter.cpp
maxcodehack abebbdd698 Upload Wolfenstein 3D sources
git-svn-id: svn://kolibrios.org@8557 a494cfbc-eb01-0410-851d-a64ba20cac60
2021-01-30 12:31:40 +00:00

1724 lines
39 KiB
C++
Executable File

// WL_INTER.C
#include "wl_def.h"
#pragma hdrstop
LRstruct LevelRatios[LRpack];
int32_t lastBreathTime = 0;
void Write (int x, int y, const char *string);
//==========================================================================
/*
==================
=
= CLearSplitVWB
=
==================
*/
void
ClearSplitVWB (void)
{
WindowX = 0;
WindowY = 0;
WindowW = 320;
WindowH = 160;
}
//==========================================================================
#ifdef SPEAR
#ifndef SPEARDEMO
////////////////////////////////////////////////////////
//
// End of Spear of Destiny
//
////////////////////////////////////////////////////////
void
EndScreen (int palette, int screen)
{
SDL_Color pal[256];
CA_CacheScreen (screen);
VW_UpdateScreen ();
CA_CacheGrChunk (palette);
VL_ConvertPalette(grsegs[palette], pal, 256);
VL_FadeIn (0, 255, pal, 30);
UNCACHEGRCHUNK (palette);
IN_ClearKeysDown ();
IN_Ack ();
VW_FadeOut ();
}
void
EndSpear (void)
{
SDL_Color pal[256];
EndScreen (END1PALETTE, ENDSCREEN11PIC);
CA_CacheScreen (ENDSCREEN3PIC);
VW_UpdateScreen ();
CA_CacheGrChunk (END3PALETTE);
VL_ConvertPalette(grsegs[END3PALETTE], pal, 256);
VL_FadeIn (0, 255, pal, 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_UserInput(700);
PrintX = 0;
PrintY = 180;
VWB_Bar (0, 180, 320, 20, 0);
US_CPrint (STR_ENDGAME3 "\n");
US_CPrint (STR_ENDGAME4);
VW_UpdateScreen ();
IN_UserInput(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
int32_t 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, screenHeight / scaleFactor - STATUSLINES + 1, VIEWCOLOR);
if (bordercol != VIEWCOLOR)
DrawStatusBorder (VIEWCOLOR);
#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
for (kr = sr = tr = sec = i = 0; i < LRpack; i++)
{
sec += LevelRatios[i].time;
kr += LevelRatios[i].kill;
sr += LevelRatios[i].secret;
tr += LevelRatios[i].treasure;
}
#ifndef SPEAR
kr /= LRpack;
sr /= LRpack;
tr /= LRpack;
#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 - (int) strlen(tempstr) * 2;
Write (x, RATIOY, tempstr);
itoa (sr, tempstr, 10);
x = RATIOX + 24 - (int) strlen(tempstr) * 2;
Write (x, RATIOY + 2, tempstr);
itoa (tr, tempstr, 10);
x = RATIOX + 24 - (int) 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] = (int) ((((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 ();
VW_FadeOut ();
if(screenHeight % 200 != 0)
VL_ClearScreen(0);
#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, const char *string)
{
static const 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, len = (int) strlen(string);
char ch;
ox = nx = x * 8;
ny = y * 8;
for (i = 0; i < len; 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;
#ifndef APOGEE_1_0
case '\'':
VWB_DrawPic (nx, ny, L_APOSTROPHEPIC);
nx += 8;
continue;
#endif
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 };
SDL_Delay(5);
if ((int32_t) GetTimeCount () - lastBreathTime > max)
{
which ^= 1;
VWB_DrawPic (0, 16, pics[which]);
VW_UpdateScreen ();
lastBreathTime = GetTimeCount();
max = 35;
}
}
/*
==================
=
= LevelCompleted
=
= Entered with the screen faded out
= Still in split screen mode with the status bar
=
= Exit with the screen faded out
=
==================
*/
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;
char tempstr[10];
int32_t 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, screenHeight / scaleFactor - STATUSLINES + 1, VIEWCOLOR);
if (bordercol != VIEWCOLOR)
DrawStatusBorder (VIEWCOLOR);
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 = (int32_t) ((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 ((int32_t) i * PAR_AMOUNT, tempstr, 10);
x = 36 - (int) strlen(tempstr) * 2;
Write (x, 7, tempstr);
if (!(i % (PAR_AMOUNT / 10)))
SD_PlaySound (ENDBONUS1SND);
if(!usedoublebuffering || !(i % (PAR_AMOUNT / 50))) 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 - (int) strlen(tempstr) * 2;
Write (x, 14, tempstr);
if (!(i % 10))
SD_PlaySound (ENDBONUS1SND);
if(!usedoublebuffering || !(i & 1)) 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) - (int) 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 - (int) strlen(tempstr) * 2;
Write (x, 16, tempstr);
if (!(i % 10))
SD_PlaySound (ENDBONUS1SND);
if(!usedoublebuffering || !(i & 1)) 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) - (int) 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 - (int) strlen(tempstr) * 2;
Write (x, 18, tempstr);
if (!(i % 10))
SD_PlaySound (ENDBONUS1SND);
if(!usedoublebuffering || !(i & 1)) 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) - (int) 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 - (int) strlen(tempstr) * 2;
Write (x, 14, tempstr);
itoa (sr, tempstr, 10);
x = RATIOXX - (int) strlen(tempstr) * 2;
Write (x, 16, tempstr);
itoa (tr, tempstr, 10);
x = RATIOXX - (int) strlen(tempstr) * 2;
Write (x, 18, tempstr);
bonus = (int32_t) timeleft *PAR_AMOUNT +
(PERCENT100AMT * (kr >= 100)) +
(PERCENT100AMT * (sr >= 100)) + (PERCENT100AMT * (tr >= 100));
GivePoints (bonus);
ltoa (bonus, tempstr, 10);
x = 36 - (int) 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 ();
lastBreathTime = GetTimeCount();
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
VW_FadeOut ();
DrawPlayBorder();
UnCacheLump (LEVELEND_LUMP_START, LEVELEND_LUMP_END);
}
//==========================================================================
/*
=================
=
= PreloadGraphics
=
= Fill the cache up
=
=================
*/
boolean
PreloadUpdate (unsigned current, unsigned total)
{
unsigned w = WindowW - scaleFactor * 10;
VWB_BarScaledCoord (WindowX + scaleFactor * 5, WindowY + WindowH - scaleFactor * 3,
w, scaleFactor * 2, BLACK);
w = ((int32_t) w * current) / total;
if (w)
{
VWB_BarScaledCoord (WindowX + scaleFactor * 5, WindowY + WindowH - scaleFactor * 3,
w, scaleFactor * 2, 0x37); //SECONDCOLOR);
VWB_BarScaledCoord (WindowX + scaleFactor * 5, WindowY + WindowH - scaleFactor * 3,
w - scaleFactor * 1, scaleFactor * 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_BarScaledCoord (0, 0, screenWidth, screenHeight - scaleFactor * (STATUSLINES - 1), bordercol);
LatchDrawPicScaledCoord ((screenWidth-scaleFactor*224)/16,
(screenHeight-scaleFactor*(STATUSLINES+48))/2, GETPSYCHEDPIC);
WindowX = (screenWidth - scaleFactor*224)/2;
WindowY = (screenHeight - scaleFactor*(STATUSLINES+48))/2;
WindowW = scaleFactor * 28 * 8;
WindowH = scaleFactor * 48;
VW_UpdateScreen ();
VW_FadeIn ();
// PM_Preload (PreloadUpdate);
PreloadUpdate (10, 10);
IN_UserInput (70);
VW_FadeOut ();
DrawPlayBorder ();
VW_UpdateScreen ();
}
//==========================================================================
/*
==================
=
= DrawHighScores
=
==================
*/
void
DrawHighScores (void)
{
char buffer[16];
#ifndef SPEAR
char *str;
#ifndef UPLOAD
char buffer1[5];
#endif
#endif
word i, w, h;
HighScore *s;
#ifndef SPEAR
CA_CacheGrChunk (HIGHSCORESPIC);
CA_CacheGrChunk (STARTFONT);
#ifndef APOGEE_1_0
CA_CacheGrChunk (C_LEVELPIC);
CA_CacheGrChunk (C_SCOREPIC);
CA_CacheGrChunk (C_NAMEPIC);
#else
CA_CacheGrChunk (C_CODEPIC);
#endif
ClearMScreen ();
DrawStripes (10);
VWB_DrawPic (48, 0, HIGHSCORESPIC);
UNCACHEGRCHUNK (HIGHSCORESPIC);
#ifndef APOGEE_1_0
VWB_DrawPic (4 * 8, 68, C_NAMEPIC);
VWB_DrawPic (20 * 8, 68, C_LEVELPIC);
VWB_DrawPic (28 * 8, 68, C_SCOREPIC);
#else
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
//
itoa (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
//
itoa (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);
#ifdef APOGEE_1_0
//#ifndef UPLOAD
#ifndef SPEAR
//
// verification #
//
if (!i)
{
char temp = (((s->score >> 28) & 0xf) ^ ((s->score >> 24) & 0xf)) + 'A';
char temp1 = (((s->score >> 20) & 0xf) ^ ((s->score >> 16) & 0xf)) + 'A';
char temp2 = (((s->score >> 12) & 0xf) ^ ((s->score >> 8) & 0xf)) + 'A';
char 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 (int32_t 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, 0, 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, 0, 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 GOODTIMES
#ifndef SPEARDEMO
////////////////////////////////////////////////////////
//
// COPY PROTECTION FOR FormGen
//
////////////////////////////////////////////////////////
char 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,
""
};
char BackDoorStrs[5][16] = {
"a spoon?",
"bite me!",
"joshua",
"pelt",
"snoops"
};
char 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?",
"",
"I wish I had a 21\" monitor...",
""
};
char bossstrs[4][24] = {
"DEATH KNIGHT",
"BARNACLE WILHELM",
"UBERMUTANTUBER MUTANT",
"TRANS GROSSE"
};
char WordStr[5][20] = {
"New Game",
"Sound...F4",
"Control...F6",
"Change View...F5",
"Quit...F10"
};
char WordCorrect[5][2] = { "3", "4", "4", "5", "5" };
char MemberStr[10][40] = {
STR_COPY15,
"",
STR_COPY16,
"",
STR_COPY17,
STR_COPY18,
STR_COPY19,
STR_COPY20,
STR_COPY21,
STR_COPY22
};
char MemberCorrect[5][24] = {
"adrian carmack",
"john carmackjohn romero",
"tom hall",
"jay wilbur",
"kevin cloud"
};
char DosMessages[9][80] = {
STR_NOPE1,
STR_NOPE2,
STR_NOPE3,
STR_NOPE4,
STR_NOPE5,
STR_NOPE6,
STR_NOPE7,
STR_NOPE8,
STR_NOPE9
};
char MiscTitle[4][20] = {
"BLOOD TEST",
"STRAIGHT-LACED",
"QUITE SHAPELY",
"I AM WHAT I AMMO"
};
char MiscStr[12][40] = {
STR_MISC1,
STR_MISC2,
"",
STR_MISC3,
STR_MISC4,
"",
STR_MISC5,
STR_MISC6,
"",
STR_MISC7,
STR_MISC8,
STR_MISC9
};
char MiscCorrect[4][5] = { "ss", "8", STR_STAR, "45" };
int
BackDoor (char *s)
{
for (int i = 0; i < 5; i++)
{
if (!strcasecmp (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
unsigned i;
int match, whichboss, bossnum, attempt, whichline;
int enemypicked[4] = { 0, 0, 0, 0 };
int bosses[4] = { BOSSPIC1PIC, BOSSPIC2PIC, BOSSPIC3PIC, BOSSPIC4PIC };
int whichpicked[4] = { 0, 0, 0, 0 };
int whichone, quiztype, whichmem, whichword;
int memberpicked[5] = { 0, 0, 0, 0, 0 };
int wordpicked[5] = { 0, 0, 0, 0, 0 };
char inputbuffer[20];
char message[80];
enum
{
debriefing,
checkmanual,
staffquiz,
miscquiz,
totaltypes
};
attempt = 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 (attempt < 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, 0, true, 20, 100);
match = 0;
size_t inputlen = strlen(inputbuffer);
if(inputlen > 3)
{
size_t bosslen = strlen(bossstrs[whichboss]);
for (i = 0; i < bosslen; i++)
{
if (!strncasecmp (inputbuffer, bossstrs[whichboss] + i, inputlen))
{
match = 1;
break;
}
}
}
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);
sprintf(message, STR_MAN3 " \"%s\" " STR_MAN4, WordStr[whichword]);
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, 0, true, 6, 100);
match = 1 - (strcasecmp (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, 0, true, 20, 120);
match = 0;
size_t inputlen = strlen(inputbuffer);
if(inputlen > 2)
{
size_t memberlen = strlen(MemberCorrect[whichmem]);
for (i = 0; i < memberlen; i++)
{
if (!strncasecmp (inputbuffer, MemberCorrect[whichmem] + i, inputlen))
{
match = 1;
break;
}
}
}
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, 0, true, 6, 100);
match = 1 - (strcasecmp (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 * 6);
VW_FadeOut ();
attempt++;
}
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 ();
printf ("%s\n", DosMessages[US_RndT () % 9]);
exit (1);
}
#endif // SPEARDEMO
#endif // GOODTIMES
#endif // SPEAR
//===========================================================================