2 ========================
6 ========================
14 #define WR_CacheLumpName(a,b) W_GetNumForName(a)
15 #define ZR_ChangeTag(a,b)
16 #define WR_CacheLumpNum(a,b) a
17 #define V_DrawPatch(x,y,p) OGL_DrawPatch(x,y,p)
18 #define V_DrawFuzzPatch(x,y,p) OGL_DrawFuzzPatch(x,y,p)
19 #define V_DrawAltFuzzPatch(x,y,p) OGL_DrawAltFuzzPatch(x,y,p)
20 #define V_DrawShadowedPatch(x,y,p) OGL_DrawShadowedPatch(x,y,p)
22 #define ZR_ChangeTag(a,b) Z_ChangeTag(a,b)
23 #define WR_CacheLumpName(a,b) W_CacheLumpName(a,b)
24 #define WR_CacheLumpNum(a,b) W_CacheLumpNum(a,b)
25 #define PATCH_REF patch_t*
45 void IN_WaitStop(void);
47 void IN_LoadPics(void);
48 void IN_UnloadPics(void);
49 void IN_CheckForSkip(void);
50 void IN_InitStats(void);
51 void IN_InitDeathmatchStats(void);
52 void IN_InitNetgameStats(void);
53 void IN_DrawOldLevel(void);
54 void IN_DrawYAH(void);
55 void IN_DrawStatBack(void);
56 void IN_DrawSingleStats(void);
57 void IN_DrawCoopStats(void);
58 void IN_DrawDMStats(void);
59 void IN_DrawNumber(int val, int x, int y, int digits);
60 void IN_DrawTime(int x, int y, int h, int m, int s);
61 void IN_DrTextB(char *text, int x, int y);
63 static boolean skipintermission;
64 static int interstate = 0;
65 static int intertime = -1;
66 static int oldintertime = 0;
67 static gametype_t gametype;
76 static int slaughterboy; // in DM, the player with the most kills
78 static int killPercent[MAXPLAYERS];
79 static int bonusPercent[MAXPLAYERS];
80 static int secretPercent[MAXPLAYERS];
82 static PATCH_REF patchINTERPIC;
83 static PATCH_REF patchBEENTHERE;
84 static PATCH_REF patchGOINGTHERE;
85 static PATCH_REF FontBNumbers[10];
87 static patch_t *FontB3DNumbers[10];
89 static PATCH_REF FontBNegative;
91 static patch_t *FontB3DNegative;
93 static PATCH_REF FontBSlash;
94 static PATCH_REF FontBPercent;
97 static int FontBLumpBase;
98 static int patchFaceOkayBase;
99 static int patchFaceDeadBase;
101 static signed int totalFrags[MAXPLAYERS];
102 static fixed_t dSlideX[MAXPLAYERS];
103 static fixed_t dSlideY[MAXPLAYERS];
105 static char *KillersText[] = { "K", "I", "L", "L", "E", "R", "S" };
107 extern char *LevelNames[];
115 static yahpt_t YAHspot[3][9] =
152 //========================================================================
156 //========================================================================
158 extern void AM_Stop (void);
162 I_SetPalette(W_CacheLumpName("PLAYPAL", PU_CACHE));
167 skipintermission = false;
171 S_StartSong(mus_intr, true);
174 //========================================================================
178 //========================================================================
180 void IN_WaitStop(void)
189 //========================================================================
193 //========================================================================
197 intermission = false;
200 BorderNeedRefresh = true;
203 //========================================================================
207 // Initializes the stats for single player mode
208 //========================================================================
210 void IN_InitStats(void)
214 signed int slaughterfrags;
230 else if(netgame && !deathmatch)
232 gametype = COOPERATIVE;
233 memset(killPercent, 0, MAXPLAYERS*sizeof(int));
234 memset(bonusPercent, 0, MAXPLAYERS*sizeof(int));
235 memset(secretPercent, 0, MAXPLAYERS*sizeof(int));
236 for(i=0; i<MAXPLAYERS; i++)
242 killPercent[i] = players[i].killcount*100/totalkills;
246 bonusPercent[i] = players[i].itemcount*100/totalitems;
250 secretPercent[i] = players[i].secretcount*100/totalsecret;
257 gametype = DEATHMATCH;
259 slaughterfrags = -9999;
263 for(i=0; i<MAXPLAYERS; i++)
269 for(j=0; j<MAXPLAYERS; j++)
273 totalFrags[i] += players[i].frags[j];
276 dSlideX[i] = (43*posnum*FRACUNIT)/20;
277 dSlideY[i] = (36*posnum*FRACUNIT)/20;
280 if(totalFrags[i] > slaughterfrags)
283 slaughterfrags = totalFrags[i];
286 else if(totalFrags[i] == slaughterfrags)
288 slaughterboy |= 1<<i;
292 if(playercount == slaughtercount)
293 { // don't do the slaughter stuff if everyone is equal
299 //========================================================================
303 //========================================================================
305 void IN_LoadPics(void)
312 patchINTERPIC = WR_CacheLumpName("MAPE1", PU_STATIC);
315 patchINTERPIC = WR_CacheLumpName("MAPE2", PU_STATIC);
318 patchINTERPIC = WR_CacheLumpName("MAPE3", PU_STATIC);
323 patchBEENTHERE = WR_CacheLumpName("IN_X", PU_STATIC);
324 patchGOINGTHERE = WR_CacheLumpName("IN_YAH", PU_STATIC);
325 FontBLumpBase = W_GetNumForName("FONTB16");
328 FontBNumbers[i] = WR_CacheLumpNum(FontBLumpBase+i, PU_STATIC);
330 FontB3DNumbers[i] = W_CacheLumpNum(FontBLumpBase+i, PU_STATIC);
333 FontBLump = W_GetNumForName("FONTB_S")+1;
334 FontBNegative = WR_CacheLumpName("FONTB13", PU_STATIC);
336 FontB3DNegative = W_CacheLumpName("FONTB13", PU_STATIC);
339 FontBSlash = WR_CacheLumpName("FONTB15", PU_STATIC);
340 FontBPercent = WR_CacheLumpName("FONTB05", PU_STATIC);
341 patchFaceOkayBase = W_GetNumForName("FACEA0");
342 patchFaceDeadBase = W_GetNumForName("FACEB0");
345 //========================================================================
349 //========================================================================
351 void IN_UnloadPics(void)
357 ZR_ChangeTag(patchINTERPIC, PU_CACHE);
359 ZR_ChangeTag(patchBEENTHERE, PU_CACHE);
360 ZR_ChangeTag(patchGOINGTHERE, PU_CACHE);
363 ZR_ChangeTag(FontBNumbers[i], PU_CACHE);
365 Z_ChangeTag(FontB3DNumbers[i], PU_CACHE);
368 ZR_ChangeTag(FontBNegative, PU_CACHE);
370 Z_ChangeTag (FontB3DNegative, PU_CACHE);
372 ZR_ChangeTag(FontBSlash, PU_CACHE);
373 ZR_ChangeTag(FontBPercent, PU_CACHE);
376 //========================================================================
380 //========================================================================
395 if(oldintertime < intertime)
398 if(gameepisode > 3 && interstate >= 1)
399 { // Extended Wad levels: skip directly to the next level
405 oldintertime = intertime+300;
408 oldintertime = intertime+1200;
412 oldintertime = intertime+200;
415 oldintertime = MAXINT;
426 if(interstate == 0 && intertime < 150)
429 skipintermission = false;
432 else if(interstate < 2 && gameepisode < 4)
435 skipintermission = false;
436 S_StartSound(NULL, sfx_dorcls);
441 skipintermission = false;
442 S_StartSound(NULL, sfx_dorcls);
446 //========================================================================
450 // Check to see if any player hit a key
451 //========================================================================
453 void IN_CheckForSkip(void)
458 for (i=0, player = players ; i<MAXPLAYERS ; i++, player++)
462 if (player->cmd.buttons&BT_ATTACK)
464 if (!player->attackdown)
466 skipintermission = 1;
468 player->attackdown = true;
472 player->attackdown = false;
474 if (player->cmd.buttons&BT_USE)
476 if (!player->usedown)
478 skipintermission = 1;
480 player->usedown = true;
484 player->usedown = false;
490 //========================================================================
494 //========================================================================
498 static int oldinterstate;
508 UpdateState |= I_FULLSCRN;
509 if(oldinterstate != 2 && interstate == 2)
511 S_StartSound(NULL, sfx_pstop);
513 oldinterstate = interstate;
516 case 0: // draw stats
521 IN_DrawSingleStats();
531 case 1: // leaving old level
534 V_DrawPatch(0, 0, patchINTERPIC);
538 case 2: // going to the next level
541 V_DrawPatch(0, 0, patchINTERPIC);
545 case 3: // waiting before going to the next level
548 V_DrawPatch(0, 0, patchINTERPIC);
552 I_Error("IN_lude: Intermission state out of range.\n");
557 //========================================================================
561 //========================================================================
563 void IN_DrawStatBack(void)
572 src = W_CacheLumpName ("FLOOR16", PU_CACHE);
575 for (y=0 ; y<SCREENHEIGHT ; y++)
577 for (x=0 ; x<SCREENWIDTH/64 ; x++)
579 memcpy (dest, src+((y&63)<<6), 64);
584 memcpy (dest, src+((y&63)<<6), SCREENWIDTH&63);
585 dest += (SCREENWIDTH&63);
589 OGL_SetFlat(R_FlatNumForName("FLOOR16"));
590 OGL_DrawRectTiled(0,0,SCREENWIDTH,SCREENHEIGHT,64,64);
594 //========================================================================
598 //========================================================================
600 void IN_DrawOldLevel(void)
605 x = 160-MN_TextBWidth(LevelNames[(gameepisode-1)*9+prevmap-1]+7)/2;
606 IN_DrTextB(LevelNames[(gameepisode-1)*9+prevmap-1]+7, x, 3);
607 x = 160-MN_TextAWidth("FINISHED")/2;
608 MN_DrTextA("FINISHED", x, 25);
612 for(i=0; i<gamemap-1; i++)
614 V_DrawPatch(YAHspot[gameepisode-1][i].x, YAHspot[gameepisode-1][i].y,
619 V_DrawPatch(YAHspot[gameepisode-1][8].x, YAHspot[gameepisode-1][8].y,
625 for(i=0; i<prevmap-1; i++)
627 V_DrawPatch(YAHspot[gameepisode-1][i].x, YAHspot[gameepisode-1][i].y,
630 if(players[consoleplayer].didsecret)
632 V_DrawPatch(YAHspot[gameepisode-1][8].x, YAHspot[gameepisode-1][8].y,
637 V_DrawPatch(YAHspot[gameepisode-1][prevmap-1].x, YAHspot[gameepisode-1][prevmap-1].y,
643 //========================================================================
647 //========================================================================
649 void IN_DrawYAH(void)
654 x = 160-MN_TextAWidth("NOW ENTERING:")/2;
655 MN_DrTextA("NOW ENTERING:", x, 10);
656 x = 160-MN_TextBWidth(LevelNames[(gameepisode-1)*9+gamemap-1]+7)/2;
657 IN_DrTextB(LevelNames[(gameepisode-1)*9+gamemap-1]+7, x, 20);
663 for(i=0; i<prevmap; i++)
665 V_DrawPatch(YAHspot[gameepisode-1][i].x, YAHspot[gameepisode-1][i].y,
668 if(players[consoleplayer].didsecret)
670 V_DrawPatch(YAHspot[gameepisode-1][8].x, YAHspot[gameepisode-1][8].y,
673 if(!(intertime&16) || interstate == 3)
674 { // draw the destination 'X'
675 V_DrawPatch(YAHspot[gameepisode-1][gamemap-1].x,
676 YAHspot[gameepisode-1][gamemap-1].y, patchGOINGTHERE);
680 //========================================================================
682 // IN_DrawSingleStats
684 //========================================================================
686 void IN_DrawSingleStats(void)
691 IN_DrTextB("KILLS", 50, 65);
692 IN_DrTextB("ITEMS", 50, 90);
693 IN_DrTextB("SECRETS", 50, 115);
695 x = 160-MN_TextBWidth(LevelNames[(gameepisode-1)*9+prevmap-1]+7)/2;
696 IN_DrTextB(LevelNames[(gameepisode-1)*9+prevmap-1]+7, x, 3);
697 x = 160-MN_TextAWidth("FINISHED")/2;
698 MN_DrTextA("FINISHED", x, 25);
705 if(sounds < 1 && intertime >= 30)
707 S_StartSound(NULL, sfx_dorcls);
710 IN_DrawNumber(players[consoleplayer].killcount, 200, 65, 3);
712 OGL_DrawShadowedPatch(237, 65, FontBSlash);
714 V_DrawShadowedPatch(237, 65, FontBSlash);
716 IN_DrawNumber(totalkills, 248, 65, 3);
721 if(sounds < 2 && intertime >= 60)
723 S_StartSound(NULL, sfx_dorcls);
726 IN_DrawNumber(players[consoleplayer].itemcount, 200, 90, 3);
728 OGL_DrawShadowedPatch(237, 90, FontBSlash);
730 V_DrawShadowedPatch(237, 90, FontBSlash);
732 IN_DrawNumber(totalitems, 248, 90, 3);
737 if(sounds < 3 && intertime >= 90)
739 S_StartSound(NULL, sfx_dorcls);
742 IN_DrawNumber(players[consoleplayer].secretcount, 200, 115, 3);
744 OGL_DrawShadowedPatch(237, 115, FontBSlash);
746 V_DrawShadowedPatch(237, 115, FontBSlash);
748 IN_DrawNumber(totalsecret, 248, 115, 3);
753 if(sounds < 4 && intertime >= 150)
755 S_StartSound(NULL, sfx_dorcls);
759 if(!ExtendedWAD || gameepisode < 4)
761 IN_DrTextB("TIME", 85, 160);
762 IN_DrawTime(155, 160, hours, minutes, seconds);
766 x = 160-MN_TextAWidth("NOW ENTERING:")/2;
767 MN_DrTextA("NOW ENTERING:", x, 160);
768 x = 160-MN_TextBWidth(LevelNames[(gameepisode-1)*9+gamemap-1]+7)/2;
769 IN_DrTextB(LevelNames[(gameepisode-1)*9+gamemap-1]+7, x, 170);
770 skipintermission = false;
774 //========================================================================
778 //========================================================================
780 void IN_DrawCoopStats(void)
788 IN_DrTextB("KILLS", 95, 35);
789 IN_DrTextB("BONUS", 155, 35);
790 IN_DrTextB("SECRET", 232, 35);
791 x = 160-MN_TextBWidth(LevelNames[(gameepisode-1)*9+prevmap-1]+7)/2;
792 IN_DrTextB(LevelNames[(gameepisode-1)*9+prevmap-1]+7, x, 3);
793 x = 160-MN_TextAWidth("FINISHED")/2;
794 MN_DrTextA("FINISHED", x, 25);
797 for(i=0; i<MAXPLAYERS; i++)
802 OGL_DrawShadowedPatch(25, ypos, patchFaceOkayBase+i);
804 V_DrawShadowedPatch(25, ypos, W_CacheLumpNum(patchFaceOkayBase+i, PU_CACHE));
812 else if(intertime >= 40 && sounds < 1)
814 S_StartSound(NULL, sfx_dorcls);
817 IN_DrawNumber(killPercent[i], 85, ypos+10, 3);
818 V_DrawShadowedPatch(121, ypos+10, FontBPercent);
819 IN_DrawNumber(bonusPercent[i], 160, ypos+10, 3);
820 V_DrawShadowedPatch(196, ypos+10, FontBPercent);
821 IN_DrawNumber(secretPercent[i], 237, ypos+10, 3);
822 V_DrawShadowedPatch(273, ypos+10, FontBPercent);
828 //========================================================================
832 //========================================================================
834 void IN_DrawDMStats(void)
841 //int x; // unused variable
848 IN_DrTextB("TOTAL", 265, 30);
849 MN_DrTextA("VICTIMS", 140, 8);
852 MN_DrTextA(KillersText[i], 10, 80+9*i);
856 for(i=0; i<MAXPLAYERS; i++)
860 V_DrawShadowedPatch(40, ((ypos<<FRACBITS)+dSlideY[i]*intertime)
861 >>FRACBITS, WR_CacheLumpNum(patchFaceOkayBase+i, PU_CACHE));
862 V_DrawShadowedPatch(((xpos<<FRACBITS)+dSlideX[i]*intertime)
863 >>FRACBITS, 18, WR_CacheLumpNum(patchFaceDeadBase+i, PU_CACHE));
869 if(intertime >= 20 && sounds < 1)
871 S_StartSound(NULL, sfx_dorcls);
874 if(intertime >= 100 && slaughterboy && sounds < 2)
876 S_StartSound(NULL, sfx_wpnup);
879 for(i=0; i<MAXPLAYERS; i++)
883 if(intertime < 100 || i == consoleplayer)
885 V_DrawShadowedPatch(40, ypos, WR_CacheLumpNum(patchFaceOkayBase+i, PU_CACHE));
886 V_DrawShadowedPatch(xpos, 18, WR_CacheLumpNum(patchFaceDeadBase+i, PU_CACHE));
890 V_DrawFuzzPatch(40, ypos, WR_CacheLumpNum(patchFaceOkayBase+i, PU_CACHE));
891 V_DrawFuzzPatch(xpos, 18, WR_CacheLumpNum(patchFaceDeadBase+i, PU_CACHE));
894 for(j=0; j<MAXPLAYERS; j++)
898 IN_DrawNumber(players[i].frags[j], kpos, ypos+10, 3);
902 if(slaughterboy&(1<<i))
906 IN_DrawNumber(totalFrags[i], 263, ypos+10, 3);
911 IN_DrawNumber(totalFrags[i], 263, ypos+10, 3);
919 //========================================================================
923 //========================================================================
925 void IN_DrawTime(int x, int y, int h, int m, int s)
929 IN_DrawNumber(h, x, y, 2);
930 IN_DrTextB(":", x+26, y);
935 IN_DrawNumber(m, x, y, 2);
940 IN_DrTextB(":", x-8, y);
941 IN_DrawNumber(s, x, y, 2);
945 //========================================================================
949 //========================================================================
951 void IN_DrawNumber(int val, int x, int y, int digits)
965 { //...this should reflect negative frags
976 if(digits < realdigits)
985 if(digits < realdigits)
994 if(digits < realdigits)
1003 patch = FontB3DNumbers[val/1000];
1004 OGL_DrawShadowedPatch(xpos+6-patch->width/2-12, y, FontBNumbers[val/1000]);
1006 patch = FontBNumbers[val/1000];
1007 V_DrawShadowedPatch(xpos+6-patch->width/2-12, y, patch);
1015 patch = FontB3DNumbers[val/100];
1016 OGL_DrawShadowedPatch(xpos+6-patch->width/2,y,FontBNumbers[val/1000]);
1018 patch = FontBNumbers[val/100];
1019 V_DrawShadowedPatch(xpos+6-patch->width/2, y, patch);
1030 patch = FontB3DNumbers[val/10];
1031 OGL_DrawShadowedPatch(xpos+6-patch->width/2, y, FontBNumbers[val/10]);
1033 patch = FontBNumbers[val/10];
1034 V_DrawShadowedPatch(xpos+6-patch->width/2, y, patch);
1037 else if(digits == 2 || oldval > 99)
1039 V_DrawShadowedPatch(xpos, y, FontBNumbers[0]);
1045 patch = FontB3DNumbers[val];
1046 OGL_DrawShadowedPatch(xpos+6-patch->width/2,y,FontBNumbers[val]);
1048 patch = FontBNumbers[val];
1049 V_DrawShadowedPatch(xpos+6-patch->width/2, y, patch);
1054 patch = FontB3DNegative;
1055 OGL_DrawShadowedPatch(xpos+6-patch->width/2-12*(realdigits), y, FontBNegative);
1057 patch = FontBNegative;
1058 V_DrawShadowedPatch(xpos+6-patch->width/2-12*(realdigits), y, patch);
1063 //========================================================================
1067 //========================================================================
1069 void IN_DrTextB(char *text, int x, int y)
1074 while((c = *text++) != 0)
1082 p = W_CacheLumpNum(FontBLump+c-33, PU_CACHE);
1084 OGL_DrawShadowedPatch(x,y,FontBLump+c-33);
1086 V_DrawShadowedPatch(x, y, p);