diff --git a/src/d_netcmd.c b/src/d_netcmd.c index e1b5986a38e5ad1c4dbcadf18519e26efddd6a24..3bd9e6df7fe9eec356c5ca7c5fbb07c711196617 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -367,7 +367,8 @@ consvar_t cv_kartfrantic = {"kartfrantic", "Off", CV_NETVAR|CV_CHEAT|CV_CALL|CV_ consvar_t cv_kartcomeback = {"kartcomeback", "On", CV_NETVAR|CV_CHEAT|CV_CALL|CV_NOINIT, CV_OnOff, KartComeback_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartencore = {"kartencore", "Off", CV_NETVAR|CV_CALL|CV_NOINIT, CV_OnOff, KartEncore_OnChange, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t kartvoterulechanges_cons_t[] = {{0, "Never"}, {1, "Sometimes"}, {2, "Frequent"}, {3, "Always"}, {0, NULL}}; -consvar_t cv_kartvoterulechanges = {"kartvoterulechanges", "Frequent", CV_NETVAR, kartvoterulechanges_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartgametypechanges = {"kartgametypechanges", "Frequent", CV_NETVAR, kartvoterulechanges_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartencorechance = {"kartencorechance", "Frequent", CV_NETVAR, kartvoterulechanges_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t kartspeedometer_cons_t[] = {{0, "Off"}, {1, "Kilometers"}, {2, "Miles"}, {3, "Fracunits"}, {0, NULL}}; consvar_t cv_kartspeedometer = {"kartdisplayspeed", "Off", CV_SAVE, kartspeedometer_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; // use tics in display static CV_PossibleValue_t kartvoices_cons_t[] = {{0, "Never"}, {1, "Tasteful"}, {2, "Meme"}, {0, NULL}}; @@ -468,6 +469,9 @@ consvar_t cv_sleep = {"cpusleep", "1", CV_SAVE, sleeping_cons_t, NULL, -1, NULL, consvar_t cv_nodownloads = { "downloadnotice", "", CV_SAVE }; +consvar_t cv_lessbattlevotes = {"lessbattlevotes", "No", CV_SAVE, CV_YesNo}; +consvar_t cv_lessencorevotes = {"lessencorevotes", "No", CV_SAVE, CV_YesNo}; + INT16 gametype = GT_RACE; // SRB2kart boolean forceresetplayers = false; boolean deferencoremode = false; @@ -723,6 +727,9 @@ void D_RegisterServerCommands(void) #endif CV_RegisterVar(&cv_dummyconsvar); + + CV_RegisterVar(&cv_lessbattlevotes); + CV_RegisterVar(&cv_lessencorevotes); } // ========================================================================= @@ -2365,14 +2372,33 @@ void D_SetupVote(void) UINT8 buf[6*2]; // five UINT16 maps (at twice the width of a UINT8), and two gametypes UINT8 *p = buf; INT32 i; - UINT8 secondgt = G_SometimesGetDifferentGametype(); + UINT8 gt; + UINT8 secondgt; INT16 votebuffer[3] = {-1,-1,-1}; - if (cv_kartencore.value && G_RaceGametype()) - WRITEUINT8(p, (gametype|0x80)); + if (cv_lessbattlevotes.value && G_BattleGametype()) + { + gt = GT_RACE; + secondgt = GT_MATCH; + } else - WRITEUINT8(p, gametype); + { + gt = gametype; + secondgt = G_SometimesGetDifferentGametype(); + if (cv_lessencorevotes.value) + { + if (secondgt == GT_RACE) + secondgt |= 0x80; + } + else + { + if (cv_kartencore.value && G_RaceGametype()) + gt |= 0x80; + } + } + WRITEUINT8(p, gt); WRITEUINT8(p, secondgt); + gt &= ~0x80; secondgt &= ~0x80; for (i = 0; i < 5; i++) @@ -2381,9 +2407,9 @@ void D_SetupVote(void) if (i == 2) // sometimes a different gametype m = G_RandMap(G_TOLFlag(secondgt), prevmap, false, 0, true, votebuffer); else if (i >= 3) // unknown-random and force-unknown MAP HELL - m = G_RandMap(G_TOLFlag(gametype), prevmap, false, (i-2), (i < 4), votebuffer); + m = G_RandMap(G_TOLFlag(gt), prevmap, false, (i-2), (i < 4), votebuffer); else - m = G_RandMap(G_TOLFlag(gametype), prevmap, false, 0, true, votebuffer); + m = G_RandMap(G_TOLFlag(gt), prevmap, false, 0, true, votebuffer); if (i < 3) votebuffer[min(i, 2)] = m; // min() is a dumb workaround for gcc 4.4 array-bounds error WRITEUINT16(p, m); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index c8b306f4bda11e593a727bd317147cf9a5f5a0dc..68fd6a5902a2d3b81303d5696b780aea2836c888 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -117,7 +117,8 @@ extern consvar_t cv_kartbumpers; extern consvar_t cv_kartfrantic; extern consvar_t cv_kartcomeback; extern consvar_t cv_kartencore; -extern consvar_t cv_kartvoterulechanges; +extern consvar_t cv_kartgametypechanges; +extern consvar_t cv_kartencorechance;; extern consvar_t cv_kartspeedometer; extern consvar_t cv_kartvoices; @@ -153,6 +154,9 @@ extern consvar_t cv_sleep; extern consvar_t cv_nodownloads; +extern consvar_t cv_lessbattlevotes; +extern consvar_t cv_lessencorevotes; + typedef enum { XD_NAMEANDCOLOR = 1, diff --git a/src/g_game.c b/src/g_game.c index a1521981eb38a1ff854cd5ee9fa2ddc690755a83..e68bb8fcbcf435be7ed45ee137fa66cc56db1fca 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3408,26 +3408,29 @@ INT16 G_SometimesGetDifferentGametype(void) { boolean encorepossible = (M_SecretUnlocked(SECRET_ENCORE) && G_RaceGametype()); - if (!cv_kartvoterulechanges.value) // never - return gametype; - - if (randmapbuffer[NUMMAPS] > 0 && (encorepossible || cv_kartvoterulechanges.value != 3)) + if (( randmapbuffer[NUMMAPS] > 0 || cv_kartgametypechanges.value == 0 ) && + encorepossible) { - randmapbuffer[NUMMAPS]--; + if (cv_kartgametypechanges.value == 3) + randmapbuffer[NUMMAPS] = 0;/* may not be set from cvar change */ + else + randmapbuffer[NUMMAPS]--; + if (encorepossible) { - switch (cv_kartvoterulechanges.value) + switch (cv_kartencorechance.value) { case 3: // always - randmapbuffer[NUMMAPS] = 0; // gotta prep this in case it isn't already set + encorepossible = true; break; case 2: // frequent encorepossible = M_RandomChance(FRACUNIT>>1); break; case 1: // sometimes - default: encorepossible = M_RandomChance(FRACUNIT>>2); break; + default: + encorepossible = false; } if (encorepossible != (boolean)cv_kartencore.value) return (gametype|0x80); @@ -3435,7 +3438,7 @@ INT16 G_SometimesGetDifferentGametype(void) return gametype; } - switch (cv_kartvoterulechanges.value) // okay, we're having a gametype change! when's the next one, luv? + switch (cv_kartgametypechanges.value) // okay, we're having a gametype change! when's the next one, luv? { case 3: // always randmapbuffer[NUMMAPS] = 1; // every other vote (or always if !encorepossible) @@ -3448,6 +3451,8 @@ INT16 G_SometimesGetDifferentGametype(void) case 2: // frequent randmapbuffer[NUMMAPS] = 2; // ...every 1/2th-ish cup? break; + case 0: /* never */ + return gametype; } if (gametype == GT_MATCH) diff --git a/src/k_kart.c b/src/k_kart.c index 76797a74e6740483b23ae7685e898c96a491c0c0..eff31eb827602e97d40e36a6e69163cb33056d13 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -574,7 +574,8 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartfrantic); CV_RegisterVar(&cv_kartcomeback); CV_RegisterVar(&cv_kartencore); - CV_RegisterVar(&cv_kartvoterulechanges); + CV_RegisterVar(&cv_kartgametypechanges); + CV_RegisterVar(&cv_kartencorechance); CV_RegisterVar(&cv_kartspeedometer); CV_RegisterVar(&cv_kartvoices); CV_RegisterVar(&cv_karteliminatelast); diff --git a/src/m_menu.c b/src/m_menu.c index 245c01485f71c89396f3e606fcf4c96bf279174b..c1d91c1671a62138a7d9e60cca1c590c3b1c53ce 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1498,16 +1498,17 @@ static menuitem_t OP_ServerOptionsMenu[] = {IT_STRING | IT_CVAR, NULL, "Intermission Timer", &cv_inttime, 40}, {IT_STRING | IT_CVAR, NULL, "Map Progression", &cv_advancemap, 50}, {IT_STRING | IT_CVAR, NULL, "Voting Timer", &cv_votetime, 60}, - {IT_STRING | IT_CVAR, NULL, "Voting Rule Changes", &cv_kartvoterulechanges, 70}, + {IT_STRING | IT_CVAR, NULL, "Voting Gametype Changes", &cv_kartgametypechanges, 70}, + {IT_STRING | IT_CVAR, NULL, "Voting Encore Chance", &cv_kartencorechance, 80}, #ifndef NONET - {IT_STRING | IT_CVAR, NULL, "Max. Player Count", &cv_maxplayers, 90}, - {IT_STRING | IT_CVAR, NULL, "Allow Players to Join", &cv_allownewplayer, 100}, - {IT_STRING | IT_CVAR, NULL, "Allow Add-on Downloading", &cv_downloading, 110}, - {IT_STRING | IT_CVAR, NULL, "Pause Permission", &cv_pause, 120}, - {IT_STRING | IT_CVAR, NULL, "Mute All Chat", &cv_mute, 130}, + {IT_STRING | IT_CVAR, NULL, "Max. Player Count", &cv_maxplayers, 100}, + {IT_STRING | IT_CVAR, NULL, "Allow Players to Join", &cv_allownewplayer, 110}, + {IT_STRING | IT_CVAR, NULL, "Allow Add-on Downloading", &cv_downloading, 120}, + {IT_STRING | IT_CVAR, NULL, "Pause Permission", &cv_pause, 130}, + {IT_STRING | IT_CVAR, NULL, "Mute All Chat", &cv_mute, 140}, - {IT_SUBMENU|IT_STRING, NULL, "Advanced Options...", &OP_AdvServerOptionsDef,150}, + {IT_SUBMENU|IT_STRING, NULL, "Advanced Options...", &OP_AdvServerOptionsDef,160}, #endif };