summaryrefslogtreecommitdiffstats
path: root/apps/plugins/sdl/progs/wolf3d/wl_inter.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/sdl/progs/wolf3d/wl_inter.c')
-rw-r--r--apps/plugins/sdl/progs/wolf3d/wl_inter.c1723
1 files changed, 1723 insertions, 0 deletions
diff --git a/apps/plugins/sdl/progs/wolf3d/wl_inter.c b/apps/plugins/sdl/progs/wolf3d/wl_inter.c
new file mode 100644
index 0000000000..113c55c79d
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/wl_inter.c
@@ -0,0 +1,1723 @@
+// 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
+//===========================================================================