diff --git a/src/doomstat.h b/src/doomstat.h index 06a38d724..b0fdd3bee 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -170,6 +170,7 @@ struct recorddata_t typedef enum { + GRADE_INVALID = -1, GRADE_E, GRADE_D, GRADE_C, diff --git a/src/k_tally.cpp b/src/k_tally.cpp index f54d59b38..3ab0d0a5c 100644 --- a/src/k_tally.cpp +++ b/src/k_tally.cpp @@ -311,7 +311,7 @@ void level_tally_t::Init(player_t *player) points = pointLimit = 0; powerStones = 0; - rank = GRADE_E; + rank = GRADE_INVALID; if (player->spectator == false && player->bot == false && game_over == false) { @@ -475,19 +475,27 @@ void level_tally_t::Init(player_t *player) header[sizeof header - 1] = '\0'; // Only show grade if there were any bonuses - showGrade = (position > 0); - if (showGrade == false) + if (rank != GRADE_INVALID) { - for (int i = 0; i < TALLY_WINDOW_SIZE; i++) + showGrade = (position > 0); + if (showGrade == false) { - if (bonuses[i] != TALLY_BONUS_NA) + for (int i = 0; i < TALLY_WINDOW_SIZE; i++) { - showGrade = true; - break; + if (bonuses[i] != TALLY_BONUS_NA) + { + showGrade = true; + break; + } } } } + if (showGrade == false) + { + rank = GRADE_INVALID; + } + lineCount = 0; for (int i = 0; i < TALLY_WINDOW_SIZE; i++) { diff --git a/src/y_inter.c b/src/y_inter.c index 45b212993..180b3acc1 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -171,6 +171,7 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32)) for (i = 0; i < MAXPLAYERS; i++) { data.val[i] = UINT32_MAX; + data.grade[i] = GRADE_INVALID; if (!playeringame[i] || players[i].spectator) { @@ -205,6 +206,7 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32)) i = data.num[data.numplayers]; completed[i] = true; + data.grade[i] = players[i].tally.rank; data.color[data.numplayers] = players[i].skincolor; data.character[data.numplayers] = players[i].skin; @@ -736,7 +738,33 @@ void Y_PlayerStandingsDrawer(y_data_t *standings, INT32 xoffset) ); } } + } + else if (standings->grade[pnum] != GRADE_INVALID) + { + patch_t *gradePtc = W_CachePatchName(va("R_INRNK%c", K_GetGradeChar(standings->grade[pnum])), PU_PATCH); + patch_t *gradeBG = NULL; + UINT16 gradeColor = SKINCOLOR_NONE; + UINT8 *gradeClm = NULL; + + gradeColor = K_GetGradeColor(standings->grade[pnum]); + if (gradeColor != SKINCOLOR_NONE) + { + gradeClm = R_GetTranslationColormap(TC_DEFAULT, gradeColor, GTC_CACHE); + } + + if (datarightofcolumn) + { + gradeBG = W_CachePatchName("R_INRNKR", PU_PATCH); + V_DrawMappedPatch(x + 118, y, 0, gradeBG, gradeClm); + V_DrawMappedPatch(x + 118 + 4, y - 1, 0, gradePtc, gradeClm); + } + else + { + gradeBG = W_CachePatchName("R_INRNKL", PU_PATCH); + V_DrawMappedPatch(x - 12, y, 0, gradeBG, gradeClm); + V_DrawMappedPatch(x - 12 + 3, y - 1, 0, gradePtc, gradeClm); + } } // Reverse the jitter offset diff --git a/src/y_inter.h b/src/y_inter.h index c1ffd7936..b3b4bfeea 100644 --- a/src/y_inter.h +++ b/src/y_inter.h @@ -41,6 +41,8 @@ typedef struct INT16 increase[MAXPLAYERS]; // how much did the score increase by? UINT8 jitter[MAXPLAYERS]; // wiggle + SINT8 grade[MAXPLAYERS]; // grade, if not a bot + UINT8 mainplayer; // Most successful local player INT32 linemeter; // For GP only } y_data_t;