From d9accbd5751e2ba39aad4246573dae8e568482fe Mon Sep 17 00:00:00 2001 From: Anonimus Date: Sun, 28 Sep 2025 15:42:50 -0400 Subject: [PATCH] Make bubble shields pop if you "overinflate" them --- src/d_netcmd.c | 4 ++++ src/d_netcmd.h | 4 ++++ src/d_player.h | 3 +++ src/k_kart.c | 49 +++++++++++++++++++++++++++++++++++++-------- src/k_kart.h | 4 ++++ src/lua_playerlib.c | 8 ++++++++ src/p_saveg.c | 6 ++++++ 7 files changed, 70 insertions(+), 8 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index d1c762fd0..f57da5dc4 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -495,6 +495,10 @@ consvar_t cv_kartstacking_grow_speedboost = CVAR_INIT ("vanillaboost_grow_speedb consvar_t cv_kartstacking_grow_accelboost = CVAR_INIT ("vanillaboost_grow_accelboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); consvar_t cv_kartstacking_grow_stackable = CVAR_INIT ("vanillaboost_grow_stackable", "Off", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_kartstacking_bubble_speedboost = CVAR_INIT ("vanillaboost_bubble_speedboost", "0.3", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_bubble_accelboost = CVAR_INIT ("vanillaboost_bubble_accelboost", "4.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_bubble_stackable = CVAR_INIT ("vanillaboost_bubble_stackable", "Off", CV_NETVAR, CV_OnOff, NULL); + consvar_t cv_kartstacking_flame_speedval = CVAR_INIT ("vanillaboost_flame_speedval", "0.90", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); consvar_t cv_kartstacking_flame_accelboost = CVAR_INIT ("vanillaboost_flame_accelboost", "6.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); consvar_t cv_kartstacking_flame_stackable = CVAR_INIT ("vanillaboost_flame_stackable", "Off", CV_NETVAR, CV_OnOff, NULL); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 648999948..af46ba17e 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -156,6 +156,10 @@ extern consvar_t cv_kartstacking_grow_speedboost; extern consvar_t cv_kartstacking_grow_accelboost; extern consvar_t cv_kartstacking_grow_stackable; +extern consvar_t cv_kartstacking_bubble_speedboost; +extern consvar_t cv_kartstacking_bubble_accelboost; +extern consvar_t cv_kartstacking_bubble_stackable; + extern consvar_t cv_kartstacking_start_speedboost; extern consvar_t cv_kartstacking_start_accelboost; extern consvar_t cv_kartstacking_start_stackable; diff --git a/src/d_player.h b/src/d_player.h index c93b77b08..a16db4fad 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -695,9 +695,12 @@ struct player_t boolean ringdrop; // Set when having ringdrop applied. UINT8 curshield; // see kartshields_t + UINT8 bubblecool; // Bubble Shield use cooldown UINT8 bubbleblowup; // Bubble Shield usage blowup UINT8 bubblehealth; // Bubble Shield health + UINT16 bubbleboost; // Bubble shield boost timer + UINT16 flamedash; // Flame Shield dash power INT32 flametimer; // Flame Shield dash meter left UINT8 flamestore; // Flame Shield reserve boost diff --git a/src/k_kart.c b/src/k_kart.c index 7ff449b18..30ee7088d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -330,6 +330,10 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartstacking_grow_accelboost); CV_RegisterVar(&cv_kartstacking_grow_stackable); + CV_RegisterVar(&cv_kartstacking_bubble_speedboost); + CV_RegisterVar(&cv_kartstacking_bubble_accelboost); + CV_RegisterVar(&cv_kartstacking_bubble_stackable); + CV_RegisterVar(&cv_kartstacking_flame_speedval); CV_RegisterVar(&cv_kartstacking_flame_accelboost); CV_RegisterVar(&cv_kartstacking_flame_stackable); @@ -2027,6 +2031,7 @@ tripwirepass_t K_TripwirePassConditions(const player_t *player) { if ( player->invincibilitytimer || + player->bubbleboost || (player->sneakertimer && player->realsneakertimer) ) return TRIPWIRE_BLASTER; @@ -2585,7 +2590,10 @@ static void K_GetKartBoostPower(player_t *player) { fixed_t invspeedboost = K_GetInvincibilitySpeed(player->invincibilitytimer); fixed_t invaccelboost = K_GetInvincibilityAccel(player->invincibilitytimer); - K_DoBoost(player, invspeedboost, invaccelboost, INVINSTACKABLE, INVINSTACKABLE); // + 37.5% top speed, + 300% acceleration + + // Legacy: + 37.5% top speed, + 300% acceleration + // Alternative: + ???% top speed, + ???% acceleration + K_DoBoost(player, invspeedboost, invaccelboost, INVINSTACKABLE, INVINSTACKABLE); } if (player->growshrinktimer > 0) // Grow @@ -2593,6 +2601,11 @@ static void K_GetKartBoostPower(player_t *player) K_DoBoost(player, GROWSPEEDBOOST, GROWACCELBOOST, GROWSTACKABLE, GROWSTACKABLE); // + 20% top speed, + 0% acceleration } + if (player->bubbleboost) // Bubble Shield popping boost + { + K_DoBoost(player, BUBBLESPEEDBOOST, BUBBLEACCELBOOST, BUBBLESTACKABLE, BUBBLESTACKABLE); // + 30% top speed, + 400% acceleration + } + if (player->flamestore) // Flame Shield dash { fixed_t dash = K_FlameShieldDashVar(player->flamedash); @@ -6843,7 +6856,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) // Speed lines if (player->sneakertimer || player->ringboost || player->driftboost || player->startboost - || player->walltransferboost) + || player->walltransferboost + || player->bubbleboost) { #if 0 if (player->invincibilitytimer) @@ -7094,6 +7108,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } } + if (player->bubbleboost) + { + player->bubbleboost--; + } + if (player->growshrinktimer != 0) { if (player->growshrinktimer > 0) @@ -8765,7 +8784,7 @@ INT16 K_GetKartTurnValue(const player_t *player, INT16 turnvalue) if (K_SlipdashActive() && K_Sliptiding(player)) // slight handling boost based on weight turnvalue = FixedMul(turnvalue, FRACUNIT + (10 - player->kartweight)*FRACUNIT/48); - if (player->invincibilitytimer || player->sneakertimer || player->growshrinktimer > 0) + if (player->invincibilitytimer || player->sneakertimer || player->bubbleboost || player->growshrinktimer > 0) turnvalue = FixedMul(turnvalue, FixedDiv(5*FRACUNIT, 4*FRACUNIT)); if (player->flamedash && player->flamestore) // Reduce turning @@ -9030,7 +9049,7 @@ static void K_KartDrift(player_t *player, boolean onground) player->pflags &= ~(PF_BRAKEDRIFT|PF_GETSPARKS); } - if ( (!(player->sneakertimer || player->flamestore || K_AltInvinSliptideCondition(player))) + if ( (!(player->sneakertimer || player->flamestore || player->bubbleboost || K_AltInvinSliptideCondition(player))) || (!player->cmd.turning) || (!player->aizdriftstrat) || (player->cmd.turning > 0) != (player->aizdriftstrat > 0)) @@ -10583,15 +10602,29 @@ void K_MoveKartPlayer(player_t *player, boolean onground) // (was blowup x4 before) player->bubblecool = player->bubbleblowup*2; - if (player->bubbleblowup > bubbletime*2) + if (player->bubbleblowup > bubbletime*4) { - // Jump straight to deflating the bubble. - goto bubbledeflate; + // If you overcharge the Bubble Shield at + // any point, it pops and rockets you ahead. + K_BreakBubbleShield(player); + K_PopPlayerShield(player); + + S_StartSoundAtVolume(player->mo, sfx_cdfm57, 170); + K_PlayBoostTaunt(player->mo); +#define BUBBLETHRUST (7 * FRACUNIT / 5) + fixed_t spd = + max(K_GetKartSpeed(player, true, true), + FixedMul(player->speed, player->mo->scale)); + + P_InstaThrust(player->mo, + player->mo->angle, + FixedMul(spd, BUBBLETHRUST)); +#undef BUBBLETHRUST + player->bubbleboost = 2 * sneakertime / 3; } } else { -bubbledeflate: { boolean popped = false; if (player->bubbleblowup > bubbletime) diff --git a/src/k_kart.h b/src/k_kart.h index fe7bb92ac..3477720c4 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -114,6 +114,10 @@ extern vector3_t clusterpoint, clusterdtf; #define GROWACCELBOOST K_RAGuard(cv_kartstacking_grow_accelboost) #define GROWSTACKABLE K_RAGuard(cv_kartstacking_grow_stackable) +#define BUBBLESPEEDBOOST K_RAGuard(cv_kartstacking_bubble_speedboost) +#define BUBBLEACCELBOOST K_RAGuard(cv_kartstacking_bubble_accelboost) +#define BUBBLESTACKABLE K_RAGuard(cv_kartstacking_bubble_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) diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 718160d24..ae18cf4c4 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -269,6 +269,7 @@ enum player_e player_bubblecool, player_bubbleblowup, player_bubblehealth, + player_bubbleboost, player_flamedash, player_flametimer, player_flamestore, @@ -472,6 +473,7 @@ static const char *const player_opt[] = { "bubblecool", "bubbleblowup", "bubblehealth", + "bubbleboost", "flamedash", "flametimer", "flamestore", @@ -905,6 +907,9 @@ static int player_get(lua_State *L) case player_bubblehealth: lua_pushinteger(L, plr->bubblehealth); break; + case player_bubbleboost: + lua_pushinteger(L, plr->bubbleboost); + break; case player_flamedash: lua_pushinteger(L, plr->flamedash); break; @@ -1603,6 +1608,9 @@ static int player_set(lua_State *L) case player_bubblehealth: plr->bubblehealth = luaL_checkinteger(L, 3); break; + case player_bubbleboost: + plr->bubbleboost = luaL_checkinteger(L, 3); + break; case player_flamedash: plr->flamedash = luaL_checkinteger(L, 3); break; diff --git a/src/p_saveg.c b/src/p_saveg.c index 0cae67784..a6b0414b1 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -339,9 +339,12 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].ringdrop); WRITEUINT8(save->p, players[i].curshield); + WRITEUINT8(save->p, players[i].bubblecool); WRITEUINT8(save->p, players[i].bubbleblowup); WRITEUINT8(save->p, players[i].bubblehealth); + WRITEUINT16(save->p, players[i].bubbleboost); + WRITEUINT16(save->p, players[i].flamedash); WRITEINT32(save->p, players[i].flametimer); WRITEUINT8(save->p, players[i].flamestore); @@ -700,9 +703,12 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].ringdrop = READUINT8(save->p); players[i].curshield = READUINT8(save->p); + players[i].bubblecool = READUINT8(save->p); players[i].bubbleblowup = READUINT8(save->p); players[i].bubblehealth = READUINT8(save->p); + players[i].bubbleboost = READUINT16(save->p); + players[i].flamedash = READUINT16(save->p); players[i].flametimer = READINT32(save->p); players[i].flamestore = READUINT8(save->p);