diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 46c8f230e..1101172a2 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -62,6 +62,7 @@ #include "deh_tables.h" #include "m_perfstats.h" #include "k_specialstage.h" +#include "k_race.h" #ifdef SRB2_CONFIG_ENABLE_WEBM_MOVIES #include "m_avrecorder.h" @@ -443,7 +444,6 @@ consvar_t cv_kartdebugnodes = CVAR_INIT ("debugnodes", "Off", CV_CHEAT, CV_OnOff consvar_t cv_kartdebugcolorize = CVAR_INIT ("debugcolorize", "Off", CV_CHEAT, CV_OnOff, NULL); consvar_t cv_kartdebugdirector = CVAR_INIT ("debugdirector", "Off", CV_CHEAT, CV_OnOff, NULL); consvar_t cv_spbtest = CVAR_INIT ("spbtest", "Off", CV_CHEAT|CV_NETVAR, CV_OnOff, NULL); -consvar_t cv_gptest = CVAR_INIT ("gptest", "Off", CV_CHEAT|CV_NETVAR, CV_OnOff, NULL); consvar_t cv_debugrank = CVAR_INIT ("debugrank", "Off", CV_CHEAT, CV_OnOff, NULL); consvar_t cv_battletest = CVAR_INIT ("battletest", "Off", CV_CHEAT|CV_NETVAR, CV_OnOff, NULL); @@ -490,7 +490,7 @@ consvar_t cv_pointlimit = CVAR_INIT ("pointlimit", "Default", CV_NETVAR|CV_CALL| static CV_PossibleValue_t timelimit_cons_t[] = {{1, "MIN"}, {30*60, "MAX"}, {0, "None"}, {-1, "Default"}, {0, NULL}}; consvar_t cv_timelimit = CVAR_INIT ("timelimit", "Default", CV_NETVAR|CV_CALL|CV_NOINIT, timelimit_cons_t, TimeLimit_OnChange); -static CV_PossibleValue_t numlaps_cons_t[] = {{1, "MIN"}, {MAX_LAPS, "MAX"}, {0, "Map default"}, {0, NULL}}; +static CV_PossibleValue_t numlaps_cons_t[] = {{0, "MIN"}, {MAX_LAPS, "MAX"}, {-1, "Map default"}, {0, NULL}}; consvar_t cv_numlaps = CVAR_INIT ("numlaps", "Map default", CV_SAVE|CV_NETVAR|CV_CALL|CV_CHEAT, numlaps_cons_t, NumLaps_OnChange); consvar_t cv_forceskin = CVAR_INIT ("forcecharacter", "None", CV_NETVAR|CV_CALL|CV_CHEAT, NULL, ForceSkin_OnChange); @@ -6559,15 +6559,18 @@ static void Command_ShowTime_f(void) // SRB2Kart: On change messages static void NumLaps_OnChange(void) { - if (K_CanChangeRules(false) == false) + if (gamestate == GS_LEVEL) { - return; - } + numlaps = K_RaceLapCount(gamemap - 1); - if (gamestate == GS_LEVEL && leveltime < starttime) - { - CONS_Printf(M_GetText("Number of laps have been set to %d.\n"), cv_numlaps.value); - numlaps = (UINT8)cv_numlaps.value; + if (cv_numlaps.value == -1) + { + CONS_Printf(M_GetText("Number of laps have been set to %d (map default).\n"), numlaps); + } + else + { + CONS_Printf(M_GetText("Number of laps have been set to %d.\n"), numlaps); + } } else { diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 5d8787544..c7e75b83c 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -93,7 +93,7 @@ extern consvar_t cv_votetime; extern consvar_t cv_kartdebugitem, cv_kartdebugamount, cv_kartdebugdistribution, cv_kartdebughuddrop; extern consvar_t cv_kartdebugnodes, cv_kartdebugcolorize, cv_kartdebugdirector; -extern consvar_t cv_spbtest, cv_gptest, cv_reducevfx; +extern consvar_t cv_spbtest, cv_reducevfx; extern consvar_t cv_kartdebugwaypoints, cv_kartdebugbotpredict; extern consvar_t cv_debugrank; extern consvar_t cv_battletest; diff --git a/src/k_kart.c b/src/k_kart.c index d0c387a90..561eb28fa 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -349,7 +349,6 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartdebugdirector); CV_RegisterVar(&cv_debugrank); CV_RegisterVar(&cv_spbtest); - CV_RegisterVar(&cv_gptest); CV_RegisterVar(&cv_capsuletest); CV_RegisterVar(&cv_battletest); CV_RegisterVar(&cv_debugencorevote); diff --git a/src/k_race.c b/src/k_race.c index 0bbe0bfe0..a6d8f2674 100644 --- a/src/k_race.c +++ b/src/k_race.c @@ -421,3 +421,26 @@ void K_RunFinishLineBeam(void) K_DrawFinishLineBeamForLine(offsetb, aimingb, finishBeamLine, true); } } + +/*-------------------------------------------------- + UINT8 K_RaceLapCount(void); + + See header file for description. +--------------------------------------------------*/ + +UINT8 K_RaceLapCount(INT16 mapNum) +{ + if (!(gametyperules & GTR_CIRCUIT)) + { + // Not in Race mode + return 0; + } + + if (cv_numlaps.value == -1) + { + // Use map default + return mapheaderinfo[mapNum]->numlaps; + } + + return cv_numlaps.value; +} diff --git a/src/k_race.h b/src/k_race.h index 390029e96..ed4ded9f8 100644 --- a/src/k_race.h +++ b/src/k_race.h @@ -70,6 +70,22 @@ boolean K_GenerateFinishBeamLine(void); void K_RunFinishLineBeam(void); + +/*-------------------------------------------------- + UINT8 K_RaceLapCount(INT16 mapNum); + + Returns the effective final lap count of the race. + + Input Arguments:- + mapNum - The level to count laps for, 0-indexed. + + Return:- + The lap count to finish. +--------------------------------------------------*/ + +UINT8 K_RaceLapCount(INT16 mapNum); + + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/k_rank.c b/src/k_rank.c index 2419804e8..ec69c78c8 100644 --- a/src/k_rank.c +++ b/src/k_rank.c @@ -22,6 +22,7 @@ #include "r_things.h" #include "fastcmp.h" #include "byteptr.h" +#include "k_race.h" // I was ALMOST tempted to start tearing apart all // of the map loading code and turning it into C++ @@ -304,12 +305,7 @@ void K_InitGrandPrixRank(gpRank_t *rankData) const INT32 cupLevelNum = grandprixinfo.cup->cachedlevels[i]; if (cupLevelNum < nummapheaders && mapheaderinfo[cupLevelNum] != NULL) { - if (!cv_gptest.value) - { - laps += mapheaderinfo[cupLevelNum]->numlaps; - continue; - } - laps++; + laps += K_RaceLapCount(cupLevelNum); } } diff --git a/src/p_setup.c b/src/p_setup.c index ee239c38f..8e0c2d7c5 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -7443,29 +7443,7 @@ static void P_InitGametype(void) if (modeattacking && !demo.playback) P_LoadRecordGhosts(); - if (gametyperules & GTR_CIRCUIT) - { - if (K_CanChangeRules(true) && cv_numlaps.value - && (!(mapheaderinfo[gamemap - 1]->levelflags & LF_SECTIONRACE) - || (mapheaderinfo[gamemap - 1]->numlaps > cv_numlaps.value))) - { - numlaps = cv_numlaps.value; - } - else if ((grandprixinfo.gp == true) - && (grandprixinfo.eventmode == GPEVENT_NONE) - && cv_gptest.value) - { - numlaps = 1; - } - else - { - numlaps = mapheaderinfo[gamemap - 1]->numlaps; - } - } - else - { - numlaps = 0; - } + numlaps = K_RaceLapCount(gamemap - 1); wantedcalcdelay = wantedfrequency*2;