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