diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 2b778c993..e98e1ddde 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -162,6 +162,7 @@ static void KartSlopeBoost_OnChange(void); static void KartDrafting_OnChange(void); static void KartItemBreaker_OnChange(void); static void KartInvinType_OnChange(void); +static void KartBumpSpark_OnChange(void); static void Schedule_OnChange(void); @@ -534,7 +535,7 @@ consvar_t cv_kartusepwrlv = CVAR_INIT ("kartusepwrlv", "Yes", CV_NETVAR, CV_YesN consvar_t cv_kartpurpledrift = CVAR_INIT ("kartpurpledrift", "No", CV_NETVAR, CV_YesNo, KartPurpleDrift_OnChange); static CV_PossibleValue_t bumpspark_cons_t[] = {{0, "Off"}, {1, "Remove Charge Only"}, {2, "On"}, {0, NULL}}; -consvar_t cv_kartbumpspark = CVAR_INIT ("kartbumpspark", "Remove Charge Only", CV_NETVAR, bumpspark_cons_t, NULL); +consvar_t cv_kartbumpspark = CVAR_INIT ("kartbumpspark", "Remove Charge Only", CV_NETVAR|CV_CALL, bumpspark_cons_t, KartBumpSpark_OnChange); consvar_t cv_kartbumpspring = CVAR_INIT ("kartbumpspring", "Yes", CV_NETVAR, CV_YesNo, NULL); @@ -7634,6 +7635,24 @@ static void KartInvinType_OnChange(void) } } +static void KartBumpSpark_OnChange(void) +{ + if (K_CanChangeRules() == false) + { + return; + } + + if (leveltime < starttime) + { + CONS_Printf(M_GetText("Bump spark type has been changed to \"%s\".\n"), cv_kartbumpspark.string); + bumpsparkactive = (UINT8)cv_kartbumpspark.value; + } + else + { + CONS_Printf(M_GetText("Bump spark type will be changed to \"%s\" next round.\n"), cv_kartbumpspark.string); + } +} + static void Schedule_OnChange(void) { size_t i; diff --git a/src/deh_soc.c b/src/deh_soc.c index e75221663..763bebb8f 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -1859,6 +1859,7 @@ static struct { const char *name; consvar_t *var; } HIDDENVARS[] = { { "DUMMYATTACKINGSLIPDASH", &cv_dummyattackingslipdash }, { "DUMMYATTACKINGPURPLEDRIFT", &cv_dummyattackingpurpledrift }, { "DUMMYATTACKINGSLOPEBOOST", &cv_dummyattackingslopeboost }, + { "DUMMYATTACKINGBUMPSPARK", &cv_dummyattackingbumpspark }, { "DUMMYSTAFF", &cv_dummystaff }, { "DUMMYMULTIPLAYER", &cv_dummymultiplayer }, { "DUMMYIP", &cv_dummyip }, diff --git a/src/g_demo.c b/src/g_demo.c index 510d5adbd..98bb7155a 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -2740,6 +2740,10 @@ void G_BeginRecording(void) raflags |= RAF_PURPLEDRIFT; if (cv_dummyattackingslopeboost.value) raflags |= RAF_SLOPEBOOST; + if (cv_dummyattackingbumpspark.value == BUMPSPARK_ALL) + raflags |= RAF_BUMPSPARK; + if (cv_dummyattackingbumpspark.value == BUMPSPARK_NOCHARGE) + raflags |= RAF_BUMPDRIFT; } else { diff --git a/src/g_demo.h b/src/g_demo.h index 9271d2240..77667fc99 100644 --- a/src/g_demo.h +++ b/src/g_demo.h @@ -41,6 +41,8 @@ typedef enum RAF_SLIPDASH = 1<<3, RAF_PURPLEDRIFT = 1<<4, RAF_SLOPEBOOST = 1<<5, + RAF_BUMPDRIFT = 1<<6, + RAF_BUMPSPARK = 1<<7, // up to 1<<31 is free } raflags_t; diff --git a/src/g_game.c b/src/g_game.c index 56a9c2f1c..329e4bded 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -483,14 +483,15 @@ SINT8 G_RecordPresetIndex(void) boolean slipdash = cv_dummyattackingslipdash.value; boolean purpledrift = cv_dummyattackingpurpledrift.value; boolean slopeboost = cv_dummyattackingslopeboost.value; + boolean bumpspark = cv_dummyattackingbumpspark.value; - if (!rings && !stacking && !chaining && !slipdash && !purpledrift && !slopeboost) + if (!rings && !stacking && !chaining && !slipdash && !purpledrift && !slopeboost && !bumpspark) return RP_KART; - if (stacking && chaining && slopeboost && !rings && !slipdash && !purpledrift) + if (stacking && chaining && slopeboost && !rings && !slipdash && !purpledrift && (bumpspark == BUMPSPARK_ALL)) return RP_TECH; - if (rings && stacking && chaining && slipdash && purpledrift && slopeboost) + if (rings && stacking && chaining && slipdash && purpledrift && slopeboost && (bumpspark == BUMPSPARK_NOCHARGE)) return RP_BLAN; return RP_CUST; diff --git a/src/k_hud.c b/src/k_hud.c index a31b2238a..d63322a17 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -2363,7 +2363,7 @@ void K_SetScoreboardModStatus(const char *name, SINT8 active) CONS_Alert(CONS_WARNING, "Server mod '%s' does not exist so status cannot be changed.\n", name); } -#define BASEMODS 11 +#define BASEMODS 12 static void K_DrawServerMods(INT32 x, INT32 y) { UINT8 i, j; @@ -2380,7 +2380,8 @@ static void K_DrawServerMods(INT32 x, INT32 y) {"Chain Offroad", 0, &cv_kartchainingoffroad, -1, true}, {"Slope Boost", 0, NULL, K_PurpleDriftActive() > 0, true}, {"Drafting", 0, NULL, K_DraftingActive() > 0, true}, - {"Bump Spark", 0, &cv_kartbumpspark, -1, true}, + {"Bump Drift", 0, NULL, K_GetBumpSpark() > 0, true}, + {"Bump Spark", 0, NULL, K_GetBumpSpark() == BUMPSPARK_ALL, true}, {"Bump Spring", 0, &cv_kartbumpspring, -1, true}, {"Alt. Invin.", 0, NULL, K_GetKartInvinType() == KARTINVIN_ALTERN, true} }; diff --git a/src/k_kart.c b/src/k_kart.c index f320af8ec..d4ee9fc34 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6646,7 +6646,7 @@ void K_AwardScaledPlayerRings(player_t *player, SINT8 mode) // Returns the bumpspark value as an enum. INT32 K_GetBumpSpark(void) { - return max(BUMPSPARK_NONE, min(BUMPSPARK_ALL, (bumpsparktype_t)cv_kartbumpspark.value)); + return max(BUMPSPARK_NONE, min(BUMPSPARK_ALL, (bumpsparktype_t)bumpsparkactive)); } /** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c diff --git a/src/k_kart.h b/src/k_kart.h index d4701fac9..a9d794d7f 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -323,6 +323,7 @@ boolean K_SlipdashActive(void); boolean K_SlopeBoostActive(void); boolean K_DraftingActive(void); boolean K_GetKartInvinType(void); +INT32 K_GetBumpSpark(void); boolean K_BoostChain(player_t *player, INT32 timer, boolean chainsound); INT32 K_ChainOrDeincrementTime(player_t *player, INT32 timer, INT32 deincrement, boolean chainsound); boolean K_UsingLegacyCheckpoints(void); @@ -353,8 +354,6 @@ typedef enum BUMPSPARK_ALL } bumpsparktype_t; -INT32 K_GetBumpSpark(void); - #ifdef __cplusplus } // extern "C" #endif diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 394387e63..24316e21d 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -4177,6 +4177,13 @@ static int lib_kGetKartInvinType(lua_State *L) return 1; } +// Gets the currently active bumpspark type. +static int lib_kGetBumpSpark(lua_State *L) +{ + lua_pushinteger(L, K_GetBumpSpark()); + return 1; +} + // Checks if current map is using legacy boss3 bassed checkpoints. Useful for map compat. static int lib_kUsingLegacyCheckpoints(lua_State *L) { @@ -5266,6 +5273,7 @@ static luaL_Reg lib[] = { {"K_SlipdashActive",lib_kSlipdashActive}, {"K_SlopeBoostActive",lib_kSlopeBoostActive}, {"K_DraftingActive",lib_kDraftingActive}, + {"K_GetBumpSpark",lib_kGetBumpSpark}, {"K_GetKartInvinType",lib_kGetKartInvinType}, {"K_UsingLegacyCheckpoints",lib_kUsingLegacyCheckpoints}, {"K_DoBoost",lib_kDoBoost}, diff --git a/src/lua_script.c b/src/lua_script.c index f646db2ac..36d1b3a25 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -397,6 +397,9 @@ int LUA_PushGlobals(lua_State *L, const char *word) } else if (fastcmp(word,"draftingactive")) { lua_pushinteger(L, draftingactive); return 1; + } else if (fastcmp(word,"bumpsparkactive")) { + lua_pushinteger(L, bumpsparkactive); + return 1; } else if (fastcmp(word,"purpledriftactive")) { lua_pushinteger(L, purpledriftactive); return 1; diff --git a/src/m_menu.c b/src/m_menu.c index a94315b77..625faedd5 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -456,6 +456,9 @@ consvar_t cv_dummyattackingslipdash = CVAR_INIT ("dummyattackingslipdash", "Off" consvar_t cv_dummyattackingpurpledrift = CVAR_INIT ("dummyattackingpurpledrift", "Off", CV_HIDEN|CV_CALL|CV_NOINIT, CV_OnOff, Nextmap_OnChange); consvar_t cv_dummyattackingslopeboost = CVAR_INIT ("dummyattackingslopeboost", "Off", CV_HIDEN|CV_CALL|CV_NOINIT, CV_OnOff, Nextmap_OnChange); +static CV_PossibleValue_t dummybumpspark_cons_t[] = {{BUMPSPARK_NONE, "Off"}, {BUMPSPARK_NOCHARGE, "NoCharge"}, {BUMPSPARK_ALL, "On"}}; +consvar_t cv_dummyattackingbumpspark = CVAR_INIT ("dummyattackingbumpspark", "Off", CV_HIDEN|CV_CALL|CV_NOINIT, dummybumpspark_cons_t, Nextmap_OnChange); + 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 @@ -627,6 +630,14 @@ if (cv.value) \ strcat(new_str, str); \ } +#define ADDEQUALS(cv, str, num) \ +if (cv.value == num) \ +{ \ + len += 3; \ + new_str = Z_Realloc(new_str, len, PU_STATIC, NULL); \ + strcat(new_str, str); \ +} + char *M_AppendGametypeAndModName(void) { UINT8 len = 4; @@ -649,6 +660,8 @@ char *M_AppendGametypeAndModName(void) ADD(cv_dummyattackingslipdash, "SD-") ADD(cv_dummyattackingpurpledrift, "PD-") ADD(cv_dummyattackingslopeboost, "SB-") + ADDEQUALS(cv_dummyattackingbumpspark, "BD-", BUMPSPARK_NOCHARGE) + ADDEQUALS(cv_dummyattackingbumpspark, "BS-", BUMPSPARK_ALL) new_str[len-1] = '\0'; @@ -2161,6 +2174,7 @@ void M_Init(void) CV_RegisterVar(&cv_dummyattackingslipdash); CV_RegisterVar(&cv_dummyattackingpurpledrift); CV_RegisterVar(&cv_dummyattackingslopeboost); + CV_RegisterVar(&cv_dummyattackingbumpspark); CV_RegisterVar(&cv_dummygpdifficulty); CV_RegisterVar(&cv_dummygpencore); @@ -5853,11 +5867,11 @@ INT32 MR_ReplayStaff(INT32 choice) } #define NUMPRESETS 3 -static boolean presets[NUMPRESETS][6] = { - //rings stacking chaining slipdash purpledrift slopeboost - { false, false, false, false, false, false}, // SRB2Kart - { false, true, true, false, false, true}, // Tech - { true, true, true, true, true, true}, // BlanKart +static INT32 presets[NUMPRESETS][7] = { + //rings stacking chaining slipdash purpledrift slopeboost bumpspark + { 0, 0, 0, 0, 0, 0, BUMPSPARK_NONE}, // SRB2Kart + { 0, 1, 1, 0, 0, 1, BUMPSPARK_ALL}, // Tech + { 1, 1, 1, 1, 1, 1, BUMPSPARK_NOCHARGE}, // BlanKart }; INT32 MR_TimeAttackPreset(INT32 arg) @@ -5866,12 +5880,27 @@ INT32 MR_TimeAttackPreset(INT32 arg) return false; boolean *preset = presets[arg]; - CV_Set(&cv_dummyattackingrings, preset[0] ? "On" : "Off"); - CV_Set(&cv_dummyattackingstacking, preset[1] ? "On" : "Off"); - CV_Set(&cv_dummyattackingchaining, preset[2] ? "On" : "Off"); - CV_Set(&cv_dummyattackingslipdash, preset[3] ? "On" : "Off"); - CV_Set(&cv_dummyattackingpurpledrift, preset[4] ? "On" : "Off"); - CV_Set(&cv_dummyattackingslopeboost, preset[5] ? "On" : "Off"); + CV_Set(&cv_dummyattackingrings, (boolean)preset[0] ? "On" : "Off"); + CV_Set(&cv_dummyattackingstacking, (boolean)preset[1] ? "On" : "Off"); + CV_Set(&cv_dummyattackingchaining, (boolean)preset[2] ? "On" : "Off"); + CV_Set(&cv_dummyattackingslipdash, (boolean)preset[3] ? "On" : "Off"); + CV_Set(&cv_dummyattackingpurpledrift, (boolean)preset[4] ? "On" : "Off"); + CV_Set(&cv_dummyattackingslopeboost, (boolean)preset[5] ? "On" : "Off"); + + switch(preset[6]) + { + case BUMPSPARK_ALL: + CV_Set(&cv_dummyattackingbumpspark, "On"); + break; + case BUMPSPARK_NOCHARGE: + CV_Set(&cv_dummyattackingbumpspark, "NoCharge"); + break; + case BUMPSPARK_NONE: + /* FALLTHRU */ + default: + CV_Set(&cv_dummyattackingbumpspark, "Off"); + } + return true; } #undef NUMPRESETS diff --git a/src/m_menu.h b/src/m_menu.h index 82fc059fe..e6ed89e38 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -422,6 +422,7 @@ extern consvar_t cv_dummygpdifficulty, cv_dummygpencore, cv_dummygpcup; extern consvar_t cv_dummymenuplayer, cv_dummyteam, cv_dummyspectate, cv_dummyscramble; extern consvar_t cv_dummyattackingrings, cv_dummyattackingstacking, cv_dummyattackingchaining; extern consvar_t cv_dummyattackingslipdash, cv_dummyattackingpurpledrift, cv_dummyattackingslopeboost; +extern consvar_t cv_dummyattackingbumpspark; extern consvar_t cv_dummystaff; extern consvar_t cv_dummymultiplayer, cv_dummyip, cv_dummyname, cv_dummyfollower, cv_dummycolor; extern consvar_t cv_dummyserverpage; diff --git a/src/p_map.c b/src/p_map.c index b09e7269d..69d191655 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3479,9 +3479,7 @@ static void P_BouncePlayerMove(mobj_t *mo, TryMoveResult_t *result) mmomx = mo->player->rmomx; mmomy = mo->player->rmomy; - UINT32 bumpspark = - max((modeattacking != ATTACKING_NONE) ? BUMPSPARK_NOCHARGE : BUMPSPARK_NONE, - K_GetBumpSpark()); + UINT32 bumpspark = K_GetBumpSpark(); if ((bumpspark < BUMPSPARK_ALL) || (modeattacking != ATTACKING_NONE && G_CompatLevel(0x0009))) diff --git a/src/p_mobj.h b/src/p_mobj.h index 81f51cb21..4dab13a4b 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -606,6 +606,7 @@ extern boolean slipdashactive; extern boolean purpledriftactive; extern boolean slopeboostactive; extern boolean draftingactive; +extern UINT8 bumpsparkactive; extern UINT16 bossdisabled; extern boolean stoppedclock; diff --git a/src/p_saveg.c b/src/p_saveg.c index 5e211359b..452c03a18 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -5298,6 +5298,7 @@ static void P_NetArchiveMisc(savebuffer_t *save, boolean resending) WRITEUINT8(save->p, purpledriftactive); WRITEUINT8(save->p, slopeboostactive); WRITEUINT8(save->p, draftingactive); + WRITEUINT8(save->p, bumpsparkactive); for (i = 0; i < 12; i++) { @@ -5685,6 +5686,7 @@ FUNCINLINE static ATTRINLINE boolean P_NetUnArchiveMisc(savebuffer_t *save, bool purpledriftactive = READUINT8(save->p); slopeboostactive = READUINT8(save->p); draftingactive = READUINT8(save->p); + bumpsparkactive = READUINT8(save->p); for (i = 0; i < 12; i++) { diff --git a/src/p_setup.c b/src/p_setup.c index 06eba78b0..aa5b17b89 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -154,6 +154,7 @@ boolean slipdashactive; boolean purpledriftactive; boolean slopeboostactive; boolean draftingactive; +UINT8 bumpsparkactive; UINT16 bossdisabled; boolean stoppedclock; boolean levelloading; @@ -8034,6 +8035,7 @@ static void P_InitLevelSettings(boolean reloadinggamestate) purpledriftactive = false; slopeboostactive = false; draftingactive = false; + bumpsparkactive = 0; if (cv_kartrings.value) ringsactive = true; @@ -8056,6 +8058,8 @@ static void P_InitLevelSettings(boolean reloadinggamestate) if (cv_kartdrafting.value) draftingactive = true; + bumpsparkactive = (UINT8)cv_kartbumpspark.value; + invintype = (UINT8)cv_kartinvintype.value; // emerald hunt @@ -8146,6 +8150,10 @@ static void P_InitLevelSettings(boolean reloadinggamestate) purpledriftactive = true; if (raflags & RAF_SLOPEBOOST) slopeboostactive = true; + if (raflags & RAF_BUMPSPARK) + bumpsparkactive = BUMPSPARK_ALL; + if (raflags & RAF_BUMPDRIFT) + bumpsparkactive = BUMPSPARK_NOCHARGE; } else { @@ -8155,6 +8163,8 @@ static void P_InitLevelSettings(boolean reloadinggamestate) chainingactive = cv_dummyattackingchaining.value; slipdashactive = cv_dummyattackingslipdash.value; slopeboostactive = cv_dummyattackingslopeboost.value; + + bumpsparkactive = (UINT8)(cv_dummyattackingbumpspark.value); } } else