From d7cb961e37ed12b19777139f75d7bac8814af40b Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 22 Jan 2024 18:29:27 -0500 Subject: [PATCH 1/2] Selectors for votes in splitscreen Kind of an embarrassing issue we had during the demoing. --- src/k_vote.c | 130 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 105 insertions(+), 25 deletions(-) diff --git a/src/k_vote.c b/src/k_vote.c index 8213ca081..133525dba 100644 --- a/src/k_vote.c +++ b/src/k_vote.c @@ -76,6 +76,8 @@ #define ARM_FRAMES (4) #define BULB_FRAMES (4) +#define SELECTOR_FRAMES (2) + #define CATCHER_SPEED (8*FRACUNIT) #define CATCHER_Y_OFFSET (48*FRACUNIT) #define CATCHER_OFFSCREEN (-CATCHER_Y_OFFSET * 2) @@ -91,6 +93,8 @@ #define SELECTION_SPACING_H (SELECTION_HEIGHT + SELECTION_SPACE) #define SELECTION_HOP (10*FRACUNIT) +#define SELECTOR_Y ((SELECTION_HEIGHT / 2) + (4*FRACUNIT)) + #define PILE_WIDTH (46*FRACUNIT) #define PILE_HEIGHT ((PILE_WIDTH * BASEVIDHEIGHT) / BASEVIDWIDTH) #define PILE_SPACE (4*FRACUNIT) @@ -146,6 +150,7 @@ typedef struct SINT8 selection; UINT8 delay; boolean sentTimeOutVote; + fixed_t x, destX; } y_vote_player; // Vote "pile" data. Objects for each vote scattered about. @@ -188,6 +193,13 @@ typedef struct fixed_t hop; } y_vote_draw_level; +// Voting selector drawing +typedef struct +{ + fixed_t x; + fixed_t destX; +} y_vote_draw_selector; + // General vote drawing typedef struct { @@ -206,6 +218,9 @@ typedef struct fixed_t selectTransition; y_vote_draw_level levels[VOTE_NUM_LEVELS]; + + patch_t *selector_patch[MAXSPLITSCREENPLAYERS][2]; + y_vote_draw_selector selectors[MAXSPLITSCREENPLAYERS]; } y_vote_draw; static y_vote_data vote = {0}; @@ -241,6 +256,28 @@ boolean Y_PlayerIDCanVote(const UINT8 playerId) return true; } +static boolean Y_PlayerCanSelect(const UINT8 localId) +{ + const UINT8 p = g_localplayers[localId]; + + if (g_pickedVote != VOTE_NOT_PICKED) + { + return false; + } + + if (g_votes[p] != VOTE_NOT_PICKED) + { + return false; + } + + if (vote.players[localId].catcher.action != CATCHER_NA) + { + return false; + } + + return Y_PlayerIDCanVote(p); +} + static void Y_SortPile(void) { UINT8 numVotes = 0; @@ -697,6 +734,30 @@ static void Y_DrawVoteBackground(void) bgTimer += renderdeltatics; } +static void Y_DrawVoteSelector(const fixed_t y, const UINT8 localPlayer) +{ + const fixed_t destX = SELECTION_X + (vote.players[localPlayer].selection * SELECTION_SPACING_W); + vote_draw.selectors[localPlayer].x += FixedMul( + (destX - vote_draw.selectors[localPlayer].x) * 3 / 4, + renderdeltatics + ); + + if (Y_PlayerCanSelect(localPlayer) == false) + { + return; + } + + UINT8 blink = ((vote.tic / 7) & 1); + UINT8 *colormap = R_GetTranslationColormap(TC_RAINBOW, players[g_localplayers[localPlayer]].skincolor, GTC_CACHE); + + V_DrawFixedPatch( + vote_draw.selectors[localPlayer].x, y - SELECTOR_Y, + FRACUNIT, 0, + vote_draw.selector_patch[localPlayer][blink], + colormap + ); +} + static void Y_DrawVoteSelection(fixed_t offset) { fixed_t x = SELECTION_X; @@ -709,7 +770,6 @@ static void Y_DrawVoteSelection(fixed_t offset) for (i = 0; i < VOTE_NUM_LEVELS; i++) { boolean selected = false; - INT32 flags = 0; fixed_t destHop = 0; INT32 j; @@ -743,7 +803,7 @@ static void Y_DrawVoteSelection(fixed_t offset) Y_DrawVoteThumbnail( x, y - vote_draw.levels[i].hop, - SELECTION_WIDTH, flags, + SELECTION_WIDTH, 0, i, (selected == false), -1 ); @@ -758,6 +818,26 @@ static void Y_DrawVoteSelection(fixed_t offset) { Y_DrawCatcher(&vote.players[i].catcher); } + + // + // Draw splitscreen selectors + // + //if (splitscreen > 0) + { + const UINT8 priority = vote.tic % (splitscreen + 1); + + for (i = 0; i <= splitscreen; i++) + { + if (i == priority) + { + continue; + } + + Y_DrawVoteSelector(y, i); + } + + Y_DrawVoteSelector(y, priority); + } } static void Y_DrawVotePile(void) @@ -1191,28 +1271,6 @@ static void Y_TickVoteRoulette(void) } } -static boolean Y_PlayerCanSelect(const UINT8 localId) -{ - const UINT8 p = g_localplayers[localId]; - - if (g_pickedVote != VOTE_NOT_PICKED) - { - return false; - } - - if (g_votes[p] != VOTE_NOT_PICKED) - { - return false; - } - - if (vote.players[localId].catcher.action != CATCHER_NA) - { - return false; - } - - return Y_PlayerIDCanVote(p); -} - static void Y_TryMapAngerVote(void) { SINT8 angryMaps[VOTE_NUM_LEVELS] = { -1 }; @@ -1491,7 +1549,7 @@ void Y_VoteTicker(void) // static void Y_InitVoteDrawing(void) { - INT32 i = 0; + INT32 i = 0, j = 0; vote_draw.ruby_icon = W_CachePatchName("RUBYICON", PU_STATIC); @@ -1555,6 +1613,18 @@ static void Y_InitVoteDrawing(void) vote_draw.levels[i].str[sizeof vote_draw.levels[i].str - 1] = '\0'; } + for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { + y_vote_player *const player = &vote.players[i]; + + vote_draw.selectors[i].x = vote_draw.selectors[i].destX = SELECTION_X + (player->selection * SELECTION_SPACING_W); + + for (j = 0; j < SELECTOR_FRAMES; j++) + { + vote_draw.selector_patch[i][j] = W_CachePatchName(va("K_SSPL%c%d", 'A' + i, j + 1), PU_STATIC); + } + } + vote_draw.selectTransition = FRACUNIT; } @@ -1581,6 +1651,8 @@ void Y_StartVote(void) y_vote_player *const player = &vote.players[i]; y_vote_catcher *const catcher = &player->catcher; + player->selection = (i % VOTE_NUM_LEVELS); + catcher->action = CATCHER_NA; catcher->small = false; catcher->player = -1; @@ -1641,6 +1713,14 @@ static void Y_UnloadVoteData(void) UNLOAD(vote_draw.catcher_bulb[j][i]); } } + + for (j = 0; j < MAXSPLITSCREENPLAYERS; j++) + { + for (i = 0; i < SELECTOR_FRAMES; i++) + { + UNLOAD(vote_draw.selector_patch[j][i]); + } + } } // From 0911edbeda73d37fa0799ee836d6a636a841b2d7 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Wed, 24 Jan 2024 14:04:23 -0500 Subject: [PATCH 2/2] Bigger graphics for selectors --- src/k_vote.c | 85 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 63 insertions(+), 22 deletions(-) diff --git a/src/k_vote.c b/src/k_vote.c index 133525dba..9993e6dd2 100644 --- a/src/k_vote.c +++ b/src/k_vote.c @@ -93,7 +93,9 @@ #define SELECTION_SPACING_H (SELECTION_HEIGHT + SELECTION_SPACE) #define SELECTION_HOP (10*FRACUNIT) -#define SELECTOR_Y ((SELECTION_HEIGHT / 2) + (4*FRACUNIT)) +#define SELECTOR_SPACE (8*FRACUNIT) +#define SELECTOR_Y ((SELECTION_HEIGHT / 2) + SELECTOR_SPACE) +#define SELECTOR_HEIGHT ((30*FRACUNIT) + SELECTOR_SPACE) #define PILE_WIDTH (46*FRACUNIT) #define PILE_HEIGHT ((PILE_WIDTH * BASEVIDHEIGHT) / BASEVIDWIDTH) @@ -219,7 +221,8 @@ typedef struct fixed_t selectTransition; y_vote_draw_level levels[VOTE_NUM_LEVELS]; - patch_t *selector_patch[MAXSPLITSCREENPLAYERS][2]; + patch_t *selector_arrow; + patch_t *selector_letter[MAXSPLITSCREENPLAYERS][2]; y_vote_draw_selector selectors[MAXSPLITSCREENPLAYERS]; } y_vote_draw; @@ -270,7 +273,8 @@ static boolean Y_PlayerCanSelect(const UINT8 localId) return false; } - if (vote.players[localId].catcher.action != CATCHER_NA) + if (vote.players[localId].catcher.action != CATCHER_NA + || vote.players[localId].catcher.delay > 0) { return false; } @@ -734,9 +738,10 @@ static void Y_DrawVoteBackground(void) bgTimer += renderdeltatics; } -static void Y_DrawVoteSelector(const fixed_t y, const UINT8 localPlayer) +static void Y_DrawVoteSelector(const fixed_t y, const fixed_t time, const UINT8 localPlayer) { const fixed_t destX = SELECTION_X + (vote.players[localPlayer].selection * SELECTION_SPACING_W); + vote_draw.selectors[localPlayer].x += FixedMul( (destX - vote_draw.selectors[localPlayer].x) * 3 / 4, renderdeltatics @@ -747,21 +752,47 @@ static void Y_DrawVoteSelector(const fixed_t y, const UINT8 localPlayer) return; } - UINT8 blink = ((vote.tic / 7) & 1); - UINT8 *colormap = R_GetTranslationColormap(TC_RAINBOW, players[g_localplayers[localPlayer]].skincolor, GTC_CACHE); + static const UINT8 freq = 7; + UINT8 *colormap = NULL; + + if (splitscreen > 0) + { + const UINT8 blink = ((time / freq / FRACUNIT) & 1); + + colormap = R_GetTranslationColormap(TC_RAINBOW, players[ g_localplayers[localPlayer] ].skincolor, GTC_CACHE); + + V_DrawFixedPatch( + vote_draw.selectors[localPlayer].x, y - SELECTOR_Y - (9*FRACUNIT), + FRACUNIT, 0, + vote_draw.selector_letter[localPlayer][blink], + colormap + ); + } + + fixed_t bob = FixedMul((time / freq * 2) + (FRACUNIT / 2), ANGLE_90); + if (localPlayer & 1) + { + bob = FCOS(bob); + } + else + { + bob = FSIN(bob); + } V_DrawFixedPatch( - vote_draw.selectors[localPlayer].x, y - SELECTOR_Y, + vote_draw.selectors[localPlayer].x, y - SELECTOR_Y + bob, FRACUNIT, 0, - vote_draw.selector_patch[localPlayer][blink], + vote_draw.selector_arrow, colormap ); } static void Y_DrawVoteSelection(fixed_t offset) { + static fixed_t selectorTimer = 0; + fixed_t x = SELECTION_X; - fixed_t y = SELECTION_Y + FixedMul(offset, SELECTION_HEIGHT * 2); + fixed_t y = SELECTION_Y + FixedMul(offset, (SELECTION_HEIGHT + SELECTOR_HEIGHT) * 2); INT32 i; // @@ -819,24 +850,29 @@ static void Y_DrawVoteSelection(fixed_t offset) Y_DrawCatcher(&vote.players[i].catcher); } - // - // Draw splitscreen selectors - // - //if (splitscreen > 0) + if (offset != FRACUNIT) { - const UINT8 priority = vote.tic % (splitscreen + 1); + // + // Draw splitscreen selectors + // + selectorTimer += renderdeltatics; - for (i = 0; i <= splitscreen; i++) + //if (splitscreen > 0) { - if (i == priority) + const UINT8 priority = vote.tic % (splitscreen + 1); + + for (i = 0; i <= splitscreen; i++) { - continue; + if (i == priority) + { + continue; + } + + Y_DrawVoteSelector(y, selectorTimer, i); } - Y_DrawVoteSelector(y, i); + Y_DrawVoteSelector(y, selectorTimer, priority); } - - Y_DrawVoteSelector(y, priority); } } @@ -1093,6 +1129,7 @@ static void Y_TickPlayerCatcher(const UINT8 localPlayer) { D_ModifyClientVote(g_localplayers[localPlayer], vote.players[localPlayer].selection); catcher->action = CATCHER_NA; + catcher->delay = 5; S_StopSoundByNum(sfx_kc37); } break; @@ -1621,10 +1658,12 @@ static void Y_InitVoteDrawing(void) for (j = 0; j < SELECTOR_FRAMES; j++) { - vote_draw.selector_patch[i][j] = W_CachePatchName(va("K_SSPL%c%d", 'A' + i, j + 1), PU_STATIC); + vote_draw.selector_letter[i][j] = W_CachePatchName(va("VSSPTR%c%d", 'A' + i, j + 1), PU_STATIC); } } + vote_draw.selector_arrow = W_CachePatchName("VSSPTR1", PU_STATIC); + vote_draw.selectTransition = FRACUNIT; } @@ -1718,9 +1757,11 @@ static void Y_UnloadVoteData(void) { for (i = 0; i < SELECTOR_FRAMES; i++) { - UNLOAD(vote_draw.selector_patch[j][i]); + UNLOAD(vote_draw.selector_letter[j][i]); } } + + UNLOAD(vote_draw.selector_arrow); } //