From 6d6c0f54a553c4ef798a28488b85384772a6088e Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 21 Jul 2025 21:01:48 -0400 Subject: [PATCH] Hardcode slopeboost Ported and based on the slopeboost from booststack by indev --- src/d_main.cpp | 4 +- src/d_netcmd.c | 45 +++++++++++++++++- src/d_netcmd.h | 8 ++++ src/d_player.h | 4 ++ src/deh_soc.c | 1 + src/g_game.c | 7 +-- src/k_kart.c | 108 ++++++++++++++++++++++++++++++++++++++++++++ src/k_kart.h | 14 ++++++ src/lua_baselib.c | 10 +++- src/lua_playerlib.c | 24 ++++++++++ src/m_menu.c | 14 ++++-- src/m_menu.h | 2 +- src/p_mobj.h | 1 + src/p_saveg.c | 10 ++++ src/p_setup.c | 6 +++ 15 files changed, 245 insertions(+), 13 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 28fc622b8..a0c442cc0 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -86,8 +86,8 @@ #define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291 #define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b #define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9 -#define ASSET_HASH_MAIN_PK3 0x632882d006fb89b8 -#define ASSET_HASH_MAPPATCH_PK3 0x4d12e04069df3b9f +#define ASSET_HASH_MAIN_PK3 0x3ef9836273479c8f +#define ASSET_HASH_MAPPATCH_PK3 0x8c789d4a74632786 #define ASSET_HASH_BONUSCHARS_KART 0x60e6f13d822a7461 #ifdef USE_PATCH_FILE #define ASSET_HASH_PATCH_PK3 0x0000000000000000 diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 14bf4f805..8453b8ea1 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -153,6 +153,7 @@ static void KartPurpleDrift_OnChange(void); static void KartStacking_OnChange(void); static void KartChaining_OnChange(void); static void KartSlipdash_OnChange(void); +static void KartSlopeBoost_OnChange(void); static void KartItemBreaker_OnChange(void); static void KartInvinType_OnChange(void); @@ -487,7 +488,14 @@ consvar_t cv_kartstacking_drift_stackable = CVAR_INIT ("vanillaboost_drift_stack consvar_t cv_kartstacking_ring_speedboost = CVAR_INIT ("vanillaboost_ring_speedboost", "0.2", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); consvar_t cv_kartstacking_ring_accelboost = CVAR_INIT ("vanillaboost_ring_accelboost", "4.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_ring_stackable = CVAR_INIT ("vanillaboost_ring_stackable", "On", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_kartstacking_ring_stackable = CVAR_INIT ("vanillaboost_ring_stackable", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL); + +consvar_t cv_kartstacking_slope_decay = CVAR_INIT ("vanillaboost_slope_decay", "0.004", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_slope_brakemod = CVAR_INIT ("vanillaboost_slope_brakemod", "0.01", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_slope_speedboost_max = CVAR_INIT ("vanillaboost_slope_speedboost_max", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_slope_speedboost_cap = CVAR_INIT ("vanillaboost_slope_speedboost_cap", "1.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_slope_accelboost = CVAR_INIT ("vanillaboost_slope_accelboost", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_slope_stackable = CVAR_INIT ("vanillaboost_slope_stackable", "On", CV_NETVAR, CV_OnOff, NULL); consvar_t cv_kartchaining = CVAR_INIT ("kartchaining", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartChaining_OnChange); consvar_t cv_kartchainingoffroad = CVAR_INIT ("kartchaining_chainoffroad", "No", CV_NETVAR, CV_YesNo, NULL); @@ -506,6 +514,8 @@ consvar_t cv_kartbumpspring = CVAR_INIT ("kartbumpspring", "No", CV_NETVAR, CV_Y consvar_t cv_kartslipdash = CVAR_INIT ("kartslipdash", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartSlipdash_OnChange); +consvar_t cv_kartslopeboost = CVAR_INIT ("kartslopeboost", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartSlopeBoost_OnChange); + // Invincibility modifiers static CV_PossibleValue_t invintype_cons_t[] = {{0, "Legacy"}, {1, "Alternative"}, {0, NULL}}; consvar_t cv_kartinvintype = CVAR_INIT ("kartinvintype", "Legacy", CV_NETVAR|CV_CALL, invintype_cons_t, KartInvinType_OnChange); @@ -7311,6 +7321,39 @@ static void KartSlipdash_OnChange(void) } } +static void KartSlopeBoost_OnChange(void) +{ + if (K_CanChangeRules() == false) + { + return; + } + + if (!K_SlopeBoostActive() && cv_kartslopeboost.value) + { + if (leveltime < starttime) + { + slopeboostactive = true; + CONS_Printf(M_GetText("Slopeboost has been turned \"On\".\n")); + } + else + { + CONS_Printf(M_GetText("Slopeboost will be turned \"On\" Next Round.\n")); + } + } + else if (K_SlopeBoostActive() && !cv_kartslopeboost.value) + { + if (leveltime < starttime) + { + slopeboostactive = false; + CONS_Printf(M_GetText("Slopeboost has been turned \"Off\".\n")); + } + else + { + CONS_Printf(M_GetText("Slopeboost will be turned \"Off\" next round.\n")); + } + } +} + static void KartItemBreaker_OnChange(void) { if (K_CanChangeRules() == false) diff --git a/src/d_netcmd.h b/src/d_netcmd.h index deb40d439..f68586a1a 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -164,6 +164,13 @@ extern consvar_t cv_kartstacking_ring_speedboost; extern consvar_t cv_kartstacking_ring_accelboost; extern consvar_t cv_kartstacking_ring_stackable; +extern consvar_t cv_kartstacking_slope_decay; +extern consvar_t cv_kartstacking_slope_brakemod; +extern consvar_t cv_kartstacking_slope_speedboost_max; +extern consvar_t cv_kartstacking_slope_speedboost_cap; +extern consvar_t cv_kartstacking_slope_accelboost; +extern consvar_t cv_kartstacking_slope_stackable; + extern consvar_t cv_kartchaining; extern consvar_t cv_kartchainingoffroad; @@ -173,6 +180,7 @@ extern consvar_t cv_kartpurpledrift; extern consvar_t cv_kartbumpspark; extern consvar_t cv_kartbumpspring; extern consvar_t cv_kartslipdash; +extern consvar_t cv_kartslopeboost; extern consvar_t cv_kartinvintype; extern consvar_t cv_kartinvindist; extern consvar_t cv_kartinvindistmul; diff --git a/src/d_player.h b/src/d_player.h index c05950f03..03b1b0a40 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -707,6 +707,10 @@ struct player_t UINT16 chaintimer; // Stores current chain timer length. UINT8 boostcharge; // Charge during race start + + fixed_t slopeboost; // Handle slopeboost speed + fixed_t prevslopeboost; // Last frame slopeboost speed + fixed_t slopeaccel; // Handle slopeboost accel INT16 growshrinktimer; // > 0 = Big, < 0 = small INT16 growcancel; // Duration of grow canceling diff --git a/src/deh_soc.c b/src/deh_soc.c index 7374715ba..bf73bbc12 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -1858,6 +1858,7 @@ static struct { const char *name; consvar_t *var; } HIDDENVARS[] = { { "DUMMYATTACKINGCHAINING", &cv_dummyattackingchaining }, { "DUMMYATTACKINGSLIPDASH", &cv_dummyattackingslipdash }, { "DUMMYATTACKINGPURPLEDRIFT", &cv_dummyattackingpurpledrift }, + { "DUMMYATTACKINGSLOPEBOOST", &cv_dummyattackingslopeboost }, { "DUMMYSTAFF", &cv_dummystaff }, { "DUMMYMULTIPLAYER", &cv_dummymultiplayer }, { "DUMMYIP", &cv_dummyip }, diff --git a/src/g_game.c b/src/g_game.c index 0dec751d8..92b776c5d 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -467,14 +467,15 @@ SINT8 G_RecordPresetIndex(void) boolean chaining = cv_dummyattackingchaining.value; boolean slipdash = cv_dummyattackingslipdash.value; boolean purpledrift = cv_dummyattackingpurpledrift.value; + boolean slopeboost = cv_dummyattackingslopeboost.value; - if (!rings && !stacking && !chaining && !slipdash && !purpledrift) + if (!rings && !stacking && !chaining && !slipdash && !purpledrift && !slopeboost) return RP_KART; - if (stacking && chaining && !rings && !slipdash && !purpledrift) + if (stacking && chaining && slopeboost && !rings && !slipdash && !purpledrift) return RP_TECH; - if (rings && stacking && chaining && slipdash && purpledrift) + if (rings && stacking && chaining && slipdash && purpledrift && slopeboost) return RP_BLAN; return RP_CUST; diff --git a/src/k_kart.c b/src/k_kart.c index 6c326b2ce..7900c6638 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -339,6 +339,13 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartstacking_ring_accelboost); CV_RegisterVar(&cv_kartstacking_ring_stackable); + CV_RegisterVar(&cv_kartstacking_slope_decay); + CV_RegisterVar(&cv_kartstacking_slope_brakemod); + CV_RegisterVar(&cv_kartstacking_slope_speedboost_max); + CV_RegisterVar(&cv_kartstacking_slope_speedboost_cap); + CV_RegisterVar(&cv_kartstacking_slope_accelboost); + CV_RegisterVar(&cv_kartstacking_slope_stackable); + CV_RegisterVar(&cv_kartchaining); CV_RegisterVar(&cv_kartchainingoffroad); CV_RegisterVar(&cv_kartchainingsound); @@ -355,6 +362,8 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartslipdash); + CV_RegisterVar(&cv_kartslopeboost); + CV_RegisterVar(&cv_kartinvintype); CV_RegisterVar(&cv_kartinvindist); CV_RegisterVar(&cv_kartinvindistmul); @@ -3829,6 +3838,88 @@ static fixed_t K_RingDurationBoost(const player_t *player) return ret; } +static fixed_t K_DecaySlopeBoost(fixed_t prevslopeboost, INT32 brake) +{ + return max(prevslopeboost - (SLOPEDECAY + brake + prevslopeboost/60), 0); +} + +static void K_DoSlopeBrake(player_t *player, fixed_t prevslopeboost, INT32 brake) +{ + player->slopeboost = K_DecaySlopeBoost(prevslopeboost, brake); + player->slopeaccel = 0; + player->prevslopeboost = player->slopeboost; +} + +static void K_UpdateSlopeBoost(player_t *player) +{ + pslope_t *slope = player->mo->standingslope; + boolean flip = player->mo->eflags & MFE_VERTICALFLIP; + angle_t momangle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy), hillangle = 0; + fixed_t anglemult, slopemult, mult; + fixed_t addedboost, addedaccel; + INT32 brake; + + if (!K_SlopeBoostActive()) + { + player->slopeboost = player->slopeaccel = player->prevslopeboost = 0; + return; + } + + if ((K_GetKartButtons(player) & BT_BRAKE) || player->offroad || !player->speed) + { + brake = SLOPEBRAKEMOD; + } + + if (!slope || (player->offroad && K_ApplyOffroad(player)) || !player->speed) + { + K_DoSlopeBrake(player, player->prevslopeboost, brake); + return; + } + + if ((((int)slope->zangle > 0) && flip) || (((int)slope->zangle < 0) && (!flip))) + { + hillangle = momangle - slope->xydirection; + } + else + { + hillangle = momangle - (slope->xydirection + ANGLE_180); + } + + hillangle = max(abs((int)hillangle) - ANG1*3, 0); // ANG1*3 somehow fixes some slopes??? + + if (hillangle >= ANGLE_90) + { + K_DoSlopeBrake(player, player->prevslopeboost, brake); + return; + } + + anglemult = FixedDiv(AngleFixed(ANGLE_90-hillangle), 90*FRACUNIT); + slopemult = FixedDiv(AngleFixed(min(abs((int)slope->zangle)+ANG1*3, ANGLE_90)), 90*FRACUNIT); + + mult = FixedMul(anglemult, slopemult); + + addedboost = min(FixedMul(mult, SLOPESPEEDBOOSTMAX), SLOPESPEEDBOOSTCAP); + addedaccel = FixedMul(mult, SLOPEACCELBOOST); + + if (K_GetKartButtons(player) & BT_BRAKE) + { + addedboost = K_DecaySlopeBoost(player->prevslopeboost, brake); + } + else if (addedboost >= player->prevslopeboost) + { + addedboost = min(addedboost, player->prevslopeboost+mult*5/100); + } + else + { + addedboost = max(K_DecaySlopeBoost(player->prevslopeboost, brake), addedboost); + } + + player->slopeboost = addedboost; + player->slopeaccel = addedaccel; + + player->prevslopeboost = addedboost; +} + // sets boostpower, speedboost and accelboost to whatever we need it to be static void K_GetKartBoostPower(player_t *player) { @@ -3908,6 +3999,11 @@ static void K_GetKartBoostPower(player_t *player) K_DoBoost(player, RINGSPEEDBOOST, RINGACCELBOOST, RINGSTACKABLE, RINGSTACKABLE); // + 20% top speed, + 400% acceleration } + if (player->slopeboost || player->slopeaccel) + { + K_DoBoost(player, player->slopeboost, player->slopeaccel, SLOPESTACKABLE, false); // + ???% top speed, + 300% acceleration + } + // This should always remain the last boost if (player->botvars.rubberband > FRACUNIT && K_PlayerUsesBotMovement(player) == true) { @@ -7714,6 +7810,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (!K_IsPlayerDamaged(player) && !player->wipeoutslow) player->boostangle = player->mo->angle; + K_UpdateSlopeBoost(player); K_GetKartBoostPower(player); // Special effect objects! @@ -11799,6 +11896,17 @@ boolean K_SlipdashActive(void) return false; } +boolean K_SlopeBoostActive(void) +{ + if (slopeboostactive) + { + // SlopeBoost is enabled! + return true; + } + + return false; +} + boolean K_UsingLegacyCheckpoints(void) { if (K_UsingPatchedMap() && waypointcap) diff --git a/src/k_kart.h b/src/k_kart.h index 90d816a67..a59939373 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -93,27 +93,40 @@ extern vector3_t clusterpoint, clusterdtf; #define SNEAKERACCELBOOST K_RAGuard(cv_kartstacking_sneaker_accelboost) #define MAXSNEAKERSTACK K_RAGuard(cv_kartstacking_sneaker_maxgrade) #define SNEAKERSTACKABLE K_RAGuard(cv_kartstacking_sneaker_stackable) + #define INVINSPEEDBOOSTLGC K_RAGuard(cv_kartstacking_invincibility_legacyspeedboost) #define INVINACCELBOOSTLGC K_RAGuard(cv_kartstacking_invincibility_legacyaccelboost) #define INVINSPEEDBOOSTALT K_RAGuard(cv_kartstacking_invincibility_alternatespeedboost) #define INVINACCELBOOSTALT K_RAGuard(cv_kartstacking_invincibility_alternateaccelboost) #define INVINSTACKABLE K_RAGuard(cv_kartstacking_invincibility_stackable) + #define GROWSPEEDBOOST K_RAGuard(cv_kartstacking_grow_speedboost) #define GROWACCELBOOST K_RAGuard(cv_kartstacking_grow_accelboost) #define GROWSTACKABLE K_RAGuard(cv_kartstacking_grow_stackable) + #define FLAMESPEEDVAL K_RAGuard(cv_kartstacking_flame_speedval) #define FLAMEACCELBOOST K_RAGuard(cv_kartstacking_flame_accelboost) #define FLAMESTACKABLE K_RAGuard(cv_kartstacking_flame_stackable) + #define STARTSPEEDBOOST K_RAGuard(cv_kartstacking_start_speedboost) #define STARTACCELBOOST K_RAGuard(cv_kartstacking_start_accelboost) #define STARTSTACKABLE K_RAGuard(cv_kartstacking_start_stackable) + #define DRIFTSPEEDBOOST K_RAGuard(cv_kartstacking_drift_speedboost) #define DRIFTACCELBOOST K_RAGuard(cv_kartstacking_drift_accelboost) #define DRIFTSTACKABLE K_RAGuard(cv_kartstacking_drift_stackable) + #define RINGSPEEDBOOST K_RAGuard(cv_kartstacking_ring_speedboost) #define RINGACCELBOOST K_RAGuard(cv_kartstacking_ring_accelboost) #define RINGSTACKABLE K_RAGuard(cv_kartstacking_ring_stackable) +#define SLOPEDECAY K_RAGuard(cv_kartstacking_slope_decay) +#define SLOPEBRAKEMOD K_RAGuard(cv_kartstacking_slope_brakemod) +#define SLOPESPEEDBOOSTMAX K_RAGuard(cv_kartstacking_slope_speedboost_max) +#define SLOPESPEEDBOOSTCAP K_RAGuard(cv_kartstacking_slope_speedboost_cap) +#define SLOPEACCELBOOST K_RAGuard(cv_kartstacking_slope_accelboost) +#define SLOPESTACKABLE K_RAGuard(cv_kartstacking_slope_stackable) + #define CANTCHAINOFFROAD (cv_kartchaining.value && !cv_kartchainingoffroad.value) // Used for respawning checks. @@ -301,6 +314,7 @@ boolean K_PurpleDriftActive(void); boolean K_StackingActive(void); boolean K_ChainingActive(void); boolean K_SlipdashActive(void); +boolean K_SlopeBoostActive(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); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 19110cf5f..83d4b5dc9 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -4052,13 +4052,20 @@ static int lib_kChainingActive(lua_State *L) return 1; } -// Checks if Chaining is active. +// Checks if Slipdash is active. static int lib_kSlipdashActive(lua_State *L) { lua_pushboolean(L, K_SlipdashActive()); return 1; } +// Checks if Slope Boost is active. +static int lib_kSlopeBoostActive(lua_State *L) +{ + lua_pushboolean(L, K_SlopeBoostActive()); + return 1; +} + // Checks if current map is using legacy boss3 bassed checkpoints. Useful for map compat. static int lib_kUsingLegacyCheckpoints(lua_State *L) { @@ -4638,6 +4645,7 @@ static luaL_Reg lib[] = { {"K_StackingActive",lib_kStackingActive}, {"K_ChainingActive",lib_kChainingActive}, {"K_SlipdashActive",lib_kSlipdashActive}, + {"K_SlopeBoostActive",lib_kSlopeBoostActive}, {"K_UsingLegacyCheckpoints",lib_kUsingLegacyCheckpoints}, {"K_DoBoost",lib_kDoBoost}, {"K_ClearBoost",lib_kClearBoost}, diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 36dcff2e1..d97f15cf8 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -209,6 +209,9 @@ enum player_e player_driftcharge, player_driftboost, player_boostcharge, + player_slopeboost, + player_prevslopeboost, + player_slopeaccel, player_startboost, player_dropdash, player_respawn, @@ -391,6 +394,9 @@ static const char *const player_opt[] = { "driftcharge", "driftboost", "boostcharge", + "slopeboost", + "prevslopeboost", + "slopeaccel", "startboost", "dropdash", "respawn", @@ -683,6 +689,15 @@ static int player_get(lua_State *L) case player_boostcharge: lua_pushinteger(L, plr->boostcharge); break; + case player_slopeboost: + lua_pushinteger(L, plr->slopeboost); + break; + case player_prevslopeboost: + lua_pushinteger(L, plr->prevslopeboost); + break; + case player_slopeaccel: + lua_pushinteger(L, plr->slopeaccel); + break; case player_startboost: lua_pushinteger(L, plr->startboost); break; @@ -1316,6 +1331,15 @@ static int player_set(lua_State *L) case player_boostcharge: plr->boostcharge = luaL_checkinteger(L, 3); break; + case player_slopeboost: + plr->slopeboost = luaL_checkinteger(L, 3); + break; + case player_prevslopeboost: + plr->prevslopeboost = luaL_checkinteger(L, 3); + break; + case player_slopeaccel: + plr->slopeaccel = luaL_checkinteger(L, 3); + break; case player_startboost: plr->startboost = luaL_checkinteger(L, 3); break; diff --git a/src/m_menu.c b/src/m_menu.c index 0a4bd9756..e3e5a2c84 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -385,6 +385,7 @@ consvar_t cv_dummyattackingstacking = CVAR_INIT ("dummyattackingstacking", "Off" consvar_t cv_dummyattackingchaining = CVAR_INIT ("dummyattackingchaining", "Off", CV_HIDEN|CV_CALL|CV_NOINIT, CV_OnOff, Nextmap_OnChange); 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); +consvar_t cv_dummyattackingslopeboost = CVAR_INIT ("dummyattackingslopeboost", "Off", CV_HIDEN|CV_CALL|CV_NOINIT, CV_OnOff, 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 @@ -578,6 +579,7 @@ char *M_AppendGametypeAndModName(void) ADD(cv_dummyattackingchaining, "CH-") ADD(cv_dummyattackingslipdash, "SD-") ADD(cv_dummyattackingpurpledrift, "PD-") + ADD(cv_dummyattackingslopeboost, "SB-") new_str[len-1] = '\0'; @@ -2035,6 +2037,7 @@ void M_Init(void) CV_RegisterVar(&cv_dummyattackingchaining); CV_RegisterVar(&cv_dummyattackingslipdash); CV_RegisterVar(&cv_dummyattackingpurpledrift); + CV_RegisterVar(&cv_dummyattackingslopeboost); CV_RegisterVar(&cv_dummygpdifficulty); CV_RegisterVar(&cv_dummygpencore); @@ -5737,11 +5740,11 @@ INT32 MR_ReplayStaff(INT32 choice) } #define NUMPRESETS 3 -static boolean presets[NUMPRESETS][5] = { - //rings stacking chaining slipdash purpledrift - { false, false, false, false, false }, // SRB2Kart - { false, true, true, false, false }, // Tech - { true, true, true, true, true }, // BlanKart +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 }; INT32 MR_TimeAttackPreset(INT32 arg) @@ -5755,6 +5758,7 @@ INT32 MR_TimeAttackPreset(INT32 arg) 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"); return true; } #undef NUMPRESETS diff --git a/src/m_menu.h b/src/m_menu.h index 62c9a8801..8ec812319 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -406,7 +406,7 @@ extern consvar_t cv_newgametype, cv_nextmap, cv_chooseskin, cv_serversort; 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; +extern consvar_t cv_dummyattackingslipdash, cv_dummyattackingpurpledrift, cv_dummyattackingslopeboost; 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_mobj.h b/src/p_mobj.h index d17a38772..9e2361a79 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -590,6 +590,7 @@ extern boolean stackingactive; extern boolean chainingactive; extern boolean slipdashactive; extern boolean purpledriftactive; +extern boolean slopeboostactive; extern UINT16 bossdisabled; extern boolean stoppedclock; diff --git a/src/p_saveg.c b/src/p_saveg.c index f95c493ee..4c30ead98 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -342,6 +342,10 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].boostcharge); + WRITEFIXED(save->p, players[i].slopeboost); + WRITEFIXED(save->p, players[i].prevslopeboost); + WRITEFIXED(save->p, players[i].slopeaccel); + WRITEINT16(save->p, players[i].growshrinktimer); WRITEINT16(save->p, players[i].growcancel); @@ -689,6 +693,10 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].boostcharge = READUINT8(save->p); + players[i].slopeboost = READFIXED(save->p); + players[i].prevslopeboost = READFIXED(save->p); + players[i].slopeaccel = READFIXED(save->p); + players[i].growshrinktimer = READINT16(save->p); players[i].growcancel = READINT16(save->p); @@ -5169,6 +5177,7 @@ static void P_NetArchiveMisc(savebuffer_t *save, boolean resending) WRITEUINT8(save->p, chainingactive); WRITEUINT8(save->p, slipdashactive); WRITEUINT8(save->p, purpledriftactive); + WRITEUINT8(save->p, slopeboostactive); for (i = 0; i < 12; i++) { @@ -5356,6 +5365,7 @@ FUNCINLINE static ATTRINLINE boolean P_NetUnArchiveMisc(savebuffer_t *save, bool chainingactive = READUINT8(save->p); slipdashactive = READUINT8(save->p); purpledriftactive = READUINT8(save->p); + slopeboostactive = READUINT8(save->p); for (i = 0; i < 12; i++) { diff --git a/src/p_setup.c b/src/p_setup.c index 4517f3a75..a36a8feb5 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -150,6 +150,7 @@ boolean stackingactive; boolean chainingactive; boolean slipdashactive; boolean purpledriftactive; +boolean slopeboostactive; UINT16 bossdisabled; boolean stoppedclock; boolean levelloading; @@ -8021,6 +8022,7 @@ static void P_InitLevelSettings(boolean reloadinggamestate) chainingactive = false; slipdashactive = false; purpledriftactive = false; + slopeboostactive = false; if (cv_kartrings.value) ringsactive = true; @@ -8037,6 +8039,9 @@ static void P_InitLevelSettings(boolean reloadinggamestate) if (cv_kartslipdash.value) slipdashactive = true; + if (cv_kartslopeboost.value) + slopeboostactive = true; + invintype = (UINT8)cv_kartinvintype.value; // emerald hunt @@ -8117,6 +8122,7 @@ static void P_InitLevelSettings(boolean reloadinggamestate) stackingactive = cv_dummyattackingstacking.value; chainingactive = cv_dummyattackingchaining.value; slipdashactive = cv_dummyattackingslipdash.value; + slopeboostactive = cv_dummyattackingslopeboost.value; } else {