From bfda33953814e055a172078ad2deebe5f4f6419d Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Sun, 24 Aug 2025 03:35:15 -0400 Subject: [PATCH 1/2] Extended Insta-Whip punish window --- src/k_collide.cpp | 4 ++++ src/k_kart.c | 4 ++-- src/p_enemy.c | 7 ++++--- src/p_inter.c | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 0eecf4c88..8f8c42586 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -1054,6 +1054,10 @@ boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim) attackerPlayer->roundconditions.checkthisframe = true; } + // Remove extended whip recovery from the attacker + if (attackerPlayer->defenseLockout > PUNISHWINDOW) + attackerPlayer->defenseLockout -= PUNISHWINDOW; + return true; } return false; diff --git a/src/k_kart.c b/src/k_kart.c index 9ae9c4eab..8d254c9de 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -14281,7 +14281,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) // which is allowed during painstate as a last-ditch defensive option. if (player && player->mo && player->mo->health > 0 && !player->spectator && !mapreset && leveltime > introtime) { - boolean chargingwhip = (cmd->buttons & BT_ATTACK) && (player->rings <= 0) && (!player->instaWhipChargeLockout) && (!player->itemRoulette.active); + boolean chargingwhip = (cmd->buttons & BT_ATTACK) && (player->rings <= 0) && (!player->instaWhipChargeLockout) && (player->defenseLockout <= PUNISHWINDOW) && (!player->itemRoulette.active); boolean releasedwhip = (!(cmd->buttons & BT_ATTACK)) && (player->rings <= 0 && player->instaWhipCharge) && !(P_PlayerInPain(player)); if (K_PowerUpRemaining(player, POWERUP_BADGE)) @@ -14357,7 +14357,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->instaWhipCharge = 0; if (!K_PowerUpRemaining(player, POWERUP_BARRIER)) { - player->defenseLockout = PUNISHWINDOW; + player->defenseLockout = 2*PUNISHWINDOW; } S_StartSound(player->mo, sfx_iwhp); diff --git a/src/p_enemy.c b/src/p_enemy.c index 017797b46..1b10dfe34 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3503,7 +3503,8 @@ void A_AttractChase(mobj_t *actor) if (actor->extravalue1 && actor->type != MT_EMERALD) // SRB2Kart { - if (!actor->target || P_MobjWasRemoved(actor->target) || !actor->target->player || actor->target->player->baildrop || actor->target->player->bailcharge) + if (!actor->target || P_MobjWasRemoved(actor->target) || !actor->target->player + || actor->target->player->baildrop || actor->target->player->bailcharge || actor->target->player->defenseLockout > PUNISHWINDOW) { P_RemoveMobj(actor); return; @@ -3526,7 +3527,7 @@ void A_AttractChase(mobj_t *actor) if (actor->target->player->rings <= 10 && P_IsDisplayPlayer(actor->target->player)) { - S_ReducedVFXSoundAtVolume(actor->target, sfx_gshab, + S_ReducedVFXSoundAtVolume(actor->target, sfx_gshab, 210 - 10*actor->target->player->rings , NULL); @@ -12212,7 +12213,7 @@ void A_BallhogExplode(mobj_t *actor) mo2->color = actor->target->color; mo2->colorized = true; } - + P_StartQuakeFromMobj(7, 50 * actor->scale, 1024 * actor->scale, actor); actor->fuse = 1; diff --git a/src/p_inter.c b/src/p_inter.c index 1d580e371..2d99bc229 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -731,7 +731,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (player->instaWhipCharge) return; - if (player->baildrop || player->bailcharge) + if (player->baildrop || player->bailcharge || player->defenseLockout > PUNISHWINDOW) return; // Don't immediately pick up spilled rings From 6d3ef37f9546c2e3e3ae5df8d154367555322a72 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Sun, 24 Aug 2025 18:36:16 -0400 Subject: [PATCH 2/2] Only apply instawhip extended punish if it totally whiffs --- src/k_collide.cpp | 6 ++---- src/p_map.c | 11 +++++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 8f8c42586..bd688a9bc 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -1054,10 +1054,6 @@ boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim) attackerPlayer->roundconditions.checkthisframe = true; } - // Remove extended whip recovery from the attacker - if (attackerPlayer->defenseLockout > PUNISHWINDOW) - attackerPlayer->defenseLockout -= PUNISHWINDOW; - return true; } return false; @@ -1104,12 +1100,14 @@ boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim) if (K_TryPickMeUp(attacker, victim, true)) { shield->hitlag = attacker->hitlag; // players hitlag is handled in K_TryPickMeUp, and we need to set for the shield too + return true; } else { P_DamageMobj(victim, shield, attacker, 1, DMG_NORMAL); K_AddHitLag(attacker, attackerHitlag, false); shield->hitlag = attacker->hitlag; + return true; } } return false; diff --git a/src/p_map.c b/src/p_map.c index 69de72ee1..580f0438e 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -749,7 +749,14 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) return BMIT_CONTINUE; // overhead if (g_tm.thing->z + g_tm.thing->height < thing->z) return BMIT_CONTINUE; // underneath - K_InstaWhipCollide(g_tm.thing, thing); + + boolean hit = K_InstaWhipCollide(g_tm.thing, thing); + if (hit && g_tm.thing->target && !P_MobjWasRemoved(g_tm.thing->target) && g_tm.thing->target->player) + { + player_t *attacker = g_tm.thing->target->player; + if (attacker->defenseLockout > PUNISHWINDOW) + attacker->defenseLockout -= PUNISHWINDOW; + } return BMIT_CONTINUE; } @@ -4197,7 +4204,7 @@ static void P_BouncePlayerMove(mobj_t *mo, TryMoveResult_t *result) if (mo->eflags & MFE_VERTICALFLIP) mo->momz -= 40*mo->scale; else - mo->momz += 40*mo->scale; + mo->momz += 40*mo->scale; } mo->momx = tmxmove;