diff --git a/src/deh_soc.c b/src/deh_soc.c index 047a396af..e5864f88f 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -784,6 +784,7 @@ void readgametype(MYFILE *f, char *gtname) INT32 newgtpointlimit = 0; INT32 newgttimelimit = 0; UINT8 newgtinttype = 0; + SINT8 newgtspeed = KARTSPEED_AUTO; // KARTSPEED_EASY char gtconst[MAXLINELEN]; char gppic[9]; char gppicmini[9]; @@ -850,6 +851,29 @@ void readgametype(MYFILE *f, char *gtname) // Case sensitive newgtinttype = (int)get_number(word2lwr); } + else if (fastcmp(word, "GAMESPEED")) + { + if (fasticmp(word2, "EASY")) + { + newgtspeed = KARTSPEED_EASY; + } + else if (fasticmp(word2, "NORMAL")) + { + newgtspeed = KARTSPEED_NORMAL; + } + else if (fasticmp(word2, "HARD")) + { + newgtspeed = KARTSPEED_HARD; + } + else if (fasticmp(word2, "ANY")) + { + newgtspeed = KARTSPEED_AUTO; + } + else + { + deh_warning("readgametype %s: unknown gamespeed name %s\n", gtname, word2); + } + } // Type of level else if (fastcmp(word, "TYPEOFLEVEL")) { @@ -942,6 +966,7 @@ void readgametype(MYFILE *f, char *gtname) newgametype->intermission = newgtinttype; newgametype->pointlimit = newgtpointlimit; newgametype->timelimit = newgttimelimit; + newgametype->speed = newgtspeed; gametypes[numgametypes++] = newgametype; diff --git a/src/doomstat.h b/src/doomstat.h index 011d21c78..2ce04ea0f 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -624,6 +624,7 @@ struct gametype_t UINT32 rules; UINT32 tol; UINT8 intermission; + SINT8 speed; INT32 pointlimit; INT32 timelimit; char gppic[9]; diff --git a/src/g_game.c b/src/g_game.c index 73edf9909..03e286d80 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3181,6 +3181,7 @@ static gametype_t defaultgametypes[] = GTR_CIRCUIT|GTR_BOTS|GTR_ENCORE, TOL_RACE, int_time, + KARTSPEED_AUTO, 0, 0, "", @@ -3194,6 +3195,7 @@ static gametype_t defaultgametypes[] = GTR_SPHERES|GTR_BUMPERS|GTR_PAPERITEMS|GTR_POWERSTONES|GTR_KARMA|GTR_ITEMARROWS|GTR_PRISONS|GTR_BATTLESTARTS|GTR_POINTLIMIT|GTR_TIMELIMIT|GTR_OVERTIME|GTR_CLOSERPLAYERS, TOL_BATTLE, int_scoreortimeattack, + KARTSPEED_EASY, 0, 3, "TT_RNDB", @@ -3207,6 +3209,7 @@ static gametype_t defaultgametypes[] = GTR_CATCHER|GTR_SPECIALSTART|GTR_ROLLINGSTART|GTR_CIRCUIT|GTR_NOPOSITION, TOL_SPECIAL, int_time, + KARTSPEED_AUTO, 0, 0, "TT_RNDSS", @@ -3220,6 +3223,7 @@ static gametype_t defaultgametypes[] = GTR_BOSS|GTR_SPHERES|GTR_BUMPERS|GTR_POINTLIMIT|GTR_CLOSERPLAYERS|GTR_NOCUPSELECT|GTR_ENCORE, TOL_VERSUS, int_scoreortimeattack, + KARTSPEED_EASY, 0, 0, "", @@ -3233,6 +3237,7 @@ static gametype_t defaultgametypes[] = GTR_CHECKPOINTS|GTR_NOMP|GTR_NOCUPSELECT|GTR_NOPOSITION, TOL_TUTORIAL, int_none, + KARTSPEED_EASY, 0, 0, "", diff --git a/src/hu_stuff.c b/src/hu_stuff.c index dad44cbcd..a013ddc19 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2516,7 +2516,7 @@ static void HU_DrawRankings(void) V_DrawCenteredString(256, 8, 0, "POINT LIMIT"); V_DrawCenteredString(256, 16, hilicol, va("%d", g_pointlimit)); } - else if (gametyperules & GTR_CIRCUIT) + else if (gametypes[gametype]->speed == KARTSPEED_AUTO) { V_DrawCenteredString(256, 8, 0, "GAME SPEED"); V_DrawCenteredString(256, 16, hilicol, (cv_4thgear.value) ? va("4th Gear") : kartspeed_cons_t[1+gamespeed].strvalue); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 8eb4b406b..60916c580 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -2567,6 +2567,7 @@ static int lib_gAddGametype(lua_State *L) INT32 newgtpointlimit = 0; INT32 newgttimelimit = 0; UINT8 newgtinttype = 0; + SINT8 newgtspeed = KARTSPEED_AUTO; INT16 j; luaL_checktype(L, 1, LUA_TTABLE); @@ -2632,6 +2633,14 @@ static int lib_gAddGametype(lua_State *L) if (!lua_isstring(L, 3)) TYPEERROR("gppicmini", LUA_TSTRING) gppicmini = lua_tostring(L, 3); + } else if (i == 10 || (k && fasticmp(k, "speed"))) { + if (!lua_isnumber(L, 3)) + TYPEERROR("speed", LUA_TNUMBER) + newgtspeed = (UINT32)lua_tointeger(L, 3); + if (newgtspeed < KARTSPEED_AUTO || newgtspeed > KARTSPEED_HARD) + { + newgtspeed = KARTSPEED_AUTO; + } } lua_pop(L, 1); } @@ -2672,6 +2681,7 @@ static int lib_gAddGametype(lua_State *L) newgametype->intermission = newgtinttype; newgametype->pointlimit = newgtpointlimit; newgametype->timelimit = newgttimelimit; + newgametype->speed = newgtspeed; if (gppic != NULL) { diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 5e472be84..97956f579 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -7673,7 +7673,8 @@ static void P_InitLevelSettings(void) g_exit.retry = false; // Gamespeed and frantic items - gamespeed = KARTSPEED_EASY; + const boolean multi_speed = (gametypes[gametype]->speed == KARTSPEED_AUTO); + gamespeed = multi_speed ? KARTSPEED_EASY : gametypes[gametype]->speed; franticitems = false; if (K_PodiumSequence() == true) @@ -7688,7 +7689,7 @@ static void P_InitLevelSettings(void) } else if (grandprixinfo.gp == true) { - if (gametyperules & GTR_CIRCUIT) + if (multi_speed) { gamespeed = grandprixinfo.gamespeed; } @@ -7698,18 +7699,21 @@ static void P_InitLevelSettings(void) || tutorialchallenge == TUTORIALSKIP_INPROGRESS ) { - if ((gametyperules & GTR_CATCHER) && encoremode == false) + if (multi_speed) { - gamespeed = KARTSPEED_NORMAL; - } - else if (gametyperules & GTR_CIRCUIT) - { - gamespeed = KARTSPEED_HARD; + if ((gametyperules & GTR_CATCHER) && encoremode == false) + { + gamespeed = KARTSPEED_NORMAL; + } + else + { + gamespeed = KARTSPEED_HARD; + } } } else { - if (gametyperules & GTR_CIRCUIT) + if (multi_speed) { if (cv_kartspeed.value == KARTSPEED_AUTO) gamespeed = ((speedscramble == -1) ? KARTSPEED_NORMAL : (UINT8)speedscramble);