diff --git a/src/cvars.cpp b/src/cvars.cpp index 633250a73..3ce1dc505 100644 --- a/src/cvars.cpp +++ b/src/cvars.cpp @@ -727,6 +727,7 @@ void KartSpeed_OnChange(void); consvar_t cv_kartspeed = UnsavedNetVar("gamespeed", "Auto Gear").values(kartspeed_cons_t).onchange_noinit(KartSpeed_OnChange); consvar_t cv_teamplay = UnsavedNetVar("teamplay", "Off").on_off(); +consvar_t cv_duel = UnsavedNetVar("duel", "On").on_off(); consvar_t cv_kartusepwrlv = UnsavedNetVar("mobiums", "Yes").yes_no(); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 7391d0921..3aa2af849 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -82,6 +82,7 @@ extern consvar_t cv_kartbot; extern consvar_t cv_karteliminatelast; extern consvar_t cv_thunderdome; extern consvar_t cv_teamplay; +extern consvar_t cv_duel; extern consvar_t cv_kartusepwrlv; #ifdef DEVELOP extern consvar_t cv_kartencoremap; @@ -182,7 +183,6 @@ typedef enum XD_SCHEDULETASK, // 34 XD_SCHEDULECLEAR, // 35 XD_AUTOMATE, // 36 - // 37 is free XD_MAPQUEUE = XD_AUTOMATE+2, // 38 XD_CALLZVOTE, // 39 XD_SETZVOTE, // 40 diff --git a/src/doomstat.h b/src/doomstat.h index c239fa5f2..97c58c441 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -872,6 +872,7 @@ extern UINT8 gamespeed; extern boolean franticitems; extern boolean encoremode, prevencoremode; extern boolean g_teamplay; +extern boolean g_duelpermitted; extern tic_t wantedcalcdelay; extern tic_t itemCooldowns[NUMKARTITEMS - 1]; diff --git a/src/g_game.c b/src/g_game.c index 850bdace5..7138f8957 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -296,6 +296,9 @@ boolean franticitems; // Frantic items currently enabled? // (Certain gametypes can override this -- prefer using G_GametypeHasTeams().) boolean g_teamplay; +// Server wants to allow Duel mode? +boolean g_duelpermitted; + // Voting system UINT16 g_voteLevels[VOTE_NUM_LEVELS][2]; // Levels that were rolled by the host SINT8 g_votes[VOTE_TOTAL]; // Each player's vote diff --git a/src/k_hud.cpp b/src/k_hud.cpp index 4e32c8150..ce5549703 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -3308,7 +3308,7 @@ static void K_drawKartDuelScores(void) player_t *foe = K_DuelOpponent(stplyr); INT32 basex = 0; - INT32 basey = 40; + INT32 basey = 48; INT32 flags = V_SNAPTOLEFT|V_HUDTRANS|V_SLIDEIN; // score bars, here barheight is the size of bars at tied score diff --git a/src/k_kart.c b/src/k_kart.c index 8a1a6869a..17492746d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -121,7 +121,13 @@ boolean K_DuelItemAlwaysSpawns(mapthing_t *mt) boolean K_InRaceDuel(void) { - return (inDuel && (gametyperules & GTR_CIRCUIT) && !(mapheaderinfo[gamemap-1]->levelflags & LF_SECTIONRACE)) && !specialstageinfo.valid; + return ( + inDuel && + (gametyperules & GTR_CIRCUIT) && + !(mapheaderinfo[gamemap-1]->levelflags & LF_SECTIONRACE) && + !specialstageinfo.valid && + g_duelpermitted + ); } player_t *K_DuelOpponent(player_t *player) @@ -15149,10 +15155,6 @@ void K_CheckSpectateStatus(boolean considermapreset) if (!cv_allowteamchange.value) return; - // DON'T allow if you've hit the in-game player cap - if (cv_maxplayers.value && numhumans >= cv_maxplayers.value) - return; - // Get the number of players in game, and the players to be de-spectated. for (i = 0; i < MAXPLAYERS; i++) { diff --git a/src/menus/options-gameplay-1.c b/src/menus/options-gameplay-1.c index 7cf67ee3f..574fd391d 100644 --- a/src/menus/options-gameplay-1.c +++ b/src/menus/options-gameplay-1.c @@ -56,6 +56,9 @@ menuitem_t OPTIONS_Gameplay[] = {IT_HEADER, "Duel...", NULL, NULL, {NULL}, 0, 0}, + {IT_STRING | IT_CVAR, "Duel", "A one-versus-one tug of war! Disable for standard racing.", + NULL, {.cvar = &cv_duel}, 0, 0}, + {IT_STRING | IT_CVAR, "Duel Time Limit", "How long it takes for Margin Boost to kick in (seconds).", NULL, {.cvar = &cv_dueltimelimit}, 0, 0}, diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 6eced0c66..9a781ac12 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -7674,6 +7674,7 @@ static void P_InitLevelSettings(void) gamespeed = multi_speed ? KARTSPEED_EASY : gametypes[gametype]->speed; franticitems = false; g_teamplay = false; + g_duelpermitted = false; if (K_PodiumSequence() == true) { @@ -7721,6 +7722,8 @@ static void P_InitLevelSettings(void) } franticitems = (boolean)cv_kartfrantic.value; g_teamplay = (boolean)cv_teamplay.value; // we will overwrite this later if there is not enough players + g_duelpermitted = (boolean)cv_duel.value; // Ignored if too many players, see K_InRaceDuel + } memset(&battleovertime, 0, sizeof(struct battleovertime));