From 1a2a2df3835de15637185f96c225715304be09d2 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Tue, 9 Jan 2024 20:26:35 -0700 Subject: [PATCH] Refactor guard/whip cooldown checks --- src/d_player.h | 6 +++--- src/k_collide.cpp | 1 - src/k_kart.c | 47 +++++++++++++++++++++++------------------ src/k_kart.h | 4 +--- src/lua_playerlib.c | 16 +++++++------- src/objects/instawhip.c | 1 - src/p_saveg.c | 8 +++---- src/r_spritefx.cpp | 2 +- 8 files changed, 44 insertions(+), 41 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 2f27838bf..18b4864f8 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -951,9 +951,9 @@ struct player_t mobj_t *flickyAttacker; UINT8 instaWhipCharge; - UINT8 instaWhipCooldown; - UINT8 instaWhipChargeLockout; - UINT8 guardCooldown; + UINT8 defenseLockout; // Committed to universal attack/defense, make 'em vulnerable! No whip/guard. + UINT8 instaWhipChargeLockout; // Input safety + boolean oldGuard; UINT8 preventfailsafe; // Set when taking damage to prevent cheesing eggboxes diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 71b06cb9a..b9338e681 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -873,7 +873,6 @@ boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim) attackerPlayer->spindashboost = 0; attackerPlayer->sneakertimer = 0; attackerPlayer->instaWhipCharge = 0; - attackerPlayer->guardCooldown = GUARDBREAK_COOLDOWN; attackerPlayer->flashing = 0; // Localized broly for a local event. diff --git a/src/k_kart.c b/src/k_kart.c index 0054b2163..72ec73807 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1493,7 +1493,7 @@ static void K_UpdateDraft(player_t *player) } // Want to berserk attack? Get your speed FIRST. - if (player->instaWhipCharge >= INSTAWHIP_TETHERBLOCK || player->instaWhipCooldown) + if (player->instaWhipCharge >= INSTAWHIP_TETHERBLOCK || player->defenseLockout) return; // Not enough speed to draft. @@ -3827,7 +3827,6 @@ void K_DoGuardBreak(mobj_t *t1, mobj_t *t2) { return; t1->player->instaWhipCharge = 0; - t1->player->guardCooldown = GUARDBREAK_COOLDOWN; S_StartSound(t1, sfx_gbrk); K_AddHitLag(t1, 24, true); @@ -8559,8 +8558,20 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->powerup.superTimer--; } - if (player->guardCooldown) - player->guardCooldown--; + if (K_PlayerGuard(player)) + { + if (!player->oldGuard) + S_StartSound(player->mo, sfx_s1af); + + player->oldGuard = true; + player->instaWhipCharge = 0; + } + else if (player->oldGuard) + { + CONS_Printf("DL set from oldGuard\n"); + player->defenseLockout = PUNISHWINDOW; + player->oldGuard = false; + } if (player->startboost > 0 && onground == true) { @@ -8716,18 +8727,10 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->justbumped > 0) player->justbumped--; - if (K_PressingEBrake(player) == true && onground) - { - if (gametyperules & GTR_BUMPERS) - player->instaWhipCooldown = INSTAWHIP_DROPGUARD; // Delay whip out of spindash and guard. - else - player->instaWhipCharge = 0; // Not that important in race, avoid black flash. - } - - if (player->instaWhipCooldown) + if (player->defenseLockout) { player->instaWhipCharge = 0; - player->instaWhipCooldown--; + player->defenseLockout--; } if (player->dotrickfx && !player->mo->hitlag) @@ -8819,7 +8822,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->incontrol = max(player->incontrol, -5*TICRATE); if (P_PlayerInPain(player) || player->respawn.state != RESPAWNST_NONE) + { player->lastpickuptype = -1; // got your ass beat, go grab anything + player->defenseLockout = 0; // and reenable defensive tools just in case + } + if (player->tumbleBounces > 0) { @@ -10758,7 +10765,7 @@ boolean K_PlayerEBrake(const player_t *player) boolean K_PlayerGuard(const player_t *player) { - if (player->guardCooldown != 0) + if (player->defenseLockout != 0) { return false; } @@ -11610,10 +11617,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } chargingwhip = false; - player->instaWhipCooldown = 0; } - if (leveltime < starttime || player->itemflags & (IF_ITEMOUT|IF_EGGMANOUT) || player->rocketsneakertimer || player->instaWhipCooldown) + if (leveltime < starttime || player->itemflags & (IF_ITEMOUT|IF_EGGMANOUT) || player->rocketsneakertimer || (player->defenseLockout && !K_PowerUpRemaining(player, POWERUP_BADGE))) { chargingwhip = false; player->instaWhipCharge = 0; @@ -11654,12 +11660,13 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else { + CONS_Printf("DL set from whip release\n"); + player->instaWhipCharge = 0; - player->instaWhipCooldown = INSTAWHIP_COOLDOWN; - player->guardCooldown = INSTAWHIP_DROPGUARD; + player->defenseLockout = PUNISHWINDOW; if (!K_PowerUpRemaining(player, POWERUP_BARRIER)) { - player->guardCooldown = INSTAWHIP_CHARGETIME; + player->defenseLockout = INSTAWHIP_CHARGETIME; } S_StartSound(player->mo, sfx_iwhp); diff --git a/src/k_kart.h b/src/k_kart.h index b9fbd46d2..73a80694d 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -31,13 +31,11 @@ Make sure this matches the actual number of states #define INSTAWHIP_DURATION (12) #define INSTAWHIP_CHARGETIME (3*TICRATE/4) -#define INSTAWHIP_COOLDOWN (5*TICRATE/4) -#define INSTAWHIP_DROPGUARD (12) #define INSTAWHIP_RINGDRAINEVERY (TICRATE/2) #define INSTAWHIP_HOLD_DELAY (TICRATE*2) // MUST be longer or equal to INSTAWHIP_CHARGETIME. #define INSTAWHIP_TETHERBLOCK (TICRATE*4) -#define GUARDBREAK_COOLDOWN (TICRATE*4) +#define PUNISHWINDOW (7*TICRATE/10) #define FLAMESHIELD_MAX (120) diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index e7d603c6f..ce981bd51 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -347,10 +347,10 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->lastsafelap); else if (fastcmp(field,"instaWhipCharge")) lua_pushinteger(L, plr->instaWhipCharge); - else if (fastcmp(field,"instaWhipCooldown")) - lua_pushinteger(L, plr->instaWhipCooldown); - else if (fastcmp(field,"guardCooldown")) - lua_pushinteger(L, plr->guardCooldown); + else if (fastcmp(field,"defenseLockout")) + lua_pushinteger(L, plr->defenseLockout); + else if (fastcmp(field,"oldGuard")) + lua_pushinteger(L, plr->oldGuard); else if (fastcmp(field,"preventfailsafe")) lua_pushinteger(L, plr->preventfailsafe); /* @@ -849,10 +849,10 @@ static int player_set(lua_State *L) plr->lastsafelap = luaL_checkinteger(L, 3); else if (fastcmp(field,"instaWhipCharge")) plr->instaWhipCharge = luaL_checkinteger(L, 3); - else if (fastcmp(field,"instaWhipCooldown")) - plr->instaWhipCharge = luaL_checkinteger(L, 3); - else if (fastcmp(field,"guardCooldown")) - plr->guardCooldown = luaL_checkinteger(L, 3); + else if (fastcmp(field,"defenseLockout")) + plr->defenseLockout = luaL_checkinteger(L, 3); + else if (fastcmp(field,"oldGuard")) + plr->oldGuard = luaL_checkinteger(L, 3); else if (fastcmp(field,"preventfailsafe")) plr->preventfailsafe = luaL_checkinteger(L, 3); /* diff --git a/src/objects/instawhip.c b/src/objects/instawhip.c index 377ace438..95d6d3e50 100644 --- a/src/objects/instawhip.c +++ b/src/objects/instawhip.c @@ -2,7 +2,6 @@ #include "../info.h" #include "../k_objects.h" #include "../p_local.h" -#include "../k_kart.h" // INSTAWHIP_COOLDOWN #define recharge_target(o) ((o)->target) #define recharge_offset(o) ((o)->movedir) diff --git a/src/p_saveg.c b/src/p_saveg.c index 88bb493d7..0cd3e1a6c 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -574,8 +574,8 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEMEM(save->p, players[i].public_key, PUBKEYLENGTH); WRITEUINT8(save->p, players[i].instaWhipCharge); - WRITEUINT8(save->p, players[i].instaWhipCooldown); - WRITEUINT8(save->p, players[i].guardCooldown); + WRITEUINT8(save->p, players[i].defenseLockout); + WRITEUINT8(save->p, players[i].oldGuard); WRITEUINT8(save->p, players[i].preventfailsafe); @@ -1135,8 +1135,8 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) READMEM(save->p, players[i].public_key, PUBKEYLENGTH); players[i].instaWhipCharge = READUINT8(save->p); - players[i].instaWhipCooldown = READUINT8(save->p); - players[i].guardCooldown = READUINT8(save->p); + players[i].defenseLockout = READUINT8(save->p); + players[i].oldGuard = READUINT8(save->p); players[i].preventfailsafe = READUINT8(save->p); diff --git a/src/r_spritefx.cpp b/src/r_spritefx.cpp index 35c7d0d02..9eac77188 100644 --- a/src/r_spritefx.cpp +++ b/src/r_spritefx.cpp @@ -23,7 +23,7 @@ INT32 R_ThingLightLevel(mobj_t* thing) if (player) { - if ((player->instaWhipCharge || player->instaWhipCooldown) && !player->whip && (leveltime & 1)) + if ((player->instaWhipCharge || player->defenseLockout) && !player->whip && (leveltime & 1)) { // Darken on every other frame of instawhip cooldown lightlevel -= 128;