diff --git a/src/d_netcmd.c b/src/d_netcmd.c index e926cf520..c524d325e 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -2376,13 +2376,12 @@ void D_ModifyClientVote(UINT8 player, SINT8 voted) SendNetXCmdForPlayer(sendPlayer, XD_MODIFYVOTE, buf, p - buf); } -void D_PickVote(void) +void D_PickVote(SINT8 angry_map) { - char buf[2]; + char buf[3]; char* p = buf; SINT8 temppicks[VOTE_TOTAL]; SINT8 templevels[VOTE_TOTAL]; - SINT8 votecompare = VOTE_NOT_PICKED; UINT8 numvotes = 0, key = 0; INT32 i; @@ -2393,16 +2392,23 @@ void D_PickVote(void) continue; } + if (i == VOTE_SPECIAL && angry_map != VOTE_NOT_PICKED) + { + // Anger map is going to change because of + // the vote ending. We need to account for this + // here because a net command would not be ready + // in time for this code. + temppicks[numvotes] = i; + templevels[numvotes] = angry_map; + numvotes++; + continue; + } + if (g_votes[i] != VOTE_NOT_PICKED) { temppicks[numvotes] = i; templevels[numvotes] = g_votes[i]; numvotes++; - - if (votecompare == VOTE_NOT_PICKED) - { - votecompare = g_votes[i]; - } } } @@ -2411,14 +2417,16 @@ void D_PickVote(void) key = M_RandomKey(numvotes); WRITESINT8(p, temppicks[key]); WRITESINT8(p, templevels[key]); + WRITESINT8(p, angry_map); } else { WRITESINT8(p, VOTE_NOT_PICKED); WRITESINT8(p, 0); + WRITESINT8(p, VOTE_NOT_PICKED); } - SendNetXCmd(XD_PICKVOTE, &buf, 2); + SendNetXCmd(XD_PICKVOTE, &buf, 3); } static char * @@ -5859,6 +5867,7 @@ static void Got_PickVotecmd(const UINT8 **cp, INT32 playernum) { SINT8 pick = READSINT8(*cp); SINT8 level = READSINT8(*cp); + SINT8 anger = READSINT8(*cp); if (playernum != serverplayer && !IsPlayerAdmin(playernum)) { @@ -5868,7 +5877,7 @@ static void Got_PickVotecmd(const UINT8 **cp, INT32 playernum) return; } - Y_SetupVoteFinish(pick, level); + Y_SetupVoteFinish(pick, level, anger); } static void Got_ScheduleTaskcmd(const UINT8 **cp, INT32 playernum) diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 5a1a79255..f6d863aac 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -249,7 +249,7 @@ void D_GameTypeChanged(INT32 lastgametype); // not a real _OnChange function any void D_MapChange(UINT16 pmapnum, INT32 pgametype, boolean pencoremode, boolean presetplayers, INT32 pdelay, boolean pskipprecutscene, boolean pforcespecialstage); void D_SetupVote(INT16 newgametype); void D_ModifyClientVote(UINT8 player, SINT8 voted); -void D_PickVote(void); +void D_PickVote(SINT8 angry_map); void ObjectPlace_OnChange(void); void P_SetPlayerSpectator(INT32 playernum); boolean IsPlayerAdmin(INT32 playernum); diff --git a/src/k_vote.c b/src/k_vote.c index ca6bb4c79..9f3ba2c32 100644 --- a/src/k_vote.c +++ b/src/k_vote.c @@ -1352,7 +1352,7 @@ static void Y_TickVoteRoulette(void) } } -static void Y_TryMapAngerVote(void) +static SINT8 Y_TryMapAngerVote(void) { SINT8 angryMaps[VOTE_NUM_LEVELS] = { -1 }; size_t angryMapsCount = 0; @@ -1381,7 +1381,7 @@ static void Y_TryMapAngerVote(void) if (numPlayers < 3) { // Don't handle map anger if there's not enough players. - return; + return VOTE_NOT_PICKED; } for (i = 0; i < VOTE_NUM_LEVELS; i++) @@ -1409,12 +1409,12 @@ static void Y_TryMapAngerVote(void) if (angryMapsCount == 0) { - return; + return VOTE_NOT_PICKED; } // Set the special vote to a random angry map. pick = M_RandomKey(angryMapsCount); - D_ModifyClientVote(UINT8_MAX, angryMaps[pick]); + return angryMaps[pick]; } static void Y_TickVoteSelection(void) @@ -1542,8 +1542,7 @@ static void Y_TickVoteSelection(void) if (server) { - Y_TryMapAngerVote(); - D_PickVote(); + D_PickVote( Y_TryMapAngerVote() ); } } } @@ -1593,7 +1592,7 @@ void Y_VoteTicker(void) if (server && g_pickedVote != VOTE_NOT_PICKED && g_votes[g_pickedVote] == VOTE_NOT_PICKED) // Uh oh! The person who got picked left! Recalculate, quick! { - D_PickVote(); + D_PickVote( VOTE_NOT_PICKED ); } if (vote.tic == 0) @@ -1849,13 +1848,18 @@ enum VOTE_END_NORMAL, }; -void Y_SetupVoteFinish(SINT8 pick, SINT8 level) +void Y_SetupVoteFinish(SINT8 pick, SINT8 level, SINT8 anger) { if (vote.loaded == false) { return; } + if (anger != VOTE_NOT_PICKED) + { + Y_SetPlayersVote(VOTE_SPECIAL, anger); + } + if (pick == VOTE_NOT_PICKED || level == VOTE_NOT_PICKED) // No other votes? We gotta get out of here, then! { Y_EndVote(); diff --git a/src/k_vote.h b/src/k_vote.h index 652eb865a..f78310a92 100644 --- a/src/k_vote.h +++ b/src/k_vote.h @@ -31,7 +31,7 @@ void Y_VoteDrawer(void); void Y_VoteTicker(void); void Y_StartVote(void); void Y_EndVote(void); -void Y_SetupVoteFinish(SINT8 pick, SINT8 level); +void Y_SetupVoteFinish(SINT8 pick, SINT8 level, SINT8 anger); #ifdef __cplusplus } // extern "C"