Splitscreen-friendly voting screen

This commit is contained in:
TehRealSalt 2018-05-31 18:49:19 -04:00
parent c7692d6d7c
commit 7d021ae1e6
3 changed files with 144 additions and 64 deletions

View File

@ -1977,13 +1977,18 @@ void D_SetupVote(void)
SendNetXCmd(XD_SETUPVOTE, buf, p - buf); SendNetXCmd(XD_SETUPVOTE, buf, p - buf);
} }
void D_ModifyClientVote(SINT8 voted) void D_ModifyClientVote(SINT8 voted, UINT8 splitplayer)
{ {
char buf[1]; char buf[1];
char *p = buf; char *p = buf;
WRITESINT8(p, voted); if (splitplayer > 0) // Don't actually send anything for splitscreen
SendNetXCmd(XD_MODIFYVOTE, &buf, 1); votes[splitplayer] = voted;
else
{
WRITESINT8(p, voted);
SendNetXCmd(XD_MODIFYVOTE, &buf, 1);
}
} }
void D_PickVote(void) void D_PickVote(void)

View File

@ -252,7 +252,7 @@ void Command_Retry_f(void);
void D_GameTypeChanged(INT32 lastgametype); // not a real _OnChange function anymore void D_GameTypeChanged(INT32 lastgametype); // not a real _OnChange function anymore
void D_MapChange(INT32 pmapnum, INT32 pgametype, boolean pultmode, boolean presetplayers, INT32 pdelay, boolean pskipprecutscene, boolean pfromlevelselect); void D_MapChange(INT32 pmapnum, INT32 pgametype, boolean pultmode, boolean presetplayers, INT32 pdelay, boolean pskipprecutscene, boolean pfromlevelselect);
void D_SetupVote(void); void D_SetupVote(void);
void D_ModifyClientVote(SINT8 voted); void D_ModifyClientVote(SINT8 voted, UINT8 splitplayer);
void D_PickVote(void); void D_PickVote(void);
void ObjectPlace_OnChange(void); void ObjectPlace_OnChange(void);
boolean IsPlayerAdmin(INT32 playernum); boolean IsPlayerAdmin(INT32 playernum);

View File

