#include "wl_def.h" /* ================== = = CLearSplitVWB = ================== */ void ClearSplitVWB() { WindowX = 0; WindowY = 0; WindowW = 320; WindowH = 160; } /* ======================================================================== */ #if defined(SPEAR) && !defined(SPEARDEMO) //////////////////////////////////////////////////////// // // End of Spear of Destiny // //////////////////////////////////////////////////////// void EndScreen(int palette, int screen) { VL_CacheScreen(screen); VW_UpdateScreen(); CA_CacheGrChunk(palette); VL_FadeIn(0, 255, grsegs[palette], 30); CA_UnCacheGrChunk(palette); IN_ClearKeysDown(); IN_Ack(); VW_FadeOut(); } void EndSpear() { EndScreen(END1PALETTE, ENDSCREEN11PIC); VL_CacheScreen(ENDSCREEN3PIC); VW_UpdateScreen(); CA_CacheGrChunk(END3PALETTE); VL_FadeIn(0, 255, grsegs[END3PALETTE], 30); CA_UnCacheGrChunk(END3PALETTE); fontnumber = 0; fontcolor = 0xd0; WindowX = 0; WindowW = 320; PrintX = 0; PrintY = 180; US_CPrint(STR_ENDGAME1"\n"); US_CPrint(STR_ENDGAME2); VW_UpdateScreen(); IN_StartAck (); set_TimeCount(0); while ( !IN_CheckAck () && (get_TimeCount() < 700) ); PrintX = 0; PrintY = 180; VW_Bar(0,180,320,20,0); US_CPrint(STR_ENDGAME3"\n"); US_CPrint(STR_ENDGAME4); VW_UpdateScreen(); IN_StartAck (); set_TimeCount(0); while ( !IN_CheckAck () && (get_TimeCount() < 700) ); VW_FadeOut (); EndScreen (END4PALETTE, ENDSCREEN4PIC); EndScreen (END5PALETTE, ENDSCREEN5PIC); EndScreen (END6PALETTE, ENDSCREEN6PIC); EndScreen (END7PALETTE, ENDSCREEN7PIC); EndScreen (END8PALETTE, ENDSCREEN8PIC); EndScreen (END9PALETTE, ENDSCREEN9PIC); EndScreen (END2PALETTE, ENDSCREEN12PIC); MainMenu[savegame].active = 0; } #endif /* ======================================================================== */ /* ================== = = Victory = ================== */ void Victory() { #ifndef SPEARDEMO long sec; int i,min,kr,sr,tr,x; char tempstr[8]; #define RATIOX 6 #define RATIOY 14 #define TIMEX 14 #define TIMEY 8 #ifdef SPEAR StartCPMusic(XTHEEND_MUS); CA_CacheGrChunk(BJCOLLAPSE1PIC); CA_CacheGrChunk(BJCOLLAPSE2PIC); CA_CacheGrChunk(BJCOLLAPSE3PIC); CA_CacheGrChunk(BJCOLLAPSE4PIC); VW_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); CA_UnCacheGrChunk(BJCOLLAPSE1PIC); CA_UnCacheGrChunk(BJCOLLAPSE2PIC); CA_UnCacheGrChunk(BJCOLLAPSE3PIC); CA_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); VW_Bar (0,0,320,200-STATUSLINES,127); Write(18,2,STR_YOUWIN); Write(TIMEX,TIMEY-2,STR_TOTALTIME); Write(12,RATIOY-2,"averages"); Write(RATIOX+8,RATIOY, STR_RATKILL); Write(RATIOX+4,RATIOY+2, STR_RATSECRET); Write(RATIOX, RATIOY+4,STR_RATTREASURE); VWB_DrawPic (8,4,L_BJWINSPIC); #ifndef SPEAR for (kr = sr = tr = sec = i = 0;i < 8;i++) #else for (kr = sr = tr = sec = i = 0;i < 20;i++) #endif { sec += LevelRatios[i].time; kr += LevelRatios[i].kill; sr += LevelRatios[i].secret; tr += LevelRatios[i].treasure; } #ifndef SPEAR kr /= 8; sr /= 8; tr /= 8; #else kr /= 14; sr /= 14; tr /= 14; #endif min = sec/60; sec %= 60; if (min > 99) min = sec = 99; i = TIMEX*8+1; VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(min/10)); i += 2*8; VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(min%10)); i += 2*8; Write(i/8,TIMEY,":"); i += 1*8; VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(sec/10)); i += 2*8; VWB_DrawPic(i,TIMEY*8,L_NUM0PIC+(sec%10)); VW_UpdateScreen (); itoa(kr,tempstr,10); x=RATIOX+24-strlen(tempstr)*2; Write(x,RATIOY,tempstr); itoa(sr,tempstr,10); x=RATIOX+24-strlen(tempstr)*2; Write(x,RATIOY+2,tempstr); itoa(tr,tempstr,10); x=RATIOX+24-strlen(tempstr)*2; Write(x,RATIOY+4,tempstr); fontnumber = 1; VW_UpdateScreen (); VW_FadeIn (); IN_Ack(); #ifndef SPEAR if (IN_KeyDown(sc_P) && MS_CheckParm("debugmode")) PicturePause(); #endif VW_FadeOut (); UnCacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END); #ifndef SPEAR EndText(); #else EndSpear(); #endif #endif /* SPEARDEMO */ } /* ======================================================================== */ /* ================== = = PG13 = ================== */ void PG13() { VW_FadeOut(); VW_Bar(0,0,320,200,0x82); // background CA_CacheGrChunk (PG13PIC); VWB_DrawPic (216,110,PG13PIC); VW_UpdateScreen (); CA_UnCacheGrChunk (PG13PIC); VW_FadeIn(); IN_UserInput(TickBase*7); VW_FadeOut (); } //========================================================================== void Write(int x,int y,char *string) { int alpha[]={L_NUM0PIC,L_NUM1PIC,L_NUM2PIC,L_NUM3PIC,L_NUM4PIC,L_NUM5PIC, L_NUM6PIC,L_NUM7PIC,L_NUM8PIC,L_NUM9PIC,L_COLONPIC,0,0,0,0,0,0,L_APIC,L_BPIC, L_CPIC,L_DPIC,L_EPIC,L_FPIC,L_GPIC,L_HPIC,L_IPIC,L_JPIC,L_KPIC, L_LPIC,L_MPIC,L_NPIC,L_OPIC,L_PPIC,L_QPIC,L_RPIC,L_SPIC,L_TPIC, L_UPIC,L_VPIC,L_WPIC,L_XPIC,L_YPIC,L_ZPIC}; int i,ox,nx,ny; char ch; ox=nx=x*8; ny=y*8; for (i=0;i='a') ch-=('a'-'A'); ch-='0'; switch(string[i]) { case '!': VWB_DrawPic(nx,ny,L_EXPOINTPIC); nx+=8; continue; case '\'': VWB_DrawPic(nx,ny,L_APOSTROPHEPIC); nx+=8; continue; case ' ': break; case 0x3a: // ':' VWB_DrawPic(nx,ny,L_COLONPIC); nx+=8; continue; case '%': VWB_DrawPic(nx,ny,L_PERCENTPIC); break; default: VWB_DrawPic(nx,ny,alpha[(int)ch]); } nx+=16; } } // // Breathe Mr. BJ!!! // void BJ_Breathe() { static int which=0,max=10; int pics[2]={L_GUYPIC,L_GUY2PIC}; if (get_TimeCount() > max) { which^=1; VWB_DrawPic(0,16,pics[which]); VW_UpdateScreen(); set_TimeCount(0); max=35; } } /* ================== = = LevelCompleted = = Entered with the screen faded out = Still in split screen mode with the status bar = = Exit with the screen faded out = ================== */ #ifndef SPEAR LRstruct LevelRatios[8]; #else LRstruct LevelRatios[20]; #endif void LevelCompleted() { #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]; long bonus,timeleft=0; times parTimes[]= { #ifndef SPEAR // // Episode One Par Times // {1.5, "01:30"}, {2, "02:00"}, {2, "02:00"}, {3.5, "03:30"}, {3, "03:00"}, {3, "03:00"}, {2.5, "02:30"}, {2.5, "02:30"}, {0, "??:??"}, // Boss level {0, "??:??"}, // Secret level // // Episode Two Par Times // {1.5, "01:30"}, {3.5, "03:30"}, {3, "03:00"}, {2, "02:00"}, {4, "04:00"}, {6, "06:00"}, {1, "01:00"}, {3, "03:00"}, {0, "??:??"}, {0, "??:??"}, // // Episode Three Par Times // {1.5, "01:30"}, {1.5, "01:30"}, {2.5, "02:30"}, {2.5, "02:30"}, {3.5, "03:30"}, {2.5, "02:30"}, {2, "02:00"}, {6, "06:00"}, {0, "??:??"}, {0, "??:??"}, // // Episode Four Par Times // {2, "02:00"}, {2, "02:00"}, {1.5, "01:30"}, {1, "01:00"}, {4.5, "04:30"}, {3.5, "03:30"}, {2, "02:00"}, {4.5, "04:30"}, {0, "??:??"}, {0, "??:??"}, // // Episode Five Par Times // {2.5, "02:30"}, {1.5, "01:30"}, {2.5, "02:30"}, {2.5, "02:30"}, {4, "04:00"}, {3, "03:00"}, {4.5, "04:30"}, {3.5, "03:30"}, {0, "??:??"}, {0, "??:??"}, // // Episode Six Par Times // {6.5, "06:30"}, {4, "04:00"}, {4.5, "04:30"}, {6, "06:00"}, {5, "05:00"}, {5.5, "05:30"}, {5.5, "05:30"}, {8.5, "08:30"}, {0, "??:??"}, {0, "??:??"} #else // // SPEAR OF DESTINY TIMES // {1.5, "01:30"}, {3.5, "03:30"}, {2.75, "02:45"}, {3.5, "03:30"}, {0, "??:??"}, // Boss 1 {4.5, "04:30"}, {3.25, "03:15"}, {2.75, "02:45"}, {4.75, "04:45"}, {0, "??:??"}, // Boss 2 {6.5, "06:30"}, {4.5, "04:30"}, {2.75, "02:45"}, {4.5, "04:30"}, {6, "06:00"}, {0, "??:??"}, // Boss 3 {6, "06:00"}, {0, "??:??"}, // Boss 4 {0, "??:??"}, // Secret level 1 {0, "??:??"}, // Secret level 2 #endif }; CacheLump(LEVELEND_LUMP_START,LEVELEND_LUMP_END); ClearSplitVWB(); // set up for double buffering in split screen VW_Bar (0,0,320,200-STATUSLINES,127); StartCPMusic(ENDLEVEL_MUS); // // do the intermission // IN_ClearKeysDown(); IN_StartAck(); VWB_DrawPic(0,16,L_GUYPIC); #ifndef SPEAR if (mapon<8) #else if (mapon != 4 && mapon != 9 && mapon != 15 && mapon < 17) #endif { Write(14,2,"floor\ncompleted"); Write(14,7,STR_BONUS" 0"); Write(16,10,STR_TIME); Write(16,12,STR_PAR); Write(9,14, STR_RAT2KILL); Write(5,16, STR_RAT2SECRET); Write(1,18,STR_RAT2TREASURE); Write(26,2,itoa(gamestate.mapon+1,tempstr,10)); Write(26,12,parTimes[gamestate.episode*10+mapon].timestr); // // PRINT TIME // sec=gamestate.TimeCount/70; if (sec > 99*60) // 99 minutes max sec = 99*60; if (gamestate.TimeCountname); // // level // ultoa(s->completed, buffer, 10); #ifndef SPEAR for (str = buffer;*str;str++) *str = *str + (129 - '0'); // Used fixed-width numbers (129...) USL_MeasureString(buffer,&w,&h); PrintX = (22 * 8)-w; #else USL_MeasureString(buffer,&w,&h); PrintX = 194 - w; #endif #if !defined(UPLOAD) || !defined(SPEAR) PrintX -= 6; itoa(s->episode+1,buffer1,10); US_Print("E"); US_Print(buffer1); US_Print("/L"); #endif #ifdef SPEAR if (s->completed == 21) VWB_DrawPic (PrintX+8,PrintY-1,C_WONSPEARPIC); else #endif US_Print(buffer); // // score // ultoa(s->score, buffer, 10); #ifndef SPEAR for (str = buffer; *str; str++) *str = *str + (129 - '0'); // Used fixed-width numbers (129...) USL_MeasureString(buffer, &w, &h); PrintX = (34 * 8) - 8 - w; #else USL_MeasureString(buffer, &w, &h); PrintX = 292 - w; #endif US_Print(buffer); } VW_UpdateScreen(); #ifdef SPEAR UnCacheLump(HIGHSCORES_LUMP_START, HIGHSCORES_LUMP_END); fontnumber = 0; #endif } /* ======================= = = CheckHighScore = ======================= */ void CheckHighScore(long score, word other) { word i, j; int n; HighScore myscore; strcpy(myscore.name, ""); myscore.score = score; myscore.episode = gamestate.episode; myscore.completed = other; for (i = 0, n = -1; i < MaxScores;i++) { if ((myscore.score > Scores[i].score) || ((myscore.score == Scores[i].score) && (myscore.completed > Scores[i].completed))) { for (j = MaxScores;--j > i;) Scores[j] = Scores[j - 1]; Scores[i] = myscore; n = i; break; } } #ifdef SPEAR StartCPMusic(XAWARD_MUS); #else StartCPMusic(ROSTER_MUS); #endif DrawHighScores(); VW_FadeIn(); if (n != -1) { // // got a high score // PrintY = 76 + (16 * n); #ifndef SPEAR PrintX = 4*8; backcolor = BORDCOLOR; fontcolor = 15; US_LineInput(PrintX,PrintY,Scores[n].name,NULL,true,MaxHighName,100); #else PrintX = 16; fontnumber = 1; VW_Bar(PrintX-2,PrintY-2,145,15,0x9c); VW_UpdateScreen(); backcolor = 0x9c; fontcolor = 15; US_LineInput(PrintX,PrintY,Scores[n].name,NULL,true,MaxHighName,130); #endif } else { IN_ClearKeysDown(); IN_UserInput(500); } }