From 609b0c0ae00ad8b312646690c079c4abd78a48ed Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 30 Jun 2023 00:46:52 -0700 Subject: [PATCH 1/5] MT_FLOATINGITEM: check P_PlayerInPain before picking up power-ups --- src/p_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_inter.c b/src/p_inter.c index ef7e9367a..cc5f2a5ea 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -335,7 +335,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) case MT_FLOATINGITEM: // SRB2Kart if (special->threshold >= FIRSTPOWERUP) { - if (player->flashing || player->tumbleBounces > 0) + if (P_PlayerInPain(player)) return; K_GivePowerUp(player, special->threshold, special->movecount); From d4b0ee21aba4284f22224ba75ad3ae2a4bb865d8 Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 30 Jun 2023 00:47:14 -0700 Subject: [PATCH 2/5] Don't Guard Break if other player is in pain state --- src/k_kart.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 818d4d597..ae8f17b1c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3769,6 +3769,9 @@ void K_DoGuardBreak(mobj_t *t1, mobj_t *t2) { if (!(t1->player && t2->player)) return; + if (P_PlayerInPain(t2->player)) + return; + // short-circuit instashield for vfx visibility t1->player->instaShieldCooldown = GUARDBREAK_COOLDOWN; t1->player->guardCooldown = GUARDBREAK_COOLDOWN; From 5d4ec59a334ac338117e6765096d20cdbdd388cc Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 30 Jun 2023 00:48:08 -0700 Subject: [PATCH 3/5] K_DropPowerUps: refactor to use more lambdas --- src/k_powerup.cpp | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/k_powerup.cpp b/src/k_powerup.cpp index 84a1e27f3..59c95170b 100644 --- a/src/k_powerup.cpp +++ b/src/k_powerup.cpp @@ -82,28 +82,21 @@ void K_GivePowerUp(player_t* player, kartitems_t powerup, tic_t time) void K_DropPowerUps(player_t* player) { - auto simple_drop = [player](kartitems_t powerup, auto& timer) + auto drop = [player](kartitems_t powerup, auto callback) { tic_t remaining = K_PowerUpRemaining(player, powerup); if (remaining) { K_DropPaperItem(player, powerup, remaining); - timer = 0; + callback(); } }; - simple_drop(POWERUP_SMONITOR, player->powerup.superTimer); - simple_drop(POWERUP_BARRIER, player->powerup.barrierTimer); - simple_drop(POWERUP_BADGE, player->powerup.rhythmBadgeTimer); + auto& powerup = player->powerup; - if (K_PowerUpRemaining(player, POWERUP_SUPERFLICKY)) - { - mobj_t* swarm = player->powerup.flickyController; - - // Be sure to measure the remaining time before ending the power-up - K_DropPaperItem(player, POWERUP_SUPERFLICKY, Obj_SuperFlickySwarmTime(swarm)); - - Obj_EndSuperFlickySwarm(swarm); - } + drop(POWERUP_SMONITOR, [&] { powerup.superTimer = 0; }); + drop(POWERUP_BARRIER, [&] { powerup.barrierTimer = 0; }); + drop(POWERUP_BADGE, [&] { powerup.rhythmBadgeTimer = 0; }); + drop(POWERUP_SUPERFLICKY, [&] { Obj_EndSuperFlickySwarm(powerup.flickyController); }); } From e03e1aff0cb240458ce45fb2b62e78de2a5f0999 Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 30 Jun 2023 00:48:39 -0700 Subject: [PATCH 4/5] K_DropPowerUps: remove invincibilitytimer along with "S" --- src/k_powerup.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/k_powerup.cpp b/src/k_powerup.cpp index 59c95170b..3d1fcb312 100644 --- a/src/k_powerup.cpp +++ b/src/k_powerup.cpp @@ -1,5 +1,7 @@ /// \brief Battle mode power-up code +#include + #include "k_kart.h" #include "k_objects.h" #include "k_powerup.h" @@ -95,7 +97,15 @@ void K_DropPowerUps(player_t* player) auto& powerup = player->powerup; - drop(POWERUP_SMONITOR, [&] { powerup.superTimer = 0; }); + drop( + POWERUP_SMONITOR, [&] + { + // P_CheckInvincibilityTimer needs 1 tic to end the music + player->invincibilitytimer -= std::min(+powerup.superTimer, player->invincibilitytimer - 1); + powerup.superTimer = 0; + } + ); + drop(POWERUP_BARRIER, [&] { powerup.barrierTimer = 0; }); drop(POWERUP_BADGE, [&] { powerup.rhythmBadgeTimer = 0; }); drop(POWERUP_SUPERFLICKY, [&] { Obj_EndSuperFlickySwarm(powerup.flickyController); }); From 4c30b8458810771b60ff2a5ea6d5fb41d7ca5744 Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 30 Jun 2023 01:23:37 -0700 Subject: [PATCH 5/5] Fix "S" extending invincibility timer on hit --- src/p_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_inter.c b/src/p_inter.c index cc5f2a5ea..66fb52051 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2424,7 +2424,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da { // Extend the invincibility if the hit was a direct hit. if (inflictor == source && source->player->invincibilitytimer && - !K_PowerUpRemaining(player, POWERUP_SMONITOR)) + !K_PowerUpRemaining(source->player, POWERUP_SMONITOR)) { tic_t kinvextend;