From a3367858b843d6b49b8d71b9acfadf3b4d0a5aef Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 22 Jun 2025 11:01:31 -0400 Subject: [PATCH] Add expert speed --- src/command.c | 3 ++- src/command.h | 4 +++- src/d_main.cpp | 18 ++++++++++++++++-- src/d_netcmd.c | 17 ++++++++++++++--- src/d_netcmd.h | 1 + src/deh_tables.c | 1 + src/k_kart.c | 9 +++++++++ src/k_kart.h | 1 + src/k_pwrlv.c | 13 ++++++++++++- src/m_menu.c | 7 ++++++- src/p_mobj.c | 2 ++ 11 files changed, 67 insertions(+), 9 deletions(-) diff --git a/src/command.c b/src/command.c index 014dcb039..fdedeb305 100644 --- a/src/command.c +++ b/src/command.c @@ -85,6 +85,7 @@ CV_PossibleValue_t kartspeed_cons_t[] = { {KARTSPEED_EASY, "Easy"}, {KARTSPEED_NORMAL, "Normal"}, {KARTSPEED_HARD, "Hard"}, + {KARTSPEED_EXPERT, "Expert"}, {0, NULL} }; @@ -2268,7 +2269,7 @@ void CV_AddValue(consvar_t *var, INT32 increment) } if ((var == &cv_kartspeed || var == &cv_kartbattlespeed) && !M_SecretUnlocked(SECRET_HARDSPEED)) { - max = (M_SecretUnlocked(SECRET_HARDSPEED) ? 4 : 3); + max = (M_SecretUnlocked(SECRET_HARDSPEED) ? 5 : 3); } #ifdef PARANOIA if (currentindice == -1) diff --git a/src/command.h b/src/command.h index 1e5a1a19c..28256f9bd 100644 --- a/src/command.h +++ b/src/command.h @@ -179,7 +179,9 @@ extern CV_PossibleValue_t CV_Natural[]; #define KARTSPEED_EASY 0 #define KARTSPEED_NORMAL 1 #define KARTSPEED_HARD 2 -#define KARTGP_MASTER 3 // Not a speed setting, gives the hardest speed with maxed out bots +#define KARTSPEED_EXPERT 3 +#define KARTGP_MASTER 4 // Not a speed setting, gives hard speed with maxed out bots +#define KARTGP_NIGHTMARE 5 // Not a speed setting, gives expert speed with maxed out bots extern CV_PossibleValue_t kartspeed_cons_t[]; extern consvar_t cv_execversion; diff --git a/src/d_main.cpp b/src/d_main.cpp index 27dc1c98b..b02e02622 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -1675,7 +1675,7 @@ void D_SRB2Main(void) // Start up a "minor" grand prix session memset(&grandprixinfo, 0, sizeof(struct grandprixinfo)); - grandprixinfo.gamespeed = KARTSPEED_NORMAL; + grandprixinfo.gamespeed = KARTSPEED_HARD; grandprixinfo.encore = false; grandprixinfo.masterbots = false; @@ -1833,11 +1833,16 @@ void D_SRB2Main(void) const char *sskill = M_GetNextParm(); const char *masterstr = "Master"; + const char *nightmarestr = "NIGHTMARE"; if (!strcasecmp(masterstr, sskill)) { newskill = KARTGP_MASTER; } + else if (!strcasecmp(nightmarestr, sskill)) + { + newskill = KARTGP_NIGHTMARE; + } else { for (j = 0; kartspeed_cons_t[j].strvalue; j++) @@ -1852,7 +1857,7 @@ void D_SRB2Main(void) if (!kartspeed_cons_t[j].strvalue) // reached end of the list with no match { j = atoi(sskill); // assume they gave us a skill number, which is okay too - if (j >= KARTSPEED_EASY && j <= KARTGP_MASTER) + if (j >= KARTSPEED_EASY && j <= KARTGP_NIGHTMARE) newskill = (INT16)j; } } @@ -1864,6 +1869,11 @@ void D_SRB2Main(void) grandprixinfo.masterbots = true; newskill = KARTSPEED_HARD; } + else if (newskill == KARTGP_NIGHTMARE) + { + grandprixinfo.masterbots = true; + newskill = KARTSPEED_EXPERT; + } grandprixinfo.gamespeed = newskill; } @@ -1871,6 +1881,10 @@ void D_SRB2Main(void) { newskill = KARTSPEED_HARD; } + else if (newskill == KARTGP_NIGHTMARE) + { + newskill = KARTSPEED_EXPERT; + } if (newskill != -1) CV_SetValue(&cv_kartspeed, newskill); diff --git a/src/d_netcmd.c b/src/d_netcmd.c index cdcc2d01c..01351753d 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -457,6 +457,7 @@ consvar_t cv_kartstacking_accelstack = CVAR_INIT ("kartstacking_accelstack", "Of consvar_t cv_kartstacking_sneaker_easyspeedboost = CVAR_INIT ("vanillaboost_sneaker_easyspeedboost", "0.8317", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); consvar_t cv_kartstacking_sneaker_normalspeedboost = CVAR_INIT ("vanillaboost_sneaker_normalspeedboost", "0.5", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); consvar_t cv_kartstacking_sneaker_hardspeedboost = CVAR_INIT ("vanillaboost_sneaker_hardspeedboost", "0.2756", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_sneaker_expertspeedboost = CVAR_INIT ("vanillaboost_sneaker_expertspeedboost", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); consvar_t cv_kartstacking_sneaker_accelboost = CVAR_INIT ("vanillaboost_sneaker_accelboost", "8.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); consvar_t cv_kartstacking_sneaker_maxgrade = CVAR_INIT ("vanillaboost_sneaker_maxgrade", "3", CV_NETVAR|CV_CHEAT, CV_Natural, NULL); consvar_t cv_kartstacking_sneaker_stackable = CVAR_INIT ("vanillaboost_sneaker_stackable", "On", CV_NETVAR, CV_OnOff, NULL); @@ -3137,6 +3138,7 @@ static void Command_Map_f(void) if (option_skill) { const char *masterstr = "Master"; + const char *nightmarestr = "NIGHTMARE"; const char *skillname = COM_Argv(option_skill + 1); INT32 newskill = -1; INT32 j; @@ -3145,6 +3147,10 @@ static void Command_Map_f(void) { newskill = KARTGP_MASTER; } + else if (!strcasecmp(nightmarestr, skillname)) + { + newskill = KARTGP_NIGHTMARE; + } else { for (j = 0; kartspeed_cons_t[j].strvalue; j++) @@ -3159,7 +3165,7 @@ static void Command_Map_f(void) if (!kartspeed_cons_t[j].strvalue) // reached end of the list with no match { INT32 num = atoi(COM_Argv(option_skill + 1)); // assume they gave us a skill number, which is okay too - if (num >= KARTSPEED_EASY && num <= KARTGP_MASTER) + if (num >= KARTSPEED_EASY && num <= KARTGP_NIGHTMARE) newskill = (INT16)num; } } @@ -3171,6 +3177,11 @@ static void Command_Map_f(void) grandprixinfo.gamespeed = KARTSPEED_HARD; grandprixinfo.masterbots = true; } + else if (newskill == KARTGP_NIGHTMARE) + { + grandprixinfo.gamespeed = KARTSPEED_EXPERT; + grandprixinfo.masterbots = true; + } else { grandprixinfo.gamespeed = newskill; @@ -7031,7 +7042,7 @@ static void KartFrantic_OnChange(void) static void KartSpeed_OnChange(void) { - if (!M_SecretUnlocked(SECRET_HARDSPEED) && cv_kartspeed.value == KARTSPEED_HARD) + if (!M_SecretUnlocked(SECRET_HARDSPEED) && (cv_kartspeed.value == KARTSPEED_HARD || cv_kartspeed.value == KARTSPEED_EXPERT)) { CONS_Printf(M_GetText("You haven't earned this yet.\n")); CV_StealthSet(&cv_kartspeed, cv_kartspeed.defaultvalue); @@ -7056,7 +7067,7 @@ static void KartSpeed_OnChange(void) static void KartBattleSpeed_OnChange(void) { - if (!M_SecretUnlocked(SECRET_HARDSPEED) && cv_kartbattlespeed.value == KARTSPEED_HARD) + if (!M_SecretUnlocked(SECRET_HARDSPEED) && ((cv_kartbattlespeed.value == KARTSPEED_HARD) || (cv_kartbattlespeed.value == KARTSPEED_EXPERT))) { CONS_Printf(M_GetText("You haven't earned this yet.\n")); CV_StealthSet(&cv_kartspeed, cv_kartspeed.defaultvalue); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 96d6634f1..e5228922c 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -133,6 +133,7 @@ extern consvar_t cv_kartstacking_accelstack; extern consvar_t cv_kartstacking_sneaker_easyspeedboost; extern consvar_t cv_kartstacking_sneaker_normalspeedboost; extern consvar_t cv_kartstacking_sneaker_hardspeedboost; +extern consvar_t cv_kartstacking_sneaker_expertspeedboost; extern consvar_t cv_kartstacking_sneaker_accelboost; extern consvar_t cv_kartstacking_sneaker_maxgrade; extern consvar_t cv_kartstacking_sneaker_stackable; diff --git a/src/deh_tables.c b/src/deh_tables.c index dcc834a49..cc58fd853 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1545,6 +1545,7 @@ struct int_const_s const INT_CONST[] = { {"KARTSPEED_EASY", KARTSPEED_EASY}, {"KARTSPEED_NORMAL", KARTSPEED_NORMAL}, {"KARTSPEED_HARD", KARTSPEED_HARD}, + {"KARTSPEED_EXPERT", KARTSPEED_EXPERT}, // Custom client features exposed to lua {"FEATURE_INTERMISSIONHUD",1}, // This is to trick kart luas that look for this since its already here. diff --git a/src/k_kart.c b/src/k_kart.c index 04d2baea5..f413c9ff3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -297,6 +297,7 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartstacking_sneaker_easyspeedboost); CV_RegisterVar(&cv_kartstacking_sneaker_normalspeedboost); CV_RegisterVar(&cv_kartstacking_sneaker_hardspeedboost); + CV_RegisterVar(&cv_kartstacking_sneaker_expertspeedboost); CV_RegisterVar(&cv_kartstacking_sneaker_accelboost); CV_RegisterVar(&cv_kartstacking_sneaker_maxgrade); CV_RegisterVar(&cv_kartstacking_sneaker_stackable); @@ -3495,6 +3496,9 @@ static inline fixed_t K_GetProjectileSpeed(void) case KARTSPEED_HARD: return 96*mapobjectscale; // Avg Speed is 48 break; + case KARTSPEED_EXPERT: + return 110*mapobjectscale; // Avg Speed is 62 + break; default: return 82*mapobjectscale; // Avg Speed is 41 break; @@ -3511,6 +3515,9 @@ static inline fixed_t K_GetSneakerBoostSpeed(void) case KARTSPEED_HARD: return HARDSNEAKERSPEEDBOOST; break; + case KARTSPEED_EXPERT: + return EXPERTSNEAKERSPEEDBOOST; + break; default: return NORMALSNEAKERSPEEDBOOST; break; @@ -5040,6 +5047,8 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, PROJSPEED = FixedMul(PROJSPEED, FRACUNIT-FRACUNIT/4); else if (gamespeed == KARTSPEED_HARD) PROJSPEED = FixedMul(PROJSPEED, FRACUNIT+FRACUNIT/4); + else if (gamespeed == KARTSPEED_EXPERT) + PROJSPEED = FixedMul(PROJSPEED, FRACUNIT+FRACUNIT/2); PROJSPEED = FixedMul(PROJSPEED, mapobjectscale); } else diff --git a/src/k_kart.h b/src/k_kart.h index f1a839a03..f3d42d726 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -49,6 +49,7 @@ Make sure this matches the actual number of states #define EASYSNEAKERSPEEDBOOST K_RAGuard(cv_kartstacking_sneaker_easyspeedboost) #define NORMALSNEAKERSPEEDBOOST K_RAGuard(cv_kartstacking_sneaker_normalspeedboost) #define HARDSNEAKERSPEEDBOOST K_RAGuard(cv_kartstacking_sneaker_hardspeedboost) +#define EXPERTSNEAKERSPEEDBOOST K_RAGuard(cv_kartstacking_sneaker_expertspeedboost) #define SNEAKERACCELBOOST K_RAGuard(cv_kartstacking_sneaker_accelboost) #define MAXSNEAKERSTACK K_RAGuard(cv_kartstacking_sneaker_maxgrade) #define SNEAKERSTACKABLE K_RAGuard(cv_kartstacking_sneaker_stackable) diff --git a/src/k_pwrlv.c b/src/k_pwrlv.c index d3cfdd0af..6e3d21ddb 100644 --- a/src/k_pwrlv.c +++ b/src/k_pwrlv.c @@ -473,7 +473,14 @@ void K_SetPowerLevelScrambles(SINT8 powertype) return; } - if (min >= 7800) + if (min >= 8200) + { + if (avg >= 8500) + t = 6; + else + t = 5; + } + else if (min >= 7800) { if (avg >= 8200) t = 5; @@ -520,6 +527,10 @@ void K_SetPowerLevelScrambles(SINT8 powertype) switch (t) { + case 6: + speed = KARTSPEED_EXPERT; + encore = P_RandomChance(FRACUNIT>>1); + break; case 5: speed = KARTSPEED_HARD; encore = P_RandomChance(FRACUNIT>>1); diff --git a/src/m_menu.c b/src/m_menu.c index 376d1845b..d066e28fc 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -361,7 +361,7 @@ consvar_t cv_dummyattackingchaining = CVAR_INIT ("dummyattackingchaining", "Off" consvar_t cv_dummyattackingslipdash = CVAR_INIT ("dummyattackingslipdash", "Off", CV_HIDEN|CV_CALL|CV_NOINIT, CV_OnOff, Nextmap_OnChange); consvar_t cv_dummyattackingpurpledrift = CVAR_INIT ("dummyattackingpurpledrift", "Off", CV_HIDEN|CV_CALL|CV_NOINIT, CV_OnOff, Nextmap_OnChange); -static CV_PossibleValue_t dummygpdifficulty_cons_t[] = {{0, "Easy"}, {1, "Normal"}, {2, "Hard"}, {3, "Master"}, {0, NULL}}; +static CV_PossibleValue_t dummygpdifficulty_cons_t[] = {{KARTSPEED_EASY, "Easy"}, {KARTSPEED_NORMAL, "Normal"}, {KARTSPEED_HARD, "Hard"}, {KARTSPEED_EXPERT, "Expert"}, {KARTGP_MASTER, "Master"}, {KARTGP_NIGHTMARE, "Nightmare"}, {0, NULL}}; static CV_PossibleValue_t dummygpcup_cons_t[50] = {{1, "TEMP"}}; // A REALLY BIG NUMBER, SINCE THIS IS TEMP UNTIL NEW MENUS consvar_t cv_dummygpdifficulty = CVAR_INIT ("dummygpdifficulty", "Normal", CV_HIDEN, dummygpdifficulty_cons_t, NULL); @@ -5648,12 +5648,17 @@ void M_StartGrandPrix(INT32 choice) case KARTSPEED_EASY: case KARTSPEED_NORMAL: case KARTSPEED_HARD: + case KARTSPEED_EXPERT: grandprixinfo.gamespeed = cv_dummygpdifficulty.value; break; case KARTGP_MASTER: grandprixinfo.gamespeed = KARTSPEED_HARD; grandprixinfo.masterbots = true; break; + case KARTGP_NIGHTMARE: + grandprixinfo.gamespeed = KARTSPEED_EXPERT; + grandprixinfo.masterbots = true; + break; default: CONS_Alert(CONS_WARNING, "Invalid GP difficulty\n"); grandprixinfo.gamespeed = KARTSPEED_NORMAL; diff --git a/src/p_mobj.c b/src/p_mobj.c index 11e10c829..60a12f565 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8377,6 +8377,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj) distbarrier = FixedMul(distbarrier, FRACUNIT-FRACUNIT/4); else if (gamespeed == KARTSPEED_HARD) distbarrier = FixedMul(distbarrier, FRACUNIT+FRACUNIT/4); + else if (gamespeed == KARTSPEED_EXPERT) + distbarrier = FixedMul(distbarrier, FRACUNIT+FRACUNIT/2); if ((gametyperules & GTR_CIRCUIT) && mobj->tracer) {