From baa08682128f1acc857d7cc623dd0ddccb3ad553 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Tue, 2 Sep 2025 00:30:21 -0400 Subject: [PATCH 1/4] More lenient Ring Sting --- src/d_player.h | 1 + src/k_collide.cpp | 24 ++++++++++++++++++++++-- src/k_kart.c | 7 ++----- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index c8323be13..4c705c4cf 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -150,6 +150,7 @@ typedef enum PF2_FASTTUMBLEBOUNCE = 1<<9, // Don't lose speed when tumblebouncing. PF2_SERVERTEMPMUTE = 1<<10, // Haven't met gamestochat requirement + PF2_SAMEFRAMESTUNG = 1<<11, // Goofy bullshit for tracking mutual ring sting } pflags2_t; typedef enum diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 057258028..e0afef1c8 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -1180,7 +1180,6 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) return false; } - boolean guard1 = K_PlayerGuard(t1->player); boolean guard2 = K_PlayerGuard(t2->player); @@ -1310,11 +1309,30 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) return false; } + boolean damagedpresting = (t2->player->flashing || P_PlayerInPain(t2->player)); + + // CONS_Printf("T1=%s T2=%s\n", player_names[t1->player - players], player_names[t2->player - players]); + // CONS_Printf("DPS=%d\n", damagedpresting); + + if (P_PlayerInPain(t1->player) || t1->player->flashing) + { + // CONS_Printf("T1 pain\n"); + if (!(t1->player->pflags2 & PF2_SAMEFRAMESTUNG)) + return false; + // CONS_Printf("...but ignored\n"); + } + bool stung = false; - if (t2->player->rings <= 0 && t2->health == 1) // no bumpers + if (RINGTOTAL(t2->player) <= 0 && t2->health == 1 && t2->player->spindash == 0) { P_DamageMobj(t2, t1, t1, 1, DMG_STING|DMG_WOMBO); + // CONS_Printf("T2 stung\n"); + if (!damagedpresting) + { + t2->player->pflags2 |= PF2_SAMEFRAMESTUNG; + // CONS_Printf("T2 SFS\n"); + } stung = true; } @@ -1331,6 +1349,8 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) if (forEither(doSting, removeDamageHitlag)) { + t1->player->pflags2 &= ~PF2_SAMEFRAMESTUNG; + t2->player->pflags2 &= ~PF2_SAMEFRAMESTUNG; return true; } diff --git a/src/k_kart.c b/src/k_kart.c index a76cc0c9b..921ab01a4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3152,14 +3152,11 @@ fixed_t K_PlayerTripwireSpeedThreshold(const player_t *player) if (modeattacking && !(gametyperules & GTR_CATCHER)) required_speed = 4 * K_GetKartSpeed(player, false, false); - UINT32 distance = K_GetItemRouletteDistance(player, 8); - if ((gametyperules & GTR_CIRCUIT) && !K_Cooperative() && M_NotFreePlay() && !modeattacking) { - required_speed += FixedMul(required_speed, K_PlayerScamPercentage(player, 2)); // Proration: Players near 1st need more speed! + required_speed += FixedMul(required_speed, K_PlayerScamPercentage(player, 2)); // Proration: Players near 1st need more speed! } - if (player->offroad && K_ApplyOffroad(player)) { // Increase to 300% if you're lawnmowering. @@ -9838,7 +9835,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) // Race: spawn ring debt indicator // Battle: spawn zero-bumpers indicator - if ((gametyperules & GTR_SPHERES) ? player->mo->health <= 1 : player->rings <= 0) + if ((gametyperules & GTR_SPHERES) ? player->mo->health <= 1 : RINGTOTAL(player) <= 0) { UINT8 doubler; From 67109e2da1f3e93c0a7b13b6f4c99c777e99c334 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Tue, 2 Sep 2025 23:16:39 -0400 Subject: [PATCH 2/4] Fix spindash check (player collision removes spindash!) --- src/d_player.h | 1 + src/k_collide.cpp | 2 +- src/k_kart.c | 8 +++++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 4c705c4cf..f36065f0a 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -151,6 +151,7 @@ typedef enum PF2_SERVERTEMPMUTE = 1<<10, // Haven't met gamestochat requirement PF2_SAMEFRAMESTUNG = 1<<11, // Goofy bullshit for tracking mutual ring sting + PF2_UNSTINGABLE = 1<<12, // Was bumped out of spindash } pflags2_t; typedef enum diff --git a/src/k_collide.cpp b/src/k_collide.cpp index e0afef1c8..ed3ba0072 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -1324,7 +1324,7 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) bool stung = false; - if (RINGTOTAL(t2->player) <= 0 && t2->health == 1 && t2->player->spindash == 0) + if (RINGTOTAL(t2->player) <= 0 && t2->health == 1 && !(t2->player->pflags2 & PF2_UNSTINGABLE)) { P_DamageMobj(t2, t1, t1, 1, DMG_STING|DMG_WOMBO); // CONS_Printf("T2 stung\n"); diff --git a/src/k_kart.c b/src/k_kart.c index 921ab01a4..e808bcd4c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -967,6 +967,7 @@ void K_PlayerJustBumped(player_t *player) player->justbumped = bumptime; player->noEbrakeMagnet = ebraketime; + player->spindash = 0; // If spinouttimer is not set yet but could be set later, @@ -9833,9 +9834,14 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) K_SpawnGrowShrinkParticles(player->mo, player->growshrinktimer); } + if (player->spindash) + player->pflags2 |= PF2_UNSTINGABLE; + else + player->pflags2 &= ~PF2_UNSTINGABLE; + // Race: spawn ring debt indicator // Battle: spawn zero-bumpers indicator - if ((gametyperules & GTR_SPHERES) ? player->mo->health <= 1 : RINGTOTAL(player) <= 0) + if (!(player->pflags2 & PF2_UNSTINGABLE) && ((gametyperules & GTR_SPHERES) ? player->mo->health <= 1 : RINGTOTAL(player) <= 0)) { UINT8 doubler; From 763f9b21245946f6e8af119c7e5d6280d6a9baca Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Wed, 3 Sep 2025 01:03:11 -0400 Subject: [PATCH 3/4] Fix A-stings-B-stings-C billiards (FOREITHER IS FORXOR _WHY_) --- src/k_collide.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/k_collide.cpp b/src/k_collide.cpp index ed3ba0072..13d4bd3b6 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -1347,6 +1347,9 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) t1->eflags &= ~MFE_DAMAGEHITLAG; }; + // Looks bad, but "forEither" actually runs if t1 XOR t2 were damaged. + // I don't even think we use the touchdamage return value but I'm too + // afraid to change it now. Fix this if you're the next guy and annoyed if (forEither(doSting, removeDamageHitlag)) { t1->player->pflags2 &= ~PF2_SAMEFRAMESTUNG; @@ -1354,6 +1357,9 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) return true; } + t1->player->pflags2 &= ~PF2_SAMEFRAMESTUNG; + t2->player->pflags2 &= ~PF2_SAMEFRAMESTUNG; + return false; } From fa51861f665fb59c58122502579dad96adac627f Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Wed, 3 Sep 2025 01:16:35 -0400 Subject: [PATCH 4/4] Don't spindash warn when whipping or hitlagged --- src/k_hud_track.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/k_hud_track.cpp b/src/k_hud_track.cpp index d056b7313..6ac196648 100644 --- a/src/k_hud_track.cpp +++ b/src/k_hud_track.cpp @@ -488,6 +488,8 @@ std::optional object_tooltip(const mobj_t* mobj) boolean hitwarning = stplyr->flashing && stplyr->rings <= 0 && stplyr->speed < K_GetKartSpeed(stplyr, false, false)/2 && P_IsObjectOnGround(mobj) && !P_PlayerInPain(stplyr); + boolean whipping = stplyr->whip && !P_MobjWasRemoved(stplyr->whip); + boolean hasboost = (stplyr->itemamount && ( stplyr->itemtype == KITEM_SNEAKER || stplyr->itemtype == KITEM_INVINCIBILITY || stplyr->itemtype == KITEM_ROCKETSNEAKER @@ -495,7 +497,7 @@ std::optional object_tooltip(const mobj_t* mobj) ) ) || stplyr->rocketsneakertimer; - if (mobj->player == stplyr && (offroadwarning || hitwarning)) + if (mobj->player == stplyr && (offroadwarning || hitwarning) && !mobj->hitlag && !whipping) { if (offroadwarning) {