Make bubble shields pop if you "overinflate" them

This commit is contained in:
Anonimus 2025-09-28 15:42:50 -04:00
parent 7a2fd0be42
commit d9accbd575
7 changed files with 70 additions and 8 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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

View file

@ -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)

View file

@ -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)

View file

@ -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;

View file

@ -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);