Votekick menu

Not super polished, literally just implemented this way to make freeze
This commit is contained in:
toaster 2023-06-27 23:59:01 +01:00
parent d8ea8c0fe1
commit b59346f637
5 changed files with 224 additions and 2 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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
)

View file

@ -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
{

View file

@ -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);
}