@ -168,17 +168,23 @@ static void Y_FollowIntermission(void);
static void Y_UnloadData(void); static void Y_UnloadData(void);
// SRB2Kart: voting stuff // SRB2Kart: voting stuff
// Level images
typedef struct typedef struct
{ {
char str[40]; char str[40];
patch_t *pic; patch_t *pic;
} y_votelvlinfo; } y_votelvlinfo;
// Clientside & splitscreen player info.
typedef struct typedef struct
{ {
SINT8 selection; SINT8 selection;
UINT8 delay; UINT8 delay;
} y_voteplayer;
typedef struct
{
y_voteplayer playerinfo[4];
UINT8 ranim; UINT8 ranim;
UINT8 rtics; UINT8 rtics;
UINT8 roffset; UINT8 roffset;
@ -2129,7 +2135,8 @@ static void Y_UnloadData(void)
// //
void Y_VoteDrawer(void) void Y_VoteDrawer(void)
{ {
INT32 i, x, y = 0; INT32 i, x, y = 0, height = 0;
UINT8 selected[4];
if (rendermode == render_none) if (rendermode == render_none)
return; return;
@ -2148,11 +2155,34 @@ void Y_VoteDrawer(void)
(vid.height / vid.dupy) - SHORT(bgpatch->height), (vid.height / vid.dupy) - SHORT(bgpatch->height),
V_SNAPTOTOP|V_SNAPTOLEFT, bgpatch); V_SNAPTOTOP|V_SNAPTOLEFT, bgpatch);
y = 30; for (i = 0; i < 4; i++) // First, we need to figure out the height of this thing...
{
UINT8 j;
selected[i] = 0; // Initialize
for (j = 0; j <= splitscreen; j++)
{
if (voteclient.playerinfo[j].selection == i)
selected[i]++;
}
if (selected[i])
height += 50;
else
height += 25;
if (i < 3)
height += 5-splitscreen;
}
y = (200-height)/2;
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
char str[40]; char str[40];
patch_t *pic; patch_t *pic;
UINT8 sizeadd = selected[i];
UINT8 j;
UINT8 color;
if (i == 3) if (i == 3)
{ {
@ -2166,25 +2196,52 @@ void Y_VoteDrawer(void)
pic = levelinfo[i].pic; pic = levelinfo[i].pic;
} }
if (i == voteclient.selection) if (selected[i])
{ {
if (votes[consoleplayer] == -1) for (j = 0; j <= splitscreen; j++) // another loop for drawing the selection backgrounds in the right order, grumble grumble..
{ {
V_DrawScaledPatch(BASEVIDWIDTH-124, y+21, V_SNAPTORIGHT, cursor); INT32 handy = y;
if (votetic % 4 > 1)
V_DrawFill(BASEVIDWIDTH-101, y-1, 82, 52, 120|V_SNAPTORIGHT); if (voteclient.playerinfo[j].selection != i)
continue;
switch (j)
{
case 1:
color = 215;
break;
case 2:
color = 127;
break;
case 3:
color = 161;
break;
default:
color = 103;
break;
}
handy += 6*(3-splitscreen) + (13*j);
V_DrawScaledPatch(BASEVIDWIDTH-124, handy, V_SNAPTORIGHT, cursor);
if (votetic % 5 == 0)
V_DrawFill(BASEVIDWIDTH-100-sizeadd, y-sizeadd, 80+(sizeadd*2), 50+(sizeadd*2), 120|V_SNAPTORIGHT);
else else
V_DrawFill(BASEVIDWIDTH-101, y-1, 82, 52, 103|V_SNAPTORIGHT); V_DrawFill(BASEVIDWIDTH-100-sizeadd, y-sizeadd, 80+(sizeadd*2), 50+(sizeadd*2), color|V_SNAPTORIGHT);
sizeadd--;
} }
V_DrawSmallScaledPatch(BASEVIDWIDTH-100, y, V_SNAPTORIGHT, pic); V_DrawSmallScaledPatch(BASEVIDWIDTH-100, y, V_SNAPTORIGHT, pic);
V_DrawRightAlignedThinString(BASEVIDWIDTH-20, 40+y, V_SNAPTORIGHT, str); V_DrawRightAlignedThinString(BASEVIDWIDTH-20, 40+y, V_SNAPTORIGHT, str);
y += 55; y += 50;
} }
else else
{ {
V_DrawTinyScaledPatch(BASEVIDWIDTH-60, y, V_SNAPTORIGHT, pic); V_DrawTinyScaledPatch(BASEVIDWIDTH-60, y, V_SNAPTORIGHT, pic);
y += 30; y += 25;
} }
y += 5-splitscreen;
} }
x = 20; x = 20;
@ -2224,9 +2281,6 @@ void Y_VoteDrawer(void)
} }
} }
if (splitscreen) // only 1p has a vote in splitscreen
break;
y += 30; y += 30;
if (y > BASEVIDHEIGHT-40) if (y > BASEVIDHEIGHT-40)
@ -2248,7 +2302,6 @@ void Y_VoteDrawer(void)
// //
void Y_VoteTicker(void) void Y_VoteTicker(void)
{ {
boolean pressed = false;
INT32 i; INT32 i;
if (paused || P_AutoPause()) if (paused || P_AutoPause())
@ -2267,7 +2320,7 @@ void Y_VoteTicker(void)
{ {
if (!playeringame[i] || players[i].spectator) if (!playeringame[i] || players[i].spectator)
votes[i] = -1; // Spectators are the lower class, and have effectively no voice in the government. Democracy sucks. votes[i] = -1; // Spectators are the lower class, and have effectively no voice in the government. Democracy sucks.
else if (pickedvote != -1 && votes[i] == -1 && !splitscreen) else if (pickedvote != -1 && votes[i] == -1)
votes[i] = 3; // Slow people get random votes[i] = 3; // Slow people get random
} }
@ -2280,9 +2333,6 @@ void Y_VoteTicker(void)
if (timer) if (timer)
timer--; timer--;
if (voteclient.delay)
voteclient.delay--;
if (pickedvote != -1) if (pickedvote != -1)
{ {
timer = 0; timer = 0;
@ -2325,7 +2375,7 @@ void Y_VoteTicker(void)
if (voteclient.rendoff == 0) if (voteclient.rendoff == 0)
{ {
if (tempvotes[((pickedvote + voteclient.roffset + 4) % numvotes)] == pickedvote if (tempvotes[((pickedvote + voteclient.roffset + 4) % numvotes)] == pickedvote
&& voteclient.rsynctime % 50 == 0) // Song is 1.45 seconds long (sorry @ whoever wants to replace it in a music wad :V) && voteclient.rsynctime % 51 == 0) // Song is 1.45 seconds long (sorry @ whoever wants to replace it in a music wad :V)
{ {
voteclient.rendoff = voteclient.roffset+4; voteclient.rendoff = voteclient.roffset+4;
S_ChangeMusicInternal("voteeb", false); S_ChangeMusicInternal("voteeb", false);
@ -2346,34 +2396,63 @@ void Y_VoteTicker(void)
if (votetic < 3*(NEWTICRATE/7)) // give it some time before letting you control it :V if (votetic < 3*(NEWTICRATE/7)) // give it some time before letting you control it :V
return; return;
if ((playeringame[consoleplayer] && !players[consoleplayer].spectator) for (i = 0; i <= splitscreen; i++)
&& !voteclient.delay && pickedvote == -1 && votes[consoleplayer] == -1)
{ {
if (InputDown(gc_aimforward, 1) || JoyAxis(AXISMOVE, 1) < 0) UINT8 p;
{ boolean pressed = false;
voteclient.selection--;
pressed = true;
}
if ((InputDown(gc_aimbackward, 1) || JoyAxis(AXISMOVE, 1) > 0) && !pressed)
{
voteclient.selection++;
pressed = true;
}
if (voteclient.selection < 0)
voteclient.selection = 3;
if (voteclient.selection > 3)
voteclient.selection = 0;
if (InputDown(gc_accelerate, 1) && !pressed)
{
D_ModifyClientVote(voteclient.selection);
pressed = true;
}
}
if (pressed) switch (i)
{ {
S_StartSound(NULL, sfx_kc4a); case 1:
voteclient.delay = NEWTICRATE/7; p = secondarydisplayplayer;
break;
case 2:
p = thirddisplayplayer;
break;
case 3:
p = fourthdisplayplayer;
break;
default:
p = consoleplayer;
break;
}
if (voteclient.playerinfo[i].delay)
voteclient.playerinfo[i].delay--;
if ((playeringame[p] && !players[p].spectator)
&& !voteclient.playerinfo[i].delay
&& pickedvote == -1 && votes[p] == -1)
{
if (InputDown(gc_aimforward, i+1) || JoyAxis(AXISAIM, i+1) < 0)
{
voteclient.playerinfo[i].selection--;
pressed = true;
}
if ((InputDown(gc_aimbackward, i+1) || JoyAxis(AXISAIM, i+1) > 0) && !pressed)
{
voteclient.playerinfo[i].selection++;
pressed = true;
}
if (voteclient.playerinfo[i].selection < 0)
voteclient.playerinfo[i].selection = 3;
if (voteclient.playerinfo[i].selection > 3)
voteclient.playerinfo[i].selection = 0;
if ((InputDown(gc_accelerate, i+1) || JoyAxis(AXISMOVE, i+1) > 0) && !pressed)
{
D_ModifyClientVote(voteclient.playerinfo[i].selection, i);
pressed = true;
}
}
if (pressed)
{
S_StartSound(NULL, sfx_kc4a);
voteclient.playerinfo[i].delay = NEWTICRATE/7;
}
} }
if (server) if (server)
@ -2382,25 +2461,17 @@ void Y_VoteTicker(void)
{ {
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
if ((playeringame[i] && !players[i].spectator) && votes[i] == -1 && !splitscreen) if ((playeringame[i] && !players[i].spectator) && votes[i] == -1)
votes[i] = 3; votes[i] = 3;
} }
} }
else else
{ {
if (splitscreen) for (i = 0; i < MAXPLAYERS; i++)
{ {
if (votes[0] == -1) if ((playeringame[i] && !players[i].spectator) && votes[i] == -1)
return; return;
} }
else
{
for (i = 0; i < MAXPLAYERS; i++)
{
if ((playeringame[i] && !players[i].spectator) && votes[i] == -1)
return;
}
}
} }
timer = 0; timer = 0;
@ -2434,8 +2505,12 @@ void Y_StartVote(void)
timer = cv_votetime.value*TICRATE; timer = cv_votetime.value*TICRATE;
pickedvote = -1; pickedvote = -1;
voteclient.selection = 0; for (i = 0; i < 3; i++)
voteclient.delay = 0; {
voteclient.playerinfo[i].selection = 0;
voteclient.playerinfo[i].delay = 0;
}
voteclient.ranim = 0; voteclient.ranim = 0;
voteclient.rtics = 1; voteclient.rtics = 1;
voteclient.roffset = 0; voteclient.roffset = 0;
@ -2538,7 +2613,7 @@ void Y_SetupVoteFinish(SINT8 pick, SINT8 level)
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
if ((playeringame[i] && !players[i].spectator) && votes[i] == -1 && !splitscreen) if ((playeringame[i] && !players[i].spectator) && votes[i] == -1)
votes[i] = 3; votes[i] = 3;
if (votes[i] == -1 || endtype > 1) // Don't need to go on if (votes[i] == -1 || endtype > 1) // Don't need to go on