From a9ec1cea684eb83d57a89f5853e7ae15285cfb09 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 02:23:28 -0700 Subject: [PATCH 01/19] WIP: Instawhip charge input --- src/d_player.h | 3 +- src/k_botitem.c | 2 +- src/k_collide.cpp | 2 +- src/k_kart.c | 101 ++++++++++++++++++++++++---------------- src/k_kart.h | 2 +- src/lua_playerlib.c | 8 ++-- src/objects/instawhip.c | 5 +- src/p_enemy.c | 2 + src/p_inter.c | 17 ++++++- src/p_local.h | 1 + src/p_saveg.c | 4 +- src/r_spritefx.cpp | 2 +- 12 files changed, 96 insertions(+), 53 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 89161e23c..b7d1d9456 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -857,7 +857,8 @@ struct player_t mobj_t *hand; mobj_t *flickyAttacker; - UINT8 instaShieldCooldown; + UINT8 instaWhipCharge; + UINT8 instaWhipChargeLockout; UINT8 guardCooldown; UINT8 handtimer; diff --git a/src/k_botitem.c b/src/k_botitem.c index 98fcc44d9..c483afdb5 100644 --- a/src/k_botitem.c +++ b/src/k_botitem.c @@ -1415,7 +1415,7 @@ static void K_BotItemInstashield(player_t *player, ticcmd_t *cmd) return; } - if (player->instaShieldCooldown || leveltime < starttime || player->spindash) + if (player->instaWhipCharge || leveltime < starttime || player->spindash) { // Instashield is on cooldown. return; diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 41740137e..5afd75d18 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -869,7 +869,7 @@ boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim) attacker->renderflags &= ~RF_DONTDRAW; attackerPlayer->spindashboost = 0; attackerPlayer->sneakertimer = 0; - attackerPlayer->instaShieldCooldown = GUARDBREAK_COOLDOWN; + attackerPlayer->instaWhipCharge = GUARDBREAK_COOLDOWN; attackerPlayer->guardCooldown = GUARDBREAK_COOLDOWN; attackerPlayer->flashing = 0; diff --git a/src/k_kart.c b/src/k_kart.c index 65f7baf2b..fe3bf34de 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1410,7 +1410,7 @@ static void K_UpdateDraft(player_t *player) } // Opportunity cost for berserk attacking. Get your slingshot speed first! - if (player->instaShieldCooldown && player->rings <= 0) + if (player->instaWhipCharge && player->rings <= 0) return; // Not enough speed to draft. @@ -3692,7 +3692,7 @@ void K_DoGuardBreak(mobj_t *t1, mobj_t *t2) { return; // short-circuit instashield for vfx visibility - t1->player->instaShieldCooldown = GUARDBREAK_COOLDOWN; + t1->player->instaWhipCharge = GUARDBREAK_COOLDOWN; t1->player->guardCooldown = GUARDBREAK_COOLDOWN; S_StartSound(t1, sfx_gbrk); @@ -8136,30 +8136,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->gateBoost) player->gateBoost--; - if (leveltime < starttime) - { - player->instaShieldCooldown = (gametyperules & GTR_SPHERES) ? INSTAWHIP_STARTOFBATTLE : INSTAWHIP_STARTOFRACE; - } - else if (player->rings > 0) - { - if (player->instaShieldCooldown > INSTAWHIP_COOLDOWN) - player->instaShieldCooldown--; - else - player->instaShieldCooldown = INSTAWHIP_COOLDOWN; - } - else - { - if (player->instaShieldCooldown) - { - player->instaShieldCooldown--; - if (!P_IsObjectOnGround(player->mo)) - player->instaShieldCooldown = max(player->instaShieldCooldown, 1); - } - } - if (player->powerup.rhythmBadgeTimer > 0) { - player->instaShieldCooldown = min(player->instaShieldCooldown, 1); + player->instaWhipCharge = min(player->instaWhipCharge, 1); player->powerup.rhythmBadgeTimer--; } @@ -8291,6 +8270,14 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->justbumped > 0) player->justbumped--; + if (player->instaWhipChargeLockout) + player->instaWhipChargeLockout--; + if (!(player->cmd.buttons & BT_ATTACK)) // Deliberate Item button release, no need to protect you from lockout + player->instaWhipChargeLockout = 0; + + if (P_PlayerInPain(player)) + player->instaWhipCharge = 0; + if (player->tiregrease) { // Remove grease faster if players are moving slower; players that are recovering @@ -8448,9 +8435,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->pflags &= ~PF_DRIFTINPUT; } - if (K_PlayerGuard(player) && !K_PowerUpRemaining(player, POWERUP_BARRIER)) - player->instaShieldCooldown = max(player->instaShieldCooldown, INSTAWHIP_DROPGUARD); - // Roulette Code K_KartItemRoulette(player, cmd); @@ -10196,6 +10180,29 @@ boolean K_PlayerGuard(player_t *player) return true; } + // Ugh. Duplicating a lot of this because while Guard _superficially_ looks like it's + // restricted similarly to ebrake, it's actually _really_ bad if we can't guard after item bumps. + + if (player->respawn.state != RESPAWNST_NONE + && (player->respawn.init == true || player->respawn.fromRingShooter == true)) + { + return false; + } + + if (Obj_PlayerRingShooterFreeze(player) == true) + { + return false; + } + + if (K_PressingEBrake(player) == true + && (player->drift == 0 || P_IsObjectOnGround(player->mo) == false) + && P_PlayerInPain(player) == false + && player->spindashboost == 0 + && player->nocontrol == 0) + { + return false; + } + return (K_PlayerEBrake(player) && player->spheres > 0); } @@ -10994,16 +11001,38 @@ void K_MoveKartPlayer(player_t *player, boolean onground) // Ring boosting if (player->pflags & PF_USERINGS) { - if (ATTACK_IS_DOWN && player->rings <= 0) + boolean chargingwhip = (cmd->buttons & BT_ATTACK) && (player->rings <= 0) && (!player->instaWhipChargeLockout); + boolean releasedwhip = !(cmd->buttons & BT_ATTACK) && (player->rings <= 0 && player->instaWhipCharge); + + if (K_PowerUpRemaining(player, POWERUP_BADGE)) { - if (player->instaShieldCooldown || leveltime < starttime || player->spindash) + chargingwhip = false; + releasedwhip = (ATTACK_IS_DOWN && player->rings <= 0); + player->instaWhipCharge = INSTAWHIP_COOLDOWN; + } + + if (chargingwhip) + { + //CONS_Printf("charging %d\n", player->instaWhipCharge); + player->instaWhipCharge = min(player->instaWhipCharge + 1, INSTAWHIP_COOLDOWN + 1); + + if (player->instaWhipCharge == 1) + { + Obj_SpawnInstaWhipRecharge(player, 0); + Obj_SpawnInstaWhipRecharge(player, ANGLE_120); + Obj_SpawnInstaWhipRecharge(player, ANGLE_240); + } + } + else if (releasedwhip) + { + if (player->instaWhipCharge < INSTAWHIP_COOLDOWN || leveltime < starttime || player->spindash) { S_StartSound(player->mo, sfx_kc50); + player->instaWhipCharge = 0; } else { - player->instaShieldCooldown = INSTAWHIP_COOLDOWN; - + player->instaWhipCharge = 0; if (!K_PowerUpRemaining(player, POWERUP_BARRIER)) { player->guardCooldown = INSTAWHIP_COOLDOWN; @@ -11023,16 +11052,10 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { whip->flags2 |= MF2_AMBUSH; } - - if (!K_PowerUpRemaining(player, POWERUP_BADGE)) - { - // Spawn in triangle formation - Obj_SpawnInstaWhipRecharge(player, 0); - Obj_SpawnInstaWhipRecharge(player, ANGLE_120); - Obj_SpawnInstaWhipRecharge(player, ANGLE_240); - } } } + else + player->instaWhipCharge = 0; if ((cmd->buttons & BT_ATTACK) && !player->ringdelay && player->rings > 0) { diff --git a/src/k_kart.h b/src/k_kart.h index 9d3375c69..ef4b7a265 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -30,7 +30,7 @@ Make sure this matches the actual number of states #define SHRINK_PHYSICS_SCALE (3*FRACUNIT/4) #define INSTAWHIP_DURATION (12) -#define INSTAWHIP_COOLDOWN (TICRATE*2) +#define INSTAWHIP_COOLDOWN (5*TICRATE/4) #define INSTAWHIP_STARTOFRACE (255) #define INSTAWHIP_STARTOFBATTLE (1) #define INSTAWHIP_DROPGUARD (12) diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 9bb2be94b..40ad65561 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -329,8 +329,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->sliptideZipDelay); else if (fastcmp(field,"sliptideZipBoost")) lua_pushinteger(L, plr->sliptideZipBoost); - else if (fastcmp(field,"instaShieldCooldown")) - lua_pushinteger(L, plr->instaShieldCooldown); + else if (fastcmp(field,"instaWhipCharge")) + lua_pushinteger(L, plr->instaWhipCharge); else if (fastcmp(field,"guardCooldown")) lua_pushinteger(L, plr->guardCooldown); /* @@ -807,8 +807,8 @@ static int player_set(lua_State *L) plr->sliptideZipDelay = luaL_checkinteger(L, 3); else if (fastcmp(field,"sliptideZipBoost")) plr->sliptideZipBoost = luaL_checkinteger(L, 3); - else if (fastcmp(field,"instaShieldCooldown")) - plr->instaShieldCooldown = luaL_checkinteger(L, 3); + else if (fastcmp(field,"instaWhipCharge")) + plr->instaWhipCharge = luaL_checkinteger(L, 3); else if (fastcmp(field,"guardCooldown")) plr->guardCooldown = luaL_checkinteger(L, 3); /* diff --git a/src/objects/instawhip.c b/src/objects/instawhip.c index dc1e410ed..70e9ee05f 100644 --- a/src/objects/instawhip.c +++ b/src/objects/instawhip.c @@ -2,6 +2,7 @@ #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) @@ -49,7 +50,7 @@ void Obj_SpawnInstaWhipRecharge(player_t *player, angle_t angleOffset) { mobj_t *x = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_INSTAWHIP_RECHARGE); - x->tics = max(player->instaShieldCooldown - states[x->info->raisestate].tics, 0); + x->tics = max(INSTAWHIP_COOLDOWN - player->instaWhipCharge - states[x->info->raisestate].tics, 0); x->renderflags |= RF_SLOPESPLAT | RF_NOSPLATBILLBOARD; P_SetTarget(&recharge_target(x), player->mo); @@ -60,7 +61,7 @@ void Obj_InstaWhipRechargeThink(mobj_t *x) { mobj_t *target = recharge_target(x); - if (P_MobjWasRemoved(target)) + if (P_MobjWasRemoved(target) || !target->player->instaWhipCharge) { P_RemoveMobj(x); return; diff --git a/src/p_enemy.c b/src/p_enemy.c index 084ccb169..cad9b9f5c 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3856,6 +3856,8 @@ void A_AttractChase(mobj_t *actor) else S_StartSoundAtVolume(actor->target, sfx_s227, actor->target->player->ringvolume); + actor->target->player->instaWhipChargeLockout = 10; + actor->target->player->ringvolume -= RINGVOLUMECOLLECTPENALTY; actor->target->player->pickuprings--; diff --git a/src/p_inter.c b/src/p_inter.c index aa25a087b..89567b184 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -108,6 +108,15 @@ void P_RampConstant(const BasicFF_t *FFInfo, INT32 Start, INT32 End) // GET STUFF // +boolean P_Whipping(player_t *player) +{ + if (player->instaWhipCharge) + return true; + if (player->whip && !P_MobjWasRemoved(player->whip)) + return true; + return false; +} + // // P_CanPickupItem // @@ -115,7 +124,7 @@ void P_RampConstant(const BasicFF_t *FFInfo, INT32 Start, INT32 End) // boolean P_CanPickupItem(player_t *player, UINT8 weapon) { - if (player->exiting || mapreset || (player->pflags & PF_ELIMINATED) || player->itemRoulette.reserved) + if (player->exiting || mapreset || (player->pflags & PF_ELIMINATED) || player->itemRoulette.reserved || P_Whipping(player)) return false; // 0: Sphere/Ring @@ -438,6 +447,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) case KITEM_SUPERRING: if (player->pflags & PF_RINGLOCK) // no cheaty rings return; + if (player->instaWhipCharge) + return; break; default: if (!P_CanPickupItem(player, 1)) @@ -635,6 +646,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (player->pflags & PF_RINGLOCK) return; + // Prepping instawhip? Don't ruin it by collecting rings + if (player->instaWhipCharge) + return; + // Don't immediately pick up spilled rings if (special->threshold > 0 || P_PlayerInPain(player) || player->spindash) // player->spindash: Otherwise, players can pick up rings that are thrown out of them from invinc spindash penalty return; diff --git a/src/p_local.h b/src/p_local.h index 15b338f9d..ef6964bc5 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -544,6 +544,7 @@ void P_CheckTimeLimit(void); void P_CheckPointLimit(void); boolean P_CheckRacers(void); +boolean P_Whipping(player_t *player); boolean P_CanPickupItem(player_t *player, UINT8 weapon); boolean P_IsPickupCheesy(player_t *player, UINT8 type); void P_UpdateLastPickup(player_t *player, UINT8 type); diff --git a/src/p_saveg.c b/src/p_saveg.c index edf502fdf..284fabac3 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -541,7 +541,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEMEM(save->p, players[i].public_key, PUBKEYLENGTH); - WRITEUINT8(save->p, players[i].instaShieldCooldown); + WRITEUINT8(save->p, players[i].instaWhipCharge); WRITEUINT8(save->p, players[i].guardCooldown); WRITEUINT8(save->p, players[i].handtimer); @@ -1051,7 +1051,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) READMEM(save->p, players[i].public_key, PUBKEYLENGTH); - players[i].instaShieldCooldown = READUINT8(save->p); + players[i].instaWhipCharge = READUINT8(save->p); players[i].guardCooldown = READUINT8(save->p); players[i].handtimer = READUINT8(save->p); diff --git a/src/r_spritefx.cpp b/src/r_spritefx.cpp index 0664819ff..31b7260c8 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->instaShieldCooldown && !player->whip && (player->rings <= 0) && (leveltime & 1)) + if (player->instaWhipCharge && !player->whip && (player->rings <= 0) && (leveltime & 1)) { // Darken on every other frame of instawhip cooldown lightlevel -= 128; From 3e5a5baf50b6650ce2b81501834430fbd6404999 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 02:48:28 -0700 Subject: [PATCH 02/19] Charge instawhip QoL --- src/k_kart.c | 21 ++++++++++++++------- src/p_enemy.c | 2 -- src/p_inter.c | 6 +++++- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index fe3bf34de..b3a6b45f7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1409,8 +1409,8 @@ static void K_UpdateDraft(player_t *player) leniency *= 4; } - // Opportunity cost for berserk attacking. Get your slingshot speed first! - if (player->instaWhipCharge && player->rings <= 0) + // Want to berserk attack? Get your speed FIRST. + if (player->instaWhipCharge) return; // Not enough speed to draft. @@ -8137,10 +8137,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->gateBoost--; if (player->powerup.rhythmBadgeTimer > 0) - { - player->instaWhipCharge = min(player->instaWhipCharge, 1); player->powerup.rhythmBadgeTimer--; - } if (player->powerup.barrierTimer > 0) { @@ -8270,8 +8267,12 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->justbumped > 0) player->justbumped--; + // Don't screw up chain ring pickup/usage with instawhip charge. + // If the button stays held, delay charge a bit. if (player->instaWhipChargeLockout) player->instaWhipChargeLockout--; + if (player->rings > 0) + player->instaWhipChargeLockout = TICRATE/2; if (!(player->cmd.buttons & BT_ATTACK)) // Deliberate Item button release, no need to protect you from lockout player->instaWhipChargeLockout = 0; @@ -11002,7 +11003,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->pflags & PF_USERINGS) { boolean chargingwhip = (cmd->buttons & BT_ATTACK) && (player->rings <= 0) && (!player->instaWhipChargeLockout); - boolean releasedwhip = !(cmd->buttons & BT_ATTACK) && (player->rings <= 0 && player->instaWhipCharge); + boolean releasedwhip = (!(cmd->buttons & BT_ATTACK)) && (player->rings <= 0 && player->instaWhipCharge); if (K_PowerUpRemaining(player, POWERUP_BADGE)) { @@ -11011,6 +11012,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->instaWhipCharge = INSTAWHIP_COOLDOWN; } + if (leveltime < starttime || player->spindash) + { + chargingwhip = false; + player->instaWhipCharge = 0; + } + if (chargingwhip) { //CONS_Printf("charging %d\n", player->instaWhipCharge); @@ -11025,7 +11032,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else if (releasedwhip) { - if (player->instaWhipCharge < INSTAWHIP_COOLDOWN || leveltime < starttime || player->spindash) + if (player->instaWhipCharge < INSTAWHIP_COOLDOWN) { S_StartSound(player->mo, sfx_kc50); player->instaWhipCharge = 0; diff --git a/src/p_enemy.c b/src/p_enemy.c index cad9b9f5c..084ccb169 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3856,8 +3856,6 @@ void A_AttractChase(mobj_t *actor) else S_StartSoundAtVolume(actor->target, sfx_s227, actor->target->player->ringvolume); - actor->target->player->instaWhipChargeLockout = 10; - actor->target->player->ringvolume -= RINGVOLUMECOLLECTPENALTY; actor->target->player->pickuprings--; diff --git a/src/p_inter.c b/src/p_inter.c index 89567b184..6d8d47ed6 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -124,13 +124,17 @@ boolean P_Whipping(player_t *player) // boolean P_CanPickupItem(player_t *player, UINT8 weapon) { - if (player->exiting || mapreset || (player->pflags & PF_ELIMINATED) || player->itemRoulette.reserved || P_Whipping(player)) + if (player->exiting || mapreset || (player->pflags & PF_ELIMINATED) || player->itemRoulette.reserved) return false; // 0: Sphere/Ring // 1: Random Item / Capsule // 2: Eggbox // 3: Paperitem + + if (weapon != 2 && P_Whipping(player)) + return false; + if (weapon) { // Item slot already taken up From 6ae427447c24476ce6938816a3be7e0085254576 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 03:03:23 -0700 Subject: [PATCH 03/19] No stored whip after Gachabom rebound collect --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index b3a6b45f7..e3135aa7f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8276,7 +8276,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (!(player->cmd.buttons & BT_ATTACK)) // Deliberate Item button release, no need to protect you from lockout player->instaWhipChargeLockout = 0; - if (P_PlayerInPain(player)) + if (P_PlayerInPain(player) || player->itemamount) player->instaWhipCharge = 0; if (player->tiregrease) From 8fced1890b69dce2ce6826131ca646e26f882856 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 03:16:54 -0700 Subject: [PATCH 04/19] Fix up guard conditions --- src/k_kart.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index e3135aa7f..7bb18a7c7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10181,6 +10181,9 @@ boolean K_PlayerGuard(player_t *player) return true; } + if (player->spheres == 0) + return false; + // Ugh. Duplicating a lot of this because while Guard _superficially_ looks like it's // restricted similarly to ebrake, it's actually _really_ bad if we can't guard after item bumps. @@ -10201,10 +10204,10 @@ boolean K_PlayerGuard(player_t *player) && player->spindashboost == 0 && player->nocontrol == 0) { - return false; + return true; } - return (K_PlayerEBrake(player) && player->spheres > 0); + return false; } SINT8 K_Sliptiding(player_t *player) @@ -11040,6 +11043,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else { player->instaWhipCharge = 0; + player->guardCooldown = INSTAWHIP_DROPGUARD; if (!K_PowerUpRemaining(player, POWERUP_BARRIER)) { player->guardCooldown = INSTAWHIP_COOLDOWN; From 85641036ea0faba9416324f692e382906987a9ac Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 03:19:24 -0700 Subject: [PATCH 05/19] Clean up whip/guard timing defs --- src/k_kart.c | 3 +-- src/k_kart.h | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 7bb18a7c7..19bf552e3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3691,8 +3691,7 @@ void K_DoGuardBreak(mobj_t *t1, mobj_t *t2) { if (P_PlayerInPain(t2->player)) return; - // short-circuit instashield for vfx visibility - t1->player->instaWhipCharge = GUARDBREAK_COOLDOWN; + t1->player->instaWhipCharge = 0; t1->player->guardCooldown = GUARDBREAK_COOLDOWN; S_StartSound(t1, sfx_gbrk); diff --git a/src/k_kart.h b/src/k_kart.h index ef4b7a265..1aeb16768 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -31,8 +31,6 @@ Make sure this matches the actual number of states #define INSTAWHIP_DURATION (12) #define INSTAWHIP_COOLDOWN (5*TICRATE/4) -#define INSTAWHIP_STARTOFRACE (255) -#define INSTAWHIP_STARTOFBATTLE (1) #define INSTAWHIP_DROPGUARD (12) #define GUARDBREAK_COOLDOWN (TICRATE*4) From f36e699398f6a77f164b36f7ee4e3a154168220f Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 17:09:25 -0700 Subject: [PATCH 06/19] Instawhip reject vfx first pass --- src/info.c | 2 +- src/k_kart.c | 31 +++++++++++++++++++++++++++++++ src/k_objects.h | 2 ++ src/objects/instawhip.c | 22 ++++++++++++++++++++++ src/p_mobj.c | 10 ++++++++++ src/sounds.c | 4 ++++ src/sounds.h | 3 +++ 7 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/info.c b/src/info.c index e8750b76b..b6429ee79 100644 --- a/src/info.c +++ b/src/info.c @@ -4076,7 +4076,7 @@ state_t states[NUMSTATES] = {SPR_NULL, 0, 0, {A_PlaySound}, sfx_s3ka0, 2, S_INSTAWHIP_RECHARGE3}, // S_INSTAWHIP_RECHARGE2 {SPR_WPRE, FF_FULLBRIGHT|FF_FLOORSPRITE|FF_ANIMATE|0, 36, {NULL}, 17, 2, S_INSTAWHIP_RECHARGE4}, // S_INSTAWHIP_RECHARGE3 {SPR_NULL, 0, 0, {A_PlaySound}, sfx_s3k7c, 2, S_NULL}, // S_INSTAWHIP_RECHARGE4 - {SPR_WPRJ, FF_ANIMATE, 9, {NULL}, 8, 1, S_NULL}, // S_INSTAWHIP_REJECT + {SPR_WPRJ, FF_ANIMATE, 9, {NULL}, 8, 1, S_INSTAWHIP_REJECT}, // S_INSTAWHIP_REJECT {SPR_GRNG, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_BLOCKRING {SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY diff --git a/src/k_kart.c b/src/k_kart.c index 19bf552e3..9ec27955f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8275,6 +8275,26 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (!(player->cmd.buttons & BT_ATTACK)) // Deliberate Item button release, no need to protect you from lockout player->instaWhipChargeLockout = 0; + if (player->instaWhipCharge && player->instaWhipCharge < INSTAWHIP_COOLDOWN) + { + if (!S_SoundPlaying(player->mo, sfx_wchrg1)) + S_StartSound(player->mo, sfx_wchrg1); + } + else + { + S_StopSoundByID(player->mo, sfx_wchrg1); + } + + if (player->instaWhipCharge >= INSTAWHIP_COOLDOWN) + { + if (!S_SoundPlaying(player->mo, sfx_wchrg2)) + S_StartSound(player->mo, sfx_wchrg2); + } + else + { + S_StopSoundByID(player->mo, sfx_wchrg2); + } + if (P_PlayerInPain(player) || player->itemamount) player->instaWhipCharge = 0; @@ -11031,6 +11051,17 @@ void K_MoveKartPlayer(player_t *player, boolean onground) Obj_SpawnInstaWhipRecharge(player, ANGLE_120); Obj_SpawnInstaWhipRecharge(player, ANGLE_240); } + + if (player->instaWhipCharge == INSTAWHIP_COOLDOWN) + { + Obj_SpawnInstaWhipReject(player); + } + + if (player->instaWhipCharge > INSTAWHIP_COOLDOWN) + { + if (leveltime%(TICRATE/2) == 0) + P_PlayerRingBurst(player, 1); + } } else if (releasedwhip) { diff --git a/src/k_objects.h b/src/k_objects.h index c84ac5151..c88bf3320 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -118,6 +118,8 @@ boolean Obj_DropTargetMorphThink(mobj_t *morph); void Obj_InstaWhipThink(mobj_t *whip); void Obj_SpawnInstaWhipRecharge(player_t *player, angle_t angleOffset); void Obj_InstaWhipRechargeThink(mobj_t *mobj); +void Obj_SpawnInstaWhipReject(player_t *player); +void Obj_InstaWhipRejectThink(mobj_t *mobj); /* Block VFX */ void Obj_BlockRingThink(mobj_t *ring); diff --git a/src/objects/instawhip.c b/src/objects/instawhip.c index 70e9ee05f..e98c12cf2 100644 --- a/src/objects/instawhip.c +++ b/src/objects/instawhip.c @@ -74,3 +74,25 @@ void Obj_InstaWhipRechargeThink(mobj_t *x) // Flickers every other frame x->renderflags ^= RF_DONTDRAW; } + +void Obj_SpawnInstaWhipReject(player_t *player) +{ + mobj_t *x = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_INSTAWHIP_REJECT); + + P_SetTarget(&recharge_target(x), player->mo); +} + +void Obj_InstaWhipRejectThink(mobj_t *x) +{ + mobj_t *target = x->target; + + if (P_MobjWasRemoved(target) || !target->player->instaWhipCharge) + { + P_RemoveMobj(x); + return; + } + + x->angle = x->target->angle; + P_MoveOrigin(x, target->x, target->y, target->z); + P_InstaScale(x, target->scale); +} diff --git a/src/p_mobj.c b/src/p_mobj.c index 12fe75e93..09ec9f4f7 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8462,6 +8462,16 @@ static boolean P_MobjRegularThink(mobj_t *mobj) Obj_InstaWhipThink(mobj); break; } + case MT_INSTAWHIP_REJECT: + { + Obj_InstaWhipRejectThink(mobj); + + if (P_MobjWasRemoved(mobj)) + { + return false; + } + break; + } case MT_BLOCKRING: { Obj_BlockRingThink(mobj); diff --git a/src/sounds.c b/src/sounds.c index 08ee77df7..722f8416c 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -1191,6 +1191,10 @@ sfxinfo_t S_sfx[NUMSFX] = {"clawk1", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // SF_X8AWAYSOUND {"clawk2", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // SF_X8AWAYSOUND + // SRB2Kart - whip charge/hold + {"wchrg1", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // SF_X8AWAYSOUND + {"wchrg2", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // SF_X8AWAYSOUND + {"horn00", false, 255, 0, -1, NULL, 0, -1, -1, LUMPERROR, "/"}, // HORNCODE {"monch", false, 255, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"etexpl", false, 255, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Game crash"}, diff --git a/src/sounds.h b/src/sounds.h index edda75ead..a3329cf90 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -1261,6 +1261,9 @@ typedef enum sfx_clawk1, sfx_clawk2, + sfx_wchrg1, + sfx_wchrg2, + sfx_horn00, sfx_monch, sfx_etexpl, From 2a0f9da975ba0f2f7e44bc01c7cea2c4112e1cbb Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 17:36:06 -0700 Subject: [PATCH 07/19] More instawhip tuning cleanup --- src/k_kart.c | 26 +++++++++++++++----------- src/k_kart.h | 3 ++- src/objects/instawhip.c | 2 +- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9ec27955f..9c89535e2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8275,7 +8275,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (!(player->cmd.buttons & BT_ATTACK)) // Deliberate Item button release, no need to protect you from lockout player->instaWhipChargeLockout = 0; - if (player->instaWhipCharge && player->instaWhipCharge < INSTAWHIP_COOLDOWN) + if (player->instaWhipCharge && player->instaWhipCharge < INSTAWHIP_CHARGETIME) { if (!S_SoundPlaying(player->mo, sfx_wchrg1)) S_StartSound(player->mo, sfx_wchrg1); @@ -8285,7 +8285,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) S_StopSoundByID(player->mo, sfx_wchrg1); } - if (player->instaWhipCharge >= INSTAWHIP_COOLDOWN) + if (player->instaWhipCharge >= INSTAWHIP_CHARGETIME) { if (!S_SoundPlaying(player->mo, sfx_wchrg2)) S_StartSound(player->mo, sfx_wchrg2); @@ -8295,7 +8295,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) S_StopSoundByID(player->mo, sfx_wchrg2); } - if (P_PlayerInPain(player) || player->itemamount) + if (P_PlayerInPain(player) || player->itemamount || player->respawn.state != RESPAWNST_NONE) player->instaWhipCharge = 0; if (player->tiregrease) @@ -11031,7 +11031,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { chargingwhip = false; releasedwhip = (ATTACK_IS_DOWN && player->rings <= 0); - player->instaWhipCharge = INSTAWHIP_COOLDOWN; + player->instaWhipCharge = INSTAWHIP_CHARGETIME; } if (leveltime < starttime || player->spindash) @@ -11043,7 +11043,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (chargingwhip) { //CONS_Printf("charging %d\n", player->instaWhipCharge); - player->instaWhipCharge = min(player->instaWhipCharge + 1, INSTAWHIP_COOLDOWN + 1); + player->instaWhipCharge = min(player->instaWhipCharge + 1, INSTAWHIP_CHARGETIME + 1); if (player->instaWhipCharge == 1) { @@ -11052,20 +11052,24 @@ void K_MoveKartPlayer(player_t *player, boolean onground) Obj_SpawnInstaWhipRecharge(player, ANGLE_240); } - if (player->instaWhipCharge == INSTAWHIP_COOLDOWN) + if (player->instaWhipCharge == INSTAWHIP_CHARGETIME) { Obj_SpawnInstaWhipReject(player); } - if (player->instaWhipCharge > INSTAWHIP_COOLDOWN) + if (player->instaWhipCharge > INSTAWHIP_CHARGETIME) { - if (leveltime%(TICRATE/2) == 0) - P_PlayerRingBurst(player, 1); + if ((leveltime%(INSTAWHIP_RINGDRAINEVERY)) == 0 && !(gametyperules & GTR_SPHERES)) + { + if (player->rings > -20) + S_StartSound(player->mo, sfx_antiri); + player->rings--; + } } } else if (releasedwhip) { - if (player->instaWhipCharge < INSTAWHIP_COOLDOWN) + if (player->instaWhipCharge < INSTAWHIP_CHARGETIME) { S_StartSound(player->mo, sfx_kc50); player->instaWhipCharge = 0; @@ -11076,7 +11080,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->guardCooldown = INSTAWHIP_DROPGUARD; if (!K_PowerUpRemaining(player, POWERUP_BARRIER)) { - player->guardCooldown = INSTAWHIP_COOLDOWN; + player->guardCooldown = INSTAWHIP_CHARGETIME; } S_StartSound(player->mo, sfx_iwhp); diff --git a/src/k_kart.h b/src/k_kart.h index 1aeb16768..62d75e756 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -30,8 +30,9 @@ Make sure this matches the actual number of states #define SHRINK_PHYSICS_SCALE (3*FRACUNIT/4) #define INSTAWHIP_DURATION (12) -#define INSTAWHIP_COOLDOWN (5*TICRATE/4) +#define INSTAWHIP_CHARGETIME (5*TICRATE/4) #define INSTAWHIP_DROPGUARD (12) +#define INSTAWHIP_RINGDRAINEVERY (TICRATE/2) #define GUARDBREAK_COOLDOWN (TICRATE*4) #define FLAMESHIELD_MAX (120) diff --git a/src/objects/instawhip.c b/src/objects/instawhip.c index e98c12cf2..9236c525c 100644 --- a/src/objects/instawhip.c +++ b/src/objects/instawhip.c @@ -50,7 +50,7 @@ void Obj_SpawnInstaWhipRecharge(player_t *player, angle_t angleOffset) { mobj_t *x = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_INSTAWHIP_RECHARGE); - x->tics = max(INSTAWHIP_COOLDOWN - player->instaWhipCharge - states[x->info->raisestate].tics, 0); + x->tics = max(INSTAWHIP_CHARGETIME - player->instaWhipCharge - states[x->info->raisestate].tics, 0); x->renderflags |= RF_SLOPESPLAT | RF_NOSPLATBILLBOARD; P_SetTarget(&recharge_target(x), player->mo); From 22d09d8a4a970290402706d3389c57a5143db16f Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 18:05:40 -0700 Subject: [PATCH 08/19] No eggbox whip charge --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9c89535e2..00b1046b1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8295,7 +8295,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) S_StopSoundByID(player->mo, sfx_wchrg2); } - if (P_PlayerInPain(player) || player->itemamount || player->respawn.state != RESPAWNST_NONE) + if (player->itemamount || player->respawn.state != RESPAWNST_NONE || player->itemRoulette.eggman) player->instaWhipCharge = 0; if (player->tiregrease) From c41b8e97da16c80cfb8467596c2ba3a953b6c0f5 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 18:34:34 -0700 Subject: [PATCH 09/19] Fix instawhip charge lockout conditions --- src/k_kart.c | 164 ++++++++++++++++++++++++++------------------------- 1 file changed, 84 insertions(+), 80 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 00b1046b1..2f86301dd 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8270,8 +8270,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) // If the button stays held, delay charge a bit. if (player->instaWhipChargeLockout) player->instaWhipChargeLockout--; - if (player->rings > 0) - player->instaWhipChargeLockout = TICRATE/2; + if (player->rings > 0 || player->itemamount) + player->instaWhipChargeLockout = 3*TICRATE/4; if (!(player->cmd.buttons & BT_ATTACK)) // Deliberate Item button release, no need to protect you from lockout player->instaWhipChargeLockout = 0; @@ -11017,6 +11017,88 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } } + // This looks a lot like the check that's right under it, but this check is specifically for instawhip charge, + // 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); + boolean releasedwhip = (!(cmd->buttons & BT_ATTACK)) && (player->rings <= 0 && player->instaWhipCharge) && !(P_PlayerInPain(player)); + + if (K_PowerUpRemaining(player, POWERUP_BADGE)) + { + chargingwhip = false; + releasedwhip = (ATTACK_IS_DOWN && player->rings <= 0); + player->instaWhipCharge = INSTAWHIP_CHARGETIME; + } + + if (leveltime < starttime || player->spindash) + { + chargingwhip = false; + player->instaWhipCharge = 0; + } + + if (chargingwhip) + { + player->instaWhipCharge = min(player->instaWhipCharge + 1, INSTAWHIP_CHARGETIME + 1); + + if (player->instaWhipCharge == 1) + { + Obj_SpawnInstaWhipRecharge(player, 0); + Obj_SpawnInstaWhipRecharge(player, ANGLE_120); + Obj_SpawnInstaWhipRecharge(player, ANGLE_240); + } + + if (player->instaWhipCharge == INSTAWHIP_CHARGETIME) + { + Obj_SpawnInstaWhipReject(player); + } + + if (player->instaWhipCharge > INSTAWHIP_CHARGETIME) + { + if ((leveltime%(INSTAWHIP_RINGDRAINEVERY)) == 0 && !(gametyperules & GTR_SPHERES)) + { + if (player->rings > -20) + S_StartSound(player->mo, sfx_antiri); + player->rings--; + } + } + } + else if (releasedwhip) + { + if (player->instaWhipCharge < INSTAWHIP_CHARGETIME) + { + S_StartSound(player->mo, sfx_kc50); + player->instaWhipCharge = 0; + } + else + { + player->instaWhipCharge = 0; + player->guardCooldown = INSTAWHIP_DROPGUARD; + if (!K_PowerUpRemaining(player, POWERUP_BARRIER)) + { + player->guardCooldown = INSTAWHIP_CHARGETIME; + } + + S_StartSound(player->mo, sfx_iwhp); + mobj_t *whip = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_INSTAWHIP); + P_SetTarget(&player->whip, whip); + P_SetScale(whip, player->mo->scale); + P_SetTarget(&whip->target, player->mo); + K_MatchGenericExtraFlags(whip, player->mo); + P_SpawnFakeShadow(whip, 20); + whip->fuse = INSTAWHIP_DURATION; + player->flashing = max(player->flashing, INSTAWHIP_DURATION); + + if (P_IsObjectOnGround(player->mo)) + { + whip->flags2 |= MF2_AMBUSH; + } + } + } + else if (!(player->instaWhipCharge >= INSTAWHIP_CHARGETIME && P_PlayerInPain(player))) // Allow reversal whip + player->instaWhipCharge = 0; + } + if (player && player->mo && player->mo->health > 0 && !player->spectator && !P_PlayerInPain(player) && !mapreset && leveltime > introtime) { // First, the really specific, finicky items that function without the item being directly in your item slot. @@ -11024,84 +11106,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) // Ring boosting if (player->pflags & PF_USERINGS) { - boolean chargingwhip = (cmd->buttons & BT_ATTACK) && (player->rings <= 0) && (!player->instaWhipChargeLockout); - boolean releasedwhip = (!(cmd->buttons & BT_ATTACK)) && (player->rings <= 0 && player->instaWhipCharge); - - if (K_PowerUpRemaining(player, POWERUP_BADGE)) - { - chargingwhip = false; - releasedwhip = (ATTACK_IS_DOWN && player->rings <= 0); - player->instaWhipCharge = INSTAWHIP_CHARGETIME; - } - - if (leveltime < starttime || player->spindash) - { - chargingwhip = false; - player->instaWhipCharge = 0; - } - - if (chargingwhip) - { - //CONS_Printf("charging %d\n", player->instaWhipCharge); - player->instaWhipCharge = min(player->instaWhipCharge + 1, INSTAWHIP_CHARGETIME + 1); - - if (player->instaWhipCharge == 1) - { - Obj_SpawnInstaWhipRecharge(player, 0); - Obj_SpawnInstaWhipRecharge(player, ANGLE_120); - Obj_SpawnInstaWhipRecharge(player, ANGLE_240); - } - - if (player->instaWhipCharge == INSTAWHIP_CHARGETIME) - { - Obj_SpawnInstaWhipReject(player); - } - - if (player->instaWhipCharge > INSTAWHIP_CHARGETIME) - { - if ((leveltime%(INSTAWHIP_RINGDRAINEVERY)) == 0 && !(gametyperules & GTR_SPHERES)) - { - if (player->rings > -20) - S_StartSound(player->mo, sfx_antiri); - player->rings--; - } - } - } - else if (releasedwhip) - { - if (player->instaWhipCharge < INSTAWHIP_CHARGETIME) - { - S_StartSound(player->mo, sfx_kc50); - player->instaWhipCharge = 0; - } - else - { - player->instaWhipCharge = 0; - player->guardCooldown = INSTAWHIP_DROPGUARD; - if (!K_PowerUpRemaining(player, POWERUP_BARRIER)) - { - player->guardCooldown = INSTAWHIP_CHARGETIME; - } - - S_StartSound(player->mo, sfx_iwhp); - mobj_t *whip = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_INSTAWHIP); - P_SetTarget(&player->whip, whip); - P_SetScale(whip, player->mo->scale); - P_SetTarget(&whip->target, player->mo); - K_MatchGenericExtraFlags(whip, player->mo); - P_SpawnFakeShadow(whip, 20); - whip->fuse = INSTAWHIP_DURATION; - player->flashing = max(player->flashing, INSTAWHIP_DURATION); - - if (P_IsObjectOnGround(player->mo)) - { - whip->flags2 |= MF2_AMBUSH; - } - } - } - else - player->instaWhipCharge = 0; - if ((cmd->buttons & BT_ATTACK) && !player->ringdelay && player->rings > 0) { mobj_t *ring = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_RING); From 17a9d39877e0fec13544b6501d06aa2e99608f84 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 18:54:56 -0700 Subject: [PATCH 10/19] Fix final-ring whip charge delay edge case --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 2f86301dd..91441146b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8270,7 +8270,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) // If the button stays held, delay charge a bit. if (player->instaWhipChargeLockout) player->instaWhipChargeLockout--; - if (player->rings > 0 || player->itemamount) + if (player->rings > 0 || player->itemamount || player->ringdelay) player->instaWhipChargeLockout = 3*TICRATE/4; if (!(player->cmd.buttons & BT_ATTACK)) // Deliberate Item button release, no need to protect you from lockout player->instaWhipChargeLockout = 0; From 371314af806663d8e195904e8838dab65a065095 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 20:13:42 -0700 Subject: [PATCH 11/19] Small instawhip hitbox buff --- src/info.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/info.c b/src/info.c index b6429ee79..8a307def5 100644 --- a/src/info.c +++ b/src/info.c @@ -23003,8 +23003,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 90*FRACUNIT, // radius - 90*FRACUNIT, // height + 95*FRACUNIT, // radius + 95*FRACUNIT, // height 0, // display offset 100, // mass 0, // damage From 4d97c4b51fe137860a5c241aa6784baf93d656f3 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 20:51:03 -0700 Subject: [PATCH 12/19] Charge whip test fixups --- src/info.c | 2 +- src/k_kart.c | 2 +- src/sounds.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/info.c b/src/info.c index 8a307def5..394ddb6e9 100644 --- a/src/info.c +++ b/src/info.c @@ -4076,7 +4076,7 @@ state_t states[NUMSTATES] = {SPR_NULL, 0, 0, {A_PlaySound}, sfx_s3ka0, 2, S_INSTAWHIP_RECHARGE3}, // S_INSTAWHIP_RECHARGE2 {SPR_WPRE, FF_FULLBRIGHT|FF_FLOORSPRITE|FF_ANIMATE|0, 36, {NULL}, 17, 2, S_INSTAWHIP_RECHARGE4}, // S_INSTAWHIP_RECHARGE3 {SPR_NULL, 0, 0, {A_PlaySound}, sfx_s3k7c, 2, S_NULL}, // S_INSTAWHIP_RECHARGE4 - {SPR_WPRJ, FF_ANIMATE, 9, {NULL}, 8, 1, S_INSTAWHIP_REJECT}, // S_INSTAWHIP_REJECT + {SPR_WPRJ, FF_FULLBRIGHT|FF_ANIMATE, 9, {NULL}, 8, 1, S_INSTAWHIP_REJECT}, // S_INSTAWHIP_REJECT {SPR_GRNG, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_BLOCKRING {SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY diff --git a/src/k_kart.c b/src/k_kart.c index 91441146b..0a67c10d9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1410,7 +1410,7 @@ static void K_UpdateDraft(player_t *player) } // Want to berserk attack? Get your speed FIRST. - if (player->instaWhipCharge) + if (player->instaWhipCharge >= INSTAWHIP_CHARGETIME) return; // Not enough speed to draft. diff --git a/src/sounds.c b/src/sounds.c index 722f8416c..ebcda4cf9 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -1192,8 +1192,8 @@ sfxinfo_t S_sfx[NUMSFX] = {"clawk2", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // SF_X8AWAYSOUND // SRB2Kart - whip charge/hold - {"wchrg1", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // SF_X8AWAYSOUND - {"wchrg2", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // SF_X8AWAYSOUND + {"wchrg1", false, 64, 64, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // SF_X2AWAYSOUND + {"wchrg2", false, 64, 64, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // SF_X2AWAYSOUND {"horn00", false, 255, 0, -1, NULL, 0, -1, -1, LUMPERROR, "/"}, // HORNCODE {"monch", false, 255, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, From 2320d46de1a8f8841d964b3812d53b99910fe2fc Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 21:33:07 -0700 Subject: [PATCH 13/19] Increase held-input whip charge delay --- src/k_kart.c | 2 +- src/k_kart.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 0a67c10d9..e053640a2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8271,7 +8271,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->instaWhipChargeLockout) player->instaWhipChargeLockout--; if (player->rings > 0 || player->itemamount || player->ringdelay) - player->instaWhipChargeLockout = 3*TICRATE/4; + player->instaWhipChargeLockout = INSTAWHIP_HOLD_DELAY; if (!(player->cmd.buttons & BT_ATTACK)) // Deliberate Item button release, no need to protect you from lockout player->instaWhipChargeLockout = 0; diff --git a/src/k_kart.h b/src/k_kart.h index 62d75e756..4fb0f1c42 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -33,6 +33,7 @@ Make sure this matches the actual number of states #define INSTAWHIP_CHARGETIME (5*TICRATE/4) #define INSTAWHIP_DROPGUARD (12) #define INSTAWHIP_RINGDRAINEVERY (TICRATE/2) +#define INSTAWHIP_HOLD_DELAY (TICRATE*2) #define GUARDBREAK_COOLDOWN (TICRATE*4) #define FLAMESHIELD_MAX (120) From 4928fec62290111dbf6faebb95e6d920d1a0e362 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 22:49:06 -0700 Subject: [PATCH 14/19] Reduce whip charge time --- src/k_kart.h | 2 +- src/objects/instawhip.c | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/k_kart.h b/src/k_kart.h index 4fb0f1c42..0afc80a8b 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -30,7 +30,7 @@ Make sure this matches the actual number of states #define SHRINK_PHYSICS_SCALE (3*FRACUNIT/4) #define INSTAWHIP_DURATION (12) -#define INSTAWHIP_CHARGETIME (5*TICRATE/4) +#define INSTAWHIP_CHARGETIME (3*TICRATE/4) #define INSTAWHIP_DROPGUARD (12) #define INSTAWHIP_RINGDRAINEVERY (TICRATE/2) #define INSTAWHIP_HOLD_DELAY (TICRATE*2) diff --git a/src/objects/instawhip.c b/src/objects/instawhip.c index 9236c525c..377ace438 100644 --- a/src/objects/instawhip.c +++ b/src/objects/instawhip.c @@ -50,7 +50,9 @@ void Obj_SpawnInstaWhipRecharge(player_t *player, angle_t angleOffset) { mobj_t *x = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_INSTAWHIP_RECHARGE); - x->tics = max(INSTAWHIP_CHARGETIME - player->instaWhipCharge - states[x->info->raisestate].tics, 0); + // This was previously used to delay the visual, back when this was VFX for a cooldown + // instead of VFX for a charge. We want to instantly bail out of that state now. + x->tics = 1; x->renderflags |= RF_SLOPESPLAT | RF_NOSPLATBILLBOARD; P_SetTarget(&recharge_target(x), player->mo); From 0b341a02aae24d9bb2fe3f8c3edcf7a73da556a5 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 13 Oct 2023 23:41:14 -0700 Subject: [PATCH 15/19] No charging whip with rocketsneakers --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index e053640a2..3611cc031 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8295,7 +8295,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) S_StopSoundByID(player->mo, sfx_wchrg2); } - if (player->itemamount || player->respawn.state != RESPAWNST_NONE || player->itemRoulette.eggman) + if (player->itemamount || player->respawn.state != RESPAWNST_NONE || player->pflags & (PF_ITEMOUT|PF_EGGMANOUT) || player->rocketsneakertimer) player->instaWhipCharge = 0; if (player->tiregrease) @@ -11031,7 +11031,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->instaWhipCharge = INSTAWHIP_CHARGETIME; } - if (leveltime < starttime || player->spindash) + if (leveltime < starttime || player->spindash || player->pflags & (PF_ITEMOUT|PF_EGGMANOUT) || player->rocketsneakertimer) { chargingwhip = false; player->instaWhipCharge = 0; From b67aa8af4f06cda671b5f06d34c05a1382ae8e79 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sat, 14 Oct 2023 05:56:42 -0700 Subject: [PATCH 16/19] Charge instawhip test fixups 2 --- src/d_player.h | 1 + src/k_kart.c | 13 ++++++++++--- src/k_kart.h | 1 + src/lua_playerlib.c | 4 ++++ src/objects/monitor.c | 6 ++++++ src/p_mobj.h | 1 + src/p_saveg.c | 2 ++ src/r_spritefx.cpp | 2 +- 8 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index b7d1d9456..f4beaf95c 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -858,6 +858,7 @@ struct player_t mobj_t *flickyAttacker; UINT8 instaWhipCharge; + UINT8 instaWhipCooldown; UINT8 instaWhipChargeLockout; UINT8 guardCooldown; diff --git a/src/k_kart.c b/src/k_kart.c index 3611cc031..9afb46eca 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8266,6 +8266,12 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->justbumped > 0) player->justbumped--; + if (player->instaWhipCooldown) + { + player->instaWhipCharge = 0; + player->instaWhipCooldown--; + } + // Don't screw up chain ring pickup/usage with instawhip charge. // If the button stays held, delay charge a bit. if (player->instaWhipChargeLockout) @@ -8278,7 +8284,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->instaWhipCharge && player->instaWhipCharge < INSTAWHIP_CHARGETIME) { if (!S_SoundPlaying(player->mo, sfx_wchrg1)) - S_StartSound(player->mo, sfx_wchrg1); + S_StartSoundAtVolume(player->mo, sfx_wchrg1, 255/2); } else { @@ -8288,7 +8294,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->instaWhipCharge >= INSTAWHIP_CHARGETIME) { if (!S_SoundPlaying(player->mo, sfx_wchrg2)) - S_StartSound(player->mo, sfx_wchrg2); + S_StartSoundAtVolume(player->mo, sfx_wchrg2, 255/3); } else { @@ -11031,7 +11037,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->instaWhipCharge = INSTAWHIP_CHARGETIME; } - if (leveltime < starttime || player->spindash || player->pflags & (PF_ITEMOUT|PF_EGGMANOUT) || player->rocketsneakertimer) + if (leveltime < starttime || player->spindash || player->pflags & (PF_ITEMOUT|PF_EGGMANOUT) || player->rocketsneakertimer || player->instaWhipCooldown) { chargingwhip = false; player->instaWhipCharge = 0; @@ -11073,6 +11079,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else { player->instaWhipCharge = 0; + player->instaWhipCooldown = INSTAWHIP_COOLDOWN; player->guardCooldown = INSTAWHIP_DROPGUARD; if (!K_PowerUpRemaining(player, POWERUP_BARRIER)) { diff --git a/src/k_kart.h b/src/k_kart.h index 0afc80a8b..0add30624 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -31,6 +31,7 @@ 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) diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 40ad65561..65844d2f0 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -331,6 +331,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->sliptideZipBoost); 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); /* @@ -809,6 +811,8 @@ static int player_set(lua_State *L) plr->sliptideZipBoost = 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); /* diff --git a/src/objects/monitor.c b/src/objects/monitor.c index 70ab1589d..2a78dc586 100644 --- a/src/objects/monitor.c +++ b/src/objects/monitor.c @@ -39,6 +39,7 @@ static const struct monitor_part_config { #define monitor_emerald(o) ((o)->extravalue1) #define monitor_damage(o) ((o)->extravalue2) #define monitor_rammingspeed(o) ((o)->movefactor) +#define monitor_combohit(o) ((o)->cusval) static inline UINT8 get_monitor_itemcount (const mobj_t *monitor) @@ -590,6 +591,11 @@ Obj_MonitorGetDamage { fixed_t damage; + if (leveltime - monitor_combohit(monitor) < 35) // Fast combo hits destroy monitors. + return FRACUNIT; + + monitor_combohit(monitor) = leveltime; + switch (damagetype & DMG_TYPEMASK) { case DMG_VOLTAGE: diff --git a/src/p_mobj.h b/src/p_mobj.h index 585dff7c7..3c20f5d8d 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -404,6 +404,7 @@ struct mobj_t // Custom values are not to be altered by us! // They are for SOCs to store things in. + // (This rule is already broken by a bunch of shit so I'm just gonna believe in dreams - Tyron 2023-10-14) INT32 cusval; INT32 cvmem; diff --git a/src/p_saveg.c b/src/p_saveg.c index 284fabac3..685c7491a 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -542,6 +542,7 @@ 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].handtimer); @@ -1052,6 +1053,7 @@ 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].handtimer = READUINT8(save->p); diff --git a/src/r_spritefx.cpp b/src/r_spritefx.cpp index 31b7260c8..35c7d0d02 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->whip && (player->rings <= 0) && (leveltime & 1)) + if ((player->instaWhipCharge || player->instaWhipCooldown) && !player->whip && (leveltime & 1)) { // Darken on every other frame of instawhip cooldown lightlevel -= 128; From 1eab3a68380e26b6a75bb87d25b1f1f11fee179d Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sat, 14 Oct 2023 16:09:21 -0700 Subject: [PATCH 17/19] More whip tuning --- src/k_kart.c | 4 ++-- src/k_kart.h | 2 ++ src/p_inter.c | 10 +--------- src/p_local.h | 1 - 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9afb46eca..7af4d65ec 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1410,7 +1410,7 @@ static void K_UpdateDraft(player_t *player) } // Want to berserk attack? Get your speed FIRST. - if (player->instaWhipCharge >= INSTAWHIP_CHARGETIME) + if (player->instaWhipCharge >= INSTAWHIP_TETHERBLOCK) return; // Not enough speed to draft. @@ -11045,7 +11045,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (chargingwhip) { - player->instaWhipCharge = min(player->instaWhipCharge + 1, INSTAWHIP_CHARGETIME + 1); + player->instaWhipCharge = min(player->instaWhipCharge + 1, INSTAWHIP_TETHERBLOCK + 1); if (player->instaWhipCharge == 1) { diff --git a/src/k_kart.h b/src/k_kart.h index 0add30624..13b55d9c3 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -35,6 +35,8 @@ Make sure this matches the actual number of states #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*2) #define GUARDBREAK_COOLDOWN (TICRATE*4) #define FLAMESHIELD_MAX (120) diff --git a/src/p_inter.c b/src/p_inter.c index 6d8d47ed6..327b452ed 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -108,14 +108,6 @@ void P_RampConstant(const BasicFF_t *FFInfo, INT32 Start, INT32 End) // GET STUFF // -boolean P_Whipping(player_t *player) -{ - if (player->instaWhipCharge) - return true; - if (player->whip && !P_MobjWasRemoved(player->whip)) - return true; - return false; -} // // P_CanPickupItem @@ -132,7 +124,7 @@ boolean P_CanPickupItem(player_t *player, UINT8 weapon) // 2: Eggbox // 3: Paperitem - if (weapon != 2 && P_Whipping(player)) + if (weapon != 2 && player->instaWhipCharge) return false; if (weapon) diff --git a/src/p_local.h b/src/p_local.h index ef6964bc5..15b338f9d 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -544,7 +544,6 @@ void P_CheckTimeLimit(void); void P_CheckPointLimit(void); boolean P_CheckRacers(void); -boolean P_Whipping(player_t *player); boolean P_CanPickupItem(player_t *player, UINT8 weapon); boolean P_IsPickupCheesy(player_t *player, UINT8 type); void P_UpdateLastPickup(player_t *player, UINT8 type); From 17cfff1dfd0b4cb38597db45434c9bf7cf11ead7 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sat, 14 Oct 2023 17:42:14 -0700 Subject: [PATCH 18/19] More lenient whip charge tether --- src/k_kart.c | 2 +- src/k_kart.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 7af4d65ec..f9102bde9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1410,7 +1410,7 @@ static void K_UpdateDraft(player_t *player) } // Want to berserk attack? Get your speed FIRST. - if (player->instaWhipCharge >= INSTAWHIP_TETHERBLOCK) + if (player->instaWhipCharge >= INSTAWHIP_TETHERBLOCK || player->instaWhipCooldown) return; // Not enough speed to draft. diff --git a/src/k_kart.h b/src/k_kart.h index 13b55d9c3..af773c953 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -36,7 +36,7 @@ Make sure this matches the actual number of states #define INSTAWHIP_RINGDRAINEVERY (TICRATE/2) #define INSTAWHIP_HOLD_DELAY (TICRATE*2) // MUST be longer or equal to INSTAWHIP_CHARGETIME. -#define INSTAWHIP_TETHERBLOCK (TICRATE*2) +#define INSTAWHIP_TETHERBLOCK (TICRATE*4) #define GUARDBREAK_COOLDOWN (TICRATE*4) #define FLAMESHIELD_MAX (120) From 763a7e03bfa62d2944bd1969fb3041164e646a30 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sat, 14 Oct 2023 18:25:03 -0700 Subject: [PATCH 19/19] Charge instawhip test fixes 3 --- src/k_kart.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index f9102bde9..0f3578699 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -11035,6 +11035,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) chargingwhip = false; releasedwhip = (ATTACK_IS_DOWN && player->rings <= 0); player->instaWhipCharge = INSTAWHIP_CHARGETIME; + player->instaWhipCooldown = 0; } if (leveltime < starttime || player->spindash || player->pflags & (PF_ITEMOUT|PF_EGGMANOUT) || player->rocketsneakertimer || player->instaWhipCooldown) @@ -11063,7 +11064,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { if ((leveltime%(INSTAWHIP_RINGDRAINEVERY)) == 0 && !(gametyperules & GTR_SPHERES)) { - if (player->rings > -20) + if (player->rings > -20 && P_IsDisplayPlayer(player)) S_StartSound(player->mo, sfx_antiri); player->rings--; }