From 0233c263864c311f188085ee01c1d08a087f93ed Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 6 Nov 2022 13:00:09 -0500 Subject: [PATCH] Chengi's new position numbers --- src/d_player.h | 2 +- src/doomdef.h | 13 +++ src/info.c | 16 ++- src/k_hud.c | 270 +++++++++++++++++++++++++++---------------------- src/k_kart.c | 4 +- 5 files changed, 179 insertions(+), 126 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index d61360ded..d3a41ad39 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -412,7 +412,7 @@ typedef struct player_s // Basic gameplay things UINT8 position; // Used for Kart positions, mostly for deterministic stuff UINT8 oldposition; // Used for taunting when you pass someone - UINT8 positiondelay; // Used for position number, so it can grow when passing/being passed + UINT8 positiondelay; // Used for position number, so it can grow when passing UINT32 distancetofinish; waypoint_t *nextwaypoint; respawnvars_t respawn; // Respawn info diff --git a/src/doomdef.h b/src/doomdef.h index 0c462c8ee..8271a4ae2 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -398,6 +398,19 @@ typedef enum SKINCOLOR_CHAOSEMERALD7, SKINCOLOR_INVINCFLASH, + SKINCOLOR_POSNUM, + SKINCOLOR_POSNUM_WIN1, + SKINCOLOR_POSNUM_WIN2, + SKINCOLOR_POSNUM_WIN3, + SKINCOLOR_POSNUM_LOSE1, + SKINCOLOR_POSNUM_LOSE2, + SKINCOLOR_POSNUM_LOSE3, + SKINCOLOR_POSNUM_BEST1, + SKINCOLOR_POSNUM_BEST2, + SKINCOLOR_POSNUM_BEST3, + SKINCOLOR_POSNUM_BEST4, + SKINCOLOR_POSNUM_BEST5, + SKINCOLOR_POSNUM_BEST6, SKINCOLOR_FIRSTFREESLOT, SKINCOLOR_LASTFREESLOT = SKINCOLOR_FIRSTFREESLOT + NUMCOLORFREESLOTS - 1, diff --git a/src/info.c b/src/info.c index 266787230..6e0e46267 100644 --- a/src/info.c +++ b/src/info.c @@ -29126,7 +29126,21 @@ skincolor_t skincolors[MAXSKINCOLORS] = { {"Chaos Emerald 6", { 0, 208, 50, 32, 34, 37, 40, 44, 0, 0, 0, 0, 0, 0, 0, 0}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_CHAOSEMERALD6 {"Chaos Emerald 7", { 0, 120, 121, 140, 133, 135, 149, 156, 0, 0, 0, 0, 0, 0, 0, 0}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_CHAOSEMERALD7 - {"Invinc Flash", { 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, SKINCOLOR_NONE, 0, 0, false} // SKINCOLOR_INVINCFLASH + {"Invinc Flash", { 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_INVINCFLASH + + {"Position", { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM + {"Position Win 1", {152, 152, 153, 154, 155, 156, 157, 157, 158, 158, 159, 159, 253, 253, 254, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_WIN1 + {"Position Win 2", {135, 135, 135, 136, 136, 136, 137, 137, 137, 138, 138, 139, 139, 254, 254, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_WIN2 + {"Position Win 3", {255, 255, 122, 123, 141, 141, 142, 142, 143, 143, 138, 138, 139, 139, 254, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_WIN3 + {"Position Lose 1", { 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 71, 46, 47, 47, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_LOSE1 + {"Position Lose 2", { 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 44, 45, 71, 46, 47, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_LOSE2 + {"Position Lose 3", { 73, 74, 75, 76, 76, 77, 77, 78, 78, 79, 79, 236, 237, 238, 239, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_LOSE3 + {"Position Best 1", { 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 71, 46, 47, 47, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_BEST1 + {"Position Best 2", { 73, 74, 75, 76, 76, 77, 77, 78, 78, 79, 79, 236, 237, 238, 239, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_BEST2 + {"Position Best 3", {112, 112, 113, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 110, 111, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_BEST3 + {"Position Best 4", {255, 255, 122, 123, 141, 141, 142, 142, 143, 143, 138, 138, 139, 139, 254, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_BEST4 + {"Position Best 5", {152, 152, 153, 154, 155, 156, 157, 157, 158, 158, 159, 159, 253, 253, 254, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_BEST5 + {"Position Best 6", {181, 181, 182, 182, 183, 183, 184, 184, 185, 185, 186, 186, 187, 187, 29, 30}, SKINCOLOR_NONE, 0, 0, false} // SKINCOLOR_POSNUM_BEST6 }; /** Patches the mobjinfo, state, and skincolor tables. diff --git a/src/k_hud.c b/src/k_hud.c index d4127e131..39b08623c 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -37,10 +37,6 @@ #include "r_fps.h" #include "m_random.h" -#define NUMPOSNUMS 10 -#define NUMPOSFRAMES 7 // White, three blues, three reds -#define NUMWINFRAMES 6 // Red, yellow, green, cyan, blue, purple - //{ Patch Definitions static patch_t *kp_nodraw; @@ -70,8 +66,7 @@ static patch_t *kp_startcountdown[20]; static patch_t *kp_racefault[6]; static patch_t *kp_racefinish[6]; -static patch_t *kp_positionnum[NUMPOSNUMS][NUMPOSFRAMES]; -static patch_t *kp_winnernum[NUMPOSFRAMES]; +static patch_t *kp_positionnum[10][2][2]; // number, overlay or underlay, splitscreen static patch_t *kp_facenum[MAXPLAYERS+1]; static patch_t *kp_facehighlight[8]; @@ -179,7 +174,7 @@ static patch_t *kp_trickcool[2]; void K_LoadKartHUDGraphics(void) { - INT32 i, j; + INT32 i, j, k; char buffer[9]; // Null Stuff @@ -280,23 +275,29 @@ void K_LoadKartHUDGraphics(void) HU_UpdatePatch(&kp_racefinish[5], "K_2PFINB"); // Position numbers - sprintf(buffer, "K_POSNxx"); - for (i = 0; i < NUMPOSNUMS; i++) + sprintf(buffer, "KRNKxyz"); + for (i = 0; i < 10; i++) { buffer[6] = '0'+i; - for (j = 0; j < NUMPOSFRAMES; j++) - { - //sprintf(buffer, "K_POSN%d%d", i, j); - buffer[7] = '0'+j; - HU_UpdatePatch(&kp_positionnum[i][j], "%s", buffer); - } - } - sprintf(buffer, "K_POSNWx"); - for (i = 0; i < NUMWINFRAMES; i++) - { - buffer[7] = '0'+i; - HU_UpdatePatch(&kp_winnernum[i], "%s", buffer); + for (j = 0; j < 2; j++) + { + buffer[5] = 'A'+j; + + for (k = 0; k < 2; k++) + { + if (k > 0) + { + buffer[4] = 'S'; + } + else + { + buffer[4] = 'B'; + } + + HU_UpdatePatch(&kp_positionnum[i][j][k], "%s", buffer); + } + } } sprintf(buffer, "OPPRNKxx"); @@ -1545,146 +1546,169 @@ bademblem: } } -static void K_DrawKartPositionNum(INT32 num) +static fixed_t K_DrawKartPositionNumPatch(UINT8 num, UINT8 *color, fixed_t x, fixed_t y, fixed_t scale, INT32 flags) { - // POSI_X = BASEVIDWIDTH - 51; // 269 - // POSI_Y = BASEVIDHEIGHT- 64; // 136 + UINT8 splitIndex = (r_splitscreen > 0) ? 1 : 0; + fixed_t w = FRACUNIT; + fixed_t h = FRACUNIT; + INT32 overlayFlags[2]; + INT32 i; - boolean win = (stplyr->exiting && num == 1); - //INT32 X = POSI_X; - INT32 W = SHORT(kp_positionnum[0][0]->width); - fixed_t scale = FRACUNIT; - patch_t *localpatch = kp_positionnum[0][0]; - INT32 fx = 0, fy = 0, fflags = 0; - INT32 addOrSub = V_ADD; - boolean flipdraw = false; // flip the order we draw it in for MORE splitscreen bs. fun. - boolean flipvdraw = false; // used only for 2p splitscreen so overtaking doesn't make 1P's position fly off the screen. - boolean overtake = false; + if (num >= 10) + { + return x; // invalid input + } if ((mapheaderinfo[gamemap - 1]->levelflags & LF_SUBTRACTNUM) == LF_SUBTRACTNUM) { - addOrSub = V_SUBTRACT; + overlayFlags[0] = V_SUBTRACT; + overlayFlags[1] = V_ADD; } + else + { + overlayFlags[0] = V_ADD; + overlayFlags[1] = V_SUBTRACT; + } + + w = kp_positionnum[num][0][splitIndex]->width * scale; + h = kp_positionnum[num][0][splitIndex]->height * scale; + + if (flags & V_SNAPTORIGHT) + { + x -= w; + } + + if (flags & V_SNAPTOBOTTOM) + { + y -= h; + } + + for (i = 1; i >= 0; i--) + { + V_DrawFixedPatch( + x, y, scale, + flags | overlayFlags[i], + kp_positionnum[num][i][splitIndex], + color + ); + } + + return (x - w); +} + +static void K_DrawKartPositionNum(INT32 num) +{ + const tic_t counter = (leveltime / 3); // Alternate colors every three frames + fixed_t scale = FRACUNIT; + fixed_t fx = 0, fy = 0; + INT32 fflags = 0; + UINT8 *color = NULL; if (stplyr->positiondelay || stplyr->exiting) { scale *= 2; - overtake = true; // this is used for splitscreen stuff in conjunction with flipdraw. } - if (r_splitscreen) - { - scale /= 2; - } - - W = FixedMul(W<>FRACBITS; - // pain and suffering defined below if (!r_splitscreen) { - fx = POSI_X; - fy = BASEVIDHEIGHT - 8; - fflags = V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_SPLITSCREEN; + fx = BASEVIDWIDTH << FRACBITS; + fy = BASEVIDHEIGHT << FRACBITS; + fflags = V_SNAPTOBOTTOM|V_SNAPTORIGHT; } else if (r_splitscreen == 1) // for this splitscreen, we'll use case by case because it's a bit different. { - fx = POSI_X; - if (stplyr == &players[displayplayers[0]]) // for player 1: display this at the top right, above the minimap. + fx = BASEVIDWIDTH << FRACBITS; + + if (stplyr == &players[displayplayers[0]]) { - fy = 30; - fflags = V_SNAPTOTOP|V_SNAPTORIGHT|V_SPLITSCREEN; - if (overtake) - flipvdraw = true; // make sure overtaking doesn't explode us + // for player 1: display this at the top right, above the minimap. + fy = 0; + fflags = V_SNAPTOTOP|V_SNAPTORIGHT; } - else // if we're not p1, that means we're p2. display this at the bottom right, below the minimap. + else { - fy = (BASEVIDHEIGHT/2) - 8; - fflags = V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_SPLITSCREEN; + // if we're not p1, that means we're p2. display this at the bottom right, below the minimap. + fy = BASEVIDHEIGHT << FRACBITS; + fflags = V_SNAPTOBOTTOM|V_SNAPTORIGHT; + } + + fy >>= 1; + } + else + { + fy = BASEVIDHEIGHT << FRACBITS; + + if (stplyr == &players[displayplayers[0]] + || stplyr == &players[displayplayers[2]]) + { + // If we are P1 or P3... + fx = 0; + fflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM; + } + else + { + // else, that means we're P2 or P4. + fx = BASEVIDWIDTH << FRACBITS; + fflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM; + } + + fx >>= 1; + fy >>= 1; + } + + if (stplyr->exiting && num == 1) + { + // 1st place winner? You get rainbows!! + color = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_POSNUM_BEST1 + (counter % 6), GTC_CACHE); + } + else if (stplyr->laps >= numlaps || stplyr->exiting) + { + // On the final lap, or already won. + boolean useRedNums = K_IsPlayerLosing(stplyr); + + if ((mapheaderinfo[gamemap - 1]->levelflags & LF_SUBTRACTNUM) == LF_SUBTRACTNUM) + { + // Subtracting RED will look BLUE, and vice versa. + useRedNums = !useRedNums; + } + + if (useRedNums == true) + { + color = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_POSNUM_LOSE1 + (counter % 3), GTC_CACHE); + } + else + { + color = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_POSNUM_WIN1 + (counter % 3), GTC_CACHE); } } else { - if (stplyr == &players[displayplayers[0]] || stplyr == &players[displayplayers[2]]) // If we are P1 or P3... - { - fx = POSI_X; - fy = POSI_Y; - fflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_SPLITSCREEN; - flipdraw = true; - if (num && num >= 10) - fx += W; // this seems dumb, but we need to do this in order for positions above 10 going off screen. - } - else // else, that means we're P2 or P4. - { - fx = POSI2_X; - fy = POSI2_Y; - fflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM|V_SPLITSCREEN; - } + color = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_POSNUM, GTC_CACHE); } // Special case for 0 if (num <= 0) { - V_DrawFixedPatch(fx<laps >= numlaps || stplyr->exiting) // Check for the final lap, or won - { - boolean useRedNums = K_IsPlayerLosing(stplyr); + /* + + */ - if (addOrSub == V_SUBTRACT) - { - // Subtracting RED will look BLUE, and vice versa. - useRedNums = !useRedNums; - } - - // Alternate frame every three frames - switch ((leveltime % 9) / 3) - { - case 0: - if (useRedNums == true) - localpatch = kp_positionnum[num % 10][4]; - else - localpatch = kp_positionnum[num % 10][1]; - break; - case 1: - if (useRedNums == true) - localpatch = kp_positionnum[num % 10][5]; - else - localpatch = kp_positionnum[num % 10][2]; - break; - case 2: - if (useRedNums == true) - localpatch = kp_positionnum[num % 10][6]; - else - localpatch = kp_positionnum[num % 10][3]; - break; - default: - localpatch = kp_positionnum[num % 10][0]; - break; - } - } - else - { - localpatch = kp_positionnum[num % 10][0]; - } - - V_DrawFixedPatch( - (fx<width)*scale/2) : 0), - (fy<height)*scale/2) : 0), - scale, addOrSub|V_SLIDEIN|fflags, localpatch, NULL + fx = K_DrawKartPositionNumPatch( + (num % 10), color, + fx, fy, scale, V_SLIDEIN|V_SPLITSCREEN|fflags ); - // ^ if we overtake as p1 or p3 in splitscren, we shift it so that it doesn't go off screen. - // ^ if we overtake as p1 in 2p splits, shift vertically so that this doesn't happen either. - - fx -= W; num /= 10; } } diff --git a/src/k_kart.c b/src/k_kart.c index 583639b9c..c1536cfb4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9865,8 +9865,10 @@ void K_KartUpdatePosition(player_t *player) if (leveltime < starttime || oldposition == 0) oldposition = position; - if (oldposition != position) // Changed places? + if (position < oldposition) // Changed places? + { player->positiondelay = 10; // Position number growth + } /* except in FREE PLAY */ if (player->curshield == KSHIELD_TOP &&