From ea9171bff7595692344ba6573688b80f04dc3b03 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sat, 14 Mar 2026 18:48:43 -0400 Subject: [PATCH 1/6] Remove unused bubbleMultipler variable --- src/k_kart.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 0add2b200..dfe5798bc 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -529,7 +529,6 @@ fixed_t K_GetKartGameSpeedScalar(SINT8 value) static fixed_t K_PlayerWeight(mobj_t* mobj, mobj_t* against) { fixed_t weight = 5 * FRACUNIT; - fixed_t bubbleMultiplier = FRACUNIT; if (!mobj->player) return weight; @@ -579,11 +578,6 @@ static fixed_t K_PlayerWeight(mobj_t* mobj, mobj_t* against) weight = FixedMul(weight, FRACUNIT / 16); } - if (bubbleMultiplier) - { - weight = FixedMul(weight, bubbleMultiplier); - } - if (mobj->player->speed > spd) weight += (mobj->player->speed - spd) / 8; From 387ea9a559ec664f5f703b499d4885e3a1740985 Mon Sep 17 00:00:00 2001 From: yamamama Date: Sat, 14 Mar 2026 18:54:25 -0400 Subject: [PATCH 2/6] Experiment: attempt to make Arrow Bullet more reliable by lowering the minimum threshold This is an Alt Shrink buff --- src/d_netcmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 7549a30bf..5dce43e99 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -713,7 +713,7 @@ consvar_t cv_kartflame_offroadburn = CVAR_INIT ("kartflame_offroadburn", "On", C consvar_t cv_kartaltshrink_arrowbullet = CVAR_INIT ("kart_altshrink_arrowbullet", "On", CV_NETVAR, CV_OnOff, NULL); static CV_PossibleValue_t altshrink_arrowbullet_threshold_cons_t[] = {{0, "MIN"}, {2 * FRACUNIT, "MAX"}, {0, NULL}}; -consvar_t cv_kartaltshrink_arrowbulletthres = CVAR_INIT ("kart_altshrink_arrowbullet_threshold", "1.66", CV_NETVAR|CV_FLOAT, altshrink_arrowbullet_threshold_cons_t, NULL); +consvar_t cv_kartaltshrink_arrowbulletthres = CVAR_INIT ("kart_altshrink_arrowbullet_threshold", "1.45", CV_NETVAR|CV_FLOAT, altshrink_arrowbullet_threshold_cons_t, NULL); static CV_PossibleValue_t kartairsquish_cons_t[] = {{1, "Squish"}, {2, "Flip-over"}, {0, "None"}, {0, NULL}}; consvar_t cv_kartairsquish = CVAR_INIT ("kartairsquish", "None", CV_NETVAR, kartairsquish_cons_t, NULL); From f082cb14396b55a4e82275b39dec26647c156efd Mon Sep 17 00:00:00 2001 From: yamamama Date: Sat, 14 Mar 2026 19:21:15 -0400 Subject: [PATCH 3/6] Player-tracking roulette box visibility --- src/d_netcmd.c | 4 ++++ src/d_netcmd.h | 2 +- src/k_hud.c | 17 ++++++++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 5dce43e99..71a17a5b3 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -825,6 +825,9 @@ static CV_PossibleValue_t rlplrtrans_cons_t[] = {{0, "MIN"}, {10, "MAX"}, {0, NU // Default is 7 (70% visible; V_30TRANS) consvar_t cv_rouletteplayertrans = CVAR_INIT ("rouletteonplayertrans", "7", CV_SAVE, rlplrtrans_cons_t, NULL); +// Item box visibility; a separate cvar +consvar_t cv_rouletteplayerboxtrans = CVAR_INIT ("rouletteonplayerboxtrans", "10", CV_SAVE, rlplrtrans_cons_t, NULL); + consvar_t cv_showviewpointtext = CVAR_INIT ("showviewpointtext", "On", CV_SAVE, CV_OnOff, NULL); // Intermission time Tails 04-19-2002 @@ -1143,6 +1146,7 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_spinoutroll); CV_RegisterVar(&cv_rouletteonplayer); CV_RegisterVar(&cv_rouletteplayertrans); + CV_RegisterVar(&cv_rouletteplayerboxtrans); CV_RegisterVar(&cv_showlapemblem); CV_RegisterVar(&cv_lapemblemmode); CV_RegisterVar(&cv_racesplits); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index a55ce1258..b75b71cbc 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -300,7 +300,7 @@ extern consvar_t cv_lapemblemmode; extern consvar_t cv_racesplits; extern consvar_t cv_showviewpointtext; extern consvar_t cv_rouletteonplayer; -extern consvar_t cv_rouletteplayertrans; +extern consvar_t cv_rouletteplayertrans, cv_rouletteplayerboxtrans; extern consvar_t cv_skipmapcheck; diff --git a/src/k_hud.c b/src/k_hud.c index 72570a284..8ad5d6f7c 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -1586,6 +1586,7 @@ static void K_drawKartItem(void) INT32 hudtrans = V_GetHudTrans(); INT32 transflag = (fade) ? V_HUDTRANSHALF : V_HUDTRANS; + INT32 boxtransflag = V_HUDTRANS; INT32 transmul = FRACUNIT - (hudtrans * FRACUNIT / 10); if (hudtrans > 9) @@ -1596,6 +1597,7 @@ static void K_drawKartItem(void) // Let the player pick and choose their visibility level. INT32 roulettetrans = cv_rouletteplayertrans.value; + INT32 boxtrans = cv_rouletteplayerboxtrans.value; // RadioRacers if (shouldDrawOnPlayer) @@ -1621,7 +1623,10 @@ static void K_drawKartItem(void) } if (stplyr->exiting) + { roulettetrans = -1; + boxtrans = -1; + } if (roulettetrans > -1) { @@ -1631,6 +1636,15 @@ static void K_drawKartItem(void) { transflag = (fade) ? V_HUDTRANSHALF : V_HUDTRANS; } + + if (boxtrans > -1) + { + boxtransflag = max(0, min(9, 10 - FixedMul(boxtrans, transmul))) << V_ALPHASHIFT; + } + else + { + boxtransflag = V_HUDTRANS; + } } @@ -1640,6 +1654,7 @@ static void K_drawKartItem(void) flipamount = info.flipamount; INT32 localpatchflags = (transflag|fflags); + INT32 boxpatchflags = (boxtransflag|fflags); if (localcolor != SKINCOLOR_NONE) { @@ -1653,7 +1668,7 @@ static void K_drawKartItem(void) if (K_UseColorHud()) colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE); - V_DrawFixedPatch(fx << FRACBITS, fy << FRACBITS, info.hudScale, V_HUDTRANS|fflags, localbg, colormap); + V_DrawFixedPatch(fx << FRACBITS, fy << FRACBITS, info.hudScale, boxpatchflags, localbg, colormap); // Then, the numbers: if (stplyr->itemamount >= K_GetItemNumberDisplayMin(stplyr->itemtype, tiny) && !stplyr->itemroulette) From 952f98511b30e1df1cd21e9cb9c267d25902468f Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Sat, 14 Mar 2026 23:41:14 +0100 Subject: [PATCH 4/6] Some heavy airdrop tweaks * Reduced min delay in fusion mode from 11 to 6 tics * Made air drag MUCH weaker, and applied to heavy-only mode for consistency * XY momentum cut in fusion/heavy changed from 0.9x/0.8x to 0.85x for both * Increased the Z momentum cut if you have high upwards momentum * Reduced ring cost from 3 to 2 * Kickstart accel inverts the accelerate input in fusion --- src/k_kart.c | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index dfe5798bc..3b946cb1d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7011,8 +7011,9 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) const INT32 heavydropassistmin = TICRATE/2; const INT32 heavydropassistmax = 3*TICRATE/2; - const INT32 airbrakedelay_heavy = TICRATE/8; + // in fusion, extend heavy airdrop's delay slightly so light airdrop isn't totally useless const INT32 airbrakedelay_light = TICRATE/3; + const INT32 airbrakedelay_heavy = airdropactive == AIRDROP_FUSION ? 3*airbrakedelay_light/5 : TICRATE/8; if (P_IsObjectOnGround(player->mo)) { @@ -7023,12 +7024,19 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) player->airdropbuffer--; } - if ((cmd->buttons & BT_BRAKE)) + UINT16 buttons = cmd->buttons; + + // kickstart needs a little special treatment in fusion... + // heavy airdrop should be the two-button input, not light airdrop + if (airdropactive == AIRDROP_FUSION && player->pflags & PF_KICKSTARTACCEL) + buttons ^= BT_ACCELERATE; + + if (buttons & BT_BRAKE) { // don't buffer heavy airdrops on the ground to prevent silly mistakes // but do allow buffering in the air (still) to compensate for the added delay if ((!P_IsObjectOnGround(player->mo) && !(player->airdropflags & PAF_AIRDROPINPUT)) - || (airdropactive != AIRDROP_HEAVY && !(airdropactive == AIRDROP_FUSION && !(cmd->buttons & BT_ACCELERATE)))) + || (airdropactive != AIRDROP_HEAVY && !(airdropactive == AIRDROP_FUSION && !(buttons & BT_ACCELERATE)))) { player->airdropflags |= PAF_WANTSAIRDROP; player->airdropbuffer = 2; @@ -7061,7 +7069,7 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) { if ((player->airdropflags & PAF_AIRDROP_HEAVY)) { - P_PlayerRingBurst(player, CLAMP(player->rings, 0, 3)); + P_PlayerRingBurst(player, CLAMP(player->rings, 0, 2)); if (player->airdroptime > 1) { @@ -7091,12 +7099,13 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) if (player->airdropflags & PAF_WANTSAIRDROP) { - if (((airdropactive == AIRDROP_LIGHT) || (airdropactive == AIRDROP_FUSION && (cmd->buttons & BT_ACCELERATE))) && player->airdroppredelay >= airbrakedelay_light) + if (airdropactive == AIRDROP_LIGHT || (airdropactive == AIRDROP_FUSION && buttons & BT_ACCELERATE)) { - player->airdropflags |= PAF_AIRDROP_LIGHT; + if (player->airdroppredelay >= airbrakedelay_light) + player->airdropflags |= PAF_AIRDROP_LIGHT; } - else if ((airdropactive == AIRDROP_HEAVY || airdropactive == AIRDROP_FUSION) && player->airdroppredelay >= (airdropactive == AIRDROP_FUSION ? airbrakedelay_light : airbrakedelay_heavy) && - !(player->airdropflags & (PAF_AIRDROP_HEAVY)) && !(player->mo->eflags & MFE_GOOWATER)) // in fusion, fires if brake is held but not accel, and has the same delay as light airdrop (this makes it feel really really stiff but we're sacking feel for balance with light drop here 🥲) + else if ((airdropactive == AIRDROP_HEAVY || airdropactive == AIRDROP_FUSION) && player->airdroppredelay >= airbrakedelay_heavy + && !(player->airdropflags & PAF_AIRDROP_HEAVY) && !(player->mo->eflags & MFE_GOOWATER)) { player->airdropflags |= PAF_AIRDROP_HEAVY; player->airdroptime = 0; @@ -7105,9 +7114,11 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) S_StartSound(player->mo, sfx_s3k77); S_StartSound(player->mo, sfx_s3k51); - player->mo->momx = FixedMul(player->mo->momx, 90*FRACUNIT/100); - player->mo->momy = FixedMul(player->mo->momy, 90*FRACUNIT/100); - player->mo->momz -= 10*P_MobjFlip(player->mo)*mapobjectscale; + player->mo->momx = FixedMul(player->mo->momx, 17*FRACUNIT/20); + player->mo->momy = FixedMul(player->mo->momy, 17*FRACUNIT/20); + + // extra strong on ramp jumps! + player->mo->momz -= P_MobjFlip(player->mo) * max(10*mapobjectscale, player->mo->momz/3); } } else @@ -7123,18 +7134,8 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) // hi-power is considerably shorter in fusion const boolean high = player->airdroptime <= ((airdropactive == AIRDROP_FUSION) ? heavydrophipowertime_fusion : heavydrophipowertime); - if (airdropactive == AIRDROP_FUSION) - { - player->mo->momx = FixedMul(player->mo->momx, (high ? 98 : 99)*FRACUNIT/100); - player->mo->momy = FixedMul(player->mo->momy, (high ? 98 : 99)*FRACUNIT/100); - } - else if (!player->airdroptime) - { - // cut momentum once on start, it should feel particularily snappy when only being able to use heavy - player->mo->momx = FixedMul(player->mo->momx, 90*FRACUNIT/100); - player->mo->momy = FixedMul(player->mo->momy, 90*FRACUNIT/100); - } - + player->mo->momx = FixedMul(player->mo->momx, FRACUNIT - FRACUNIT/300); + player->mo->momy = FixedMul(player->mo->momy, FRACUNIT - FRACUNIT/300); player->mo->momz -= FixedMul((high ? 4 : 2)*gravity, mapobjectscale)*P_MobjFlip(player->mo); K_SpawnFallLines(player, high); From 19038018f0be796efdeaf090292ec0dc88184313 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sat, 14 Mar 2026 19:41:53 -0400 Subject: [PATCH 5/6] Give flameshield a numbers buff Max speed goes from 78 on sonic to 81 and its accel matches what a sneaker is --- src/d_netcmd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 71a17a5b3..2ba909895 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -540,8 +540,8 @@ consvar_t cv_kartstacking_bubble_accelboost = CVAR_INIT ("vanillaboost_bubble_ac consvar_t cv_kartstacking_bubble_handleboost = CVAR_INIT ("vanillaboost_bubble_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_bubble_stackable = CVAR_INIT ("vanillaboost_bubble_stackable", "Off", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); -consvar_t cv_kartstacking_flame_speedval = CVAR_INIT ("vanillaboost_flame_speedval", "0.14", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); -consvar_t cv_kartstacking_flame_accelboost = CVAR_INIT ("vanillaboost_flame_accelboost", "6.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_flame_speedval = CVAR_INIT ("vanillaboost_flame_speedval", "0.20", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_flame_accelboost = CVAR_INIT ("vanillaboost_flame_accelboost", "8.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_flame_handleboost = CVAR_INIT ("vanillaboost_flame_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_flame_stackable = CVAR_INIT ("vanillaboost_flame_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); From 15079bd993454851c0fc267f5adc86ec06e2b516 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sat, 14 Mar 2026 19:51:53 -0400 Subject: [PATCH 6/6] Buff flame by 2 seconds and expose its value to SOC and Lua --- src/deh_soc.c | 4 ++++ src/doomstat.h | 1 + src/g_game.c | 1 + src/k_items.c | 2 +- src/lua_script.c | 5 +++++ 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/deh_soc.c b/src/deh_soc.c index 52f360772..ae2e7467b 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -3288,6 +3288,10 @@ void readmaincfg(MYFILE *f) { bubbletime = get_number(word2); } + else if (fastcmp(word, "FLAMETIME")) + { + flametime = get_number(word2); + } else if (fastcmp(word, "COMEBACKTIME")) { comebacktime = get_number(word2); diff --git a/src/doomstat.h b/src/doomstat.h index 2f3dde5ae..37540d3af 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -618,6 +618,7 @@ extern INT32 sneakertime; extern INT32 waterpaneltime; extern INT32 itemtime; extern INT32 bubbletime; +extern INT32 flametime;; extern INT32 comebacktime; extern INT32 bumptime; extern INT32 greasetics; diff --git a/src/g_game.c b/src/g_game.c index fc809bad0..9a6b3c6af 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -264,6 +264,7 @@ INT32 greasetics = 3*TICRATE; INT32 wipeoutslowtime = 20; INT32 wantedreduce = 5*TICRATE; INT32 wantedfrequency = 10*TICRATE; +INT32 flametime = (((8*TICRATE)*3) + (2*TICRATE)); UINT8 use1upSound = 0; UINT8 maxXtraLife = 2; // Max extra lives from rings diff --git a/src/k_items.c b/src/k_items.c index 4d179b28f..c51cbc9fb 100644 --- a/src/k_items.c +++ b/src/k_items.c @@ -2512,7 +2512,7 @@ void K_PlayerItemThink(player_t *player, boolean onground) if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO && K_GetShieldFromPlayer(player) != KSHIELD_FLAME) { player->itemamount--; - player->flametimer = (itemtime*3); + player->flametimer = flametime; player->flamedash = 0; mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_FLAMESHIELD); P_SetScale(shield, (shield->destscale = (5*shield->destscale)>>2)); diff --git a/src/lua_script.c b/src/lua_script.c index 18a193148..750f32980 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -488,6 +488,9 @@ int LUA_PushGlobals(lua_State *L, const char *word) } else if (fastcmp(word, "bubbletime")) { lua_pushinteger(L, bubbletime); return 1; + } else if (fastcmp(word, "flametime")) { + lua_pushinteger(L, flametime); + return 1; } else if (fastcmp(word, "comebacktime")) { lua_pushinteger(L, comebacktime); return 1; @@ -598,6 +601,8 @@ int LUA_WriteGlobals(lua_State *L, const char *word) waterpaneltime = (INT32)luaL_checkinteger(L, 2); else if (fastcmp(word, "bubbletime")) bubbletime = (INT32)luaL_checkinteger(L, 2); + else if (fastcmp(word, "flametime")) + flametime = (INT32)luaL_checkinteger(L, 2); else if (fastcmp(word, "comebacktime")) comebacktime = (INT32)luaL_checkinteger(L, 2); else if (fastcmp(word, "greasetics"))