diff --git a/src/k_menu.h b/src/k_menu.h index b4ce7c6bd..6d21212d0 100644 --- a/src/k_menu.h +++ b/src/k_menu.h @@ -418,6 +418,8 @@ extern menu_t EXTRAS_EggTVDef; extern menuitem_t PAUSE_Main[]; extern menu_t PAUSE_MainDef; +extern menu_t PAUSE_KickHandlerDef; + // EXTRAS extern menuitem_t MISC_Manual[]; extern menu_t MISC_ManualDef; @@ -1082,6 +1084,14 @@ void M_QuitPauseMenu(INT32 choice); boolean M_PauseInputs(INT32 ch); void M_PauseTick(void); +extern struct playerkickmenu_s { + tic_t ticker; + UINT8 player; + UINT8 poke; +} playerkickmenu; + +void M_KickHandler(INT32 choice); + extern consvar_t cv_dummymenuplayer; extern consvar_t cv_dummyspectator; @@ -1154,6 +1164,7 @@ void M_DrawMPServerBrowser(void); // Pause menu: void M_DrawPause(void); +void M_DrawKickHandler(void); // Replay Playback void M_DrawPlaybackMenu(void); diff --git a/src/k_menudraw.c b/src/k_menudraw.c index f89eb0db8..c10ef7762 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -4538,6 +4538,104 @@ void M_DrawPause(void) } } +void M_DrawKickHandler(void) +{ + // fake round queue drawer simply to make release + INT32 x = 29 + 4, y = 70, returny = y; + INT32 pokeamount = (playerkickmenu.poke & 1) ? -playerkickmenu.poke/2 : playerkickmenu.poke/2; + INT32 x2 = x + pokeamount - 9 - 8; + + boolean datarightofcolumn = false; + + patch_t *resbar = W_CachePatchName("R_RESBAR", PU_CACHE); // Results bars for players + + UINT8 i; + + for (i = 0; i < MAXPLAYERS; i++) + { + V_DrawMappedPatch( + x, y, + (playeringame[i] == true) + ? ((players[i].spectator == true) ? V_TRANSLUCENT : 0) + : V_MODULATE, + resbar, NULL + ); + + V_DrawRightAlignedThinString( + x+13, y-2, + ((i == playerkickmenu.player) + ? highlightflags + : 0 + ), + va("%u", i) + ); + + if (playeringame[i] == true) + { + if (players[i].skincolor != SKINCOLOR_NONE) + { + UINT8 *charcolormap; + if ((players[i].pflags & PF_NOCONTEST) && players[i].bot) + { + // RETIRED !! + charcolormap = R_GetTranslationColormap(TC_DEFAULT, players[i].skincolor, GTC_CACHE); + V_DrawMappedPatch(x+14, y-5, 0, W_CachePatchName("MINIDEAD", PU_CACHE), charcolormap); + } + else + { + charcolormap = R_GetTranslationColormap(players[i].skin, players[i].skincolor, GTC_CACHE); + V_DrawMappedPatch(x+14, y-5, 0, faceprefix[players[i].skin][FACE_MINIMAP], charcolormap); + } + } + + V_DrawThinString( + x+27, y-2, + ( + P_IsMachineLocalPlayer(&players[i]) + ? highlightflags + : 0 + )|V_ALLOWLOWERCASE|V_6WIDTHSPACE, + player_names[i] + ); + + V_DrawRightAlignedThinString( + x+118, y-2, + V_ALLOWLOWERCASE|V_6WIDTHSPACE, + (players[i].spectator) ? "SPECTATOR" : "PLAYING" + ); + } + + if (i == playerkickmenu.player) + { + V_DrawScaledPatch( + x2, y-1, + (datarightofcolumn ? V_FLIP : 0), + W_CachePatchName("M_CURSOR", PU_CACHE) + ); + } + + y += 13; + + if (i == (MAXPLAYERS-1)/2) + { + x = 169 - 4; + y = returny; + + datarightofcolumn = true; + x2 = x + 118 + 9 + 8 + 4 - pokeamount; + } + } + + //V_DrawFill(32 + (playerkickmenu.player & 8), 32 + (playerkickmenu.player & 7)*8, 8, 8, playeringame[playerkickmenu.player] ? 0 : 16); + + V_DrawFixedPatch(0, 0, FRACUNIT, 0, W_CachePatchName("MENUHINT", PU_CACHE), NULL); + V_DrawCenteredThinString( + BASEVIDWIDTH/2, 12, + V_ALLOWLOWERCASE|V_6WIDTHSPACE, + K_GetMidVoteLabel(menucallvote) + ); +} + void M_DrawPlaybackMenu(void) { INT16 i; diff --git a/src/menus/transient/CMakeLists.txt b/src/menus/transient/CMakeLists.txt index 1b9309749..aa1397595 100644 --- a/src/menus/transient/CMakeLists.txt +++ b/src/menus/transient/CMakeLists.txt @@ -8,6 +8,7 @@ target_sources(SRB2SDL2 PRIVATE discord-requests.c message-box.c pause-game.c + pause-kick.c pause-replay.c virtual-keyboard.c ) diff --git a/src/menus/transient/pause-game.c b/src/menus/transient/pause-game.c index cac1c1280..29ae32177 100644 --- a/src/menus/transient/pause-game.c +++ b/src/menus/transient/pause-game.c @@ -333,8 +333,8 @@ void M_HandlePauseMenuCallVote(INT32 choice) } else if (K_MidVoteTypeUsesVictim(menucallvote) == true) { - // Not yet implemented. - S_StartSound(NULL, sfx_s3k7b); + S_StartSound(NULL, sfx_s3k5b); + M_KickHandler(-1); } else { diff --git a/src/menus/transient/pause-kick.c b/src/menus/transient/pause-kick.c new file mode 100644 index 000000000..2340406ee --- /dev/null +++ b/src/menus/transient/pause-kick.c @@ -0,0 +1,112 @@ +/// \file menus/transient/pause-kick.c +/// \brief Player Kick menu + +#include "../../k_menu.h" +#include "../../s_sound.h" +#include "../../p_local.h" +#include "../../k_zvote.h" + +struct playerkickmenu_s playerkickmenu; + +static void M_PlayerKickHandler(INT32 choice) +{ + const UINT8 pid = 0; + + (void)choice; + + if (menucmd[pid].dpad_lr != 0) // symmetrical in this case + { + S_StartSound(NULL, sfx_s3k5b); + + playerkickmenu.player = ((playerkickmenu.player + 8) % MAXPLAYERS); + + M_SetMenuDelay(pid); + } + + else if (menucmd[pid].dpad_ud > 0) + { + S_StartSound(NULL, sfx_s3k5b); + + playerkickmenu.player = ((playerkickmenu.player + 1) & 7) + (playerkickmenu.player & 8); + + M_SetMenuDelay(pid); + } + + else if (menucmd[pid].dpad_ud < 0) + { + S_StartSound(NULL, sfx_s3k5b); + + playerkickmenu.player = ((playerkickmenu.player + 7) & 7) + (playerkickmenu.player & 8); + + M_SetMenuDelay(pid); + } + + else if (M_MenuBackPressed(pid)) + { + M_GoBack(0); + M_SetMenuDelay(pid); + } + + else if (M_MenuConfirmPressed(pid)) + { + M_SetMenuDelay(pid); + + if ( + playeringame[playerkickmenu.player] + && P_IsMachineLocalPlayer(&players[playerkickmenu.player]) == false + && playerkickmenu.player != serverplayer + ) + { + if ( + K_MinimalCheckNewMidVote(menucallvote) == true +#ifndef DEVELOP + && IsPlayerAdmin(playerkickmenu.player) == false +#endif + ) + { + M_ClearMenus(true); + K_SendCallMidVote(menucallvote, playerkickmenu.player); + return; + } + } + + playerkickmenu.poke = 8; + S_StartSound(NULL, sfx_s3k7b); + } +} + +static menuitem_t PAUSE_KickHandler[] = +{ + {IT_NOTHING | IT_KEYHANDLER, NULL, NULL, NULL, {.routine = M_PlayerKickHandler}, 0, 0}, +}; + +static void M_KickHandlerTick(void) +{ + playerkickmenu.ticker++; + + if (playerkickmenu.poke) + playerkickmenu.poke--; +} + +menu_t PAUSE_KickHandlerDef = { + sizeof(PAUSE_KickHandler) / sizeof(menuitem_t), + &PAUSE_MainDef, + 0, + PAUSE_KickHandler, + 0, 0, + 0, 0, + 0, + NULL, + 0, 0, + M_DrawKickHandler, + M_KickHandlerTick, + NULL, + NULL, + NULL, +}; + +void M_KickHandler(INT32 choice) +{ + PAUSE_KickHandlerDef.prevMenu = currentMenu; + M_SetupNextMenu(&PAUSE_KickHandlerDef, true); +}