From 94aea179edb9d472ebee18fbc313c72a05a3f60e Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 15 Jan 2024 21:31:36 -0800 Subject: [PATCH 1/9] E-Braking on ground: cancels Insta-Whip - Lets you keep your Whip while fast-falling. - Make sure Insta-Whip can't interrupt Guard and vice-versa. --- src/k_kart.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index b5ae9b39e..286eac51a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8582,9 +8582,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) S_StartSound(player->mo, sfx_s1af); player->oldGuard = true; - - if (!K_PowerUpRemaining(player, POWERUP_BARRIER)) - player->instaWhipCharge = 0; } else if (player->oldGuard) { @@ -10827,6 +10824,11 @@ boolean K_PlayerGuard(const player_t *player) return true; } + if (player->instaWhipCharge != 0) + { + return false; + } + if (player->spheres == 0) return false; @@ -11676,7 +11678,19 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->instaWhipCharge = 0; } - if (chargingwhip) + if (chargingwhip && K_PressingEBrake(player)) + { + // 1) E-braking on the ground: cancels Insta-Whip. + // Still lets you keep your Whip while fast-falling. + // 2) Do not interrupt Guard. + if (P_IsObjectOnGround(player->mo) || K_PlayerGuard(player)) + { + if (player->instaWhipCharge) + player->defenseLockout = PUNISHWINDOW; + player->instaWhipCharge = 0; + } + } + else if (chargingwhip) { player->instaWhipCharge = min(player->instaWhipCharge + 1, INSTAWHIP_TETHERBLOCK + 1); From 42d79efa2735658c8cf66d0af4857aa410a073ea Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 15 Jan 2024 21:39:37 -0800 Subject: [PATCH 2/9] Insta-Whip charging: do not drain spheres while player is in damage state --- 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 286eac51a..a0a9a4335 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8475,7 +8475,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (K_PlayerGuard(player) && !K_PowerUpRemaining(player, POWERUP_BARRIER) && (player->ebrakefor%6 == 0)) player->spheres--; - if (player->instaWhipCharge && !K_PowerUpRemaining(players, POWERUP_BADGE) && leveltime%6 == 0) + if (player->instaWhipCharge && !K_PowerUpRemaining(players, POWERUP_BADGE) && leveltime%6 == 0 && !P_PlayerInPain(player)) player->spheres--; } else From acee24939f3f049ba30e65e88ce31c38305505f8 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 15 Jan 2024 22:28:48 -0800 Subject: [PATCH 3/9] Fix Guard vs Guard clash --- src/k_collide.cpp | 3 +-- src/k_kart.c | 9 +++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 04e0025e7..de19100f4 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -1046,8 +1046,7 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) || (t1->player->invincibilitytimer > 0) || (t1->player->flamedash > 0 && t1->player->itemtype == KITEM_FLAMESHIELD) || (t1->player->curshield == KSHIELD_TOP && !K_IsHoldingDownTop(t1->player)) - || (t1->player->bubbleblowup > 0) - || (t1->player->spheres > 0 && K_PlayerEBrake(t1->player)); + || (t1->player->bubbleblowup > 0); }; if (canClash(t1, t2) && canClash(t2, t1)) diff --git a/src/k_kart.c b/src/k_kart.c index a0a9a4335..03e562232 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1016,9 +1016,14 @@ boolean K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2) if (mobj1->type == MT_PLAYER && mobj2->type == MT_PLAYER) { - if (K_PlayerGuard(mobj1->player)) + boolean guard1 = K_PlayerGuard(mobj1->player); + boolean guard2 = K_PlayerGuard(mobj2->player); + + if (guard1 && guard2) + K_DoPowerClash(mobj1, mobj2); + else if (guard1) K_DoGuardBreak(mobj1, mobj2); - if (K_PlayerGuard(mobj2->player)) + else if (guard2) K_DoGuardBreak(mobj2, mobj1); } From e3b21ce840179ac288633aaf542be1cc1a71233f Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 15 Jan 2024 23:26:26 -0800 Subject: [PATCH 4/9] Invincibility: S-Monitor duration does not add extra boost onto top speed --- src/k_kart.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 03e562232..32dae6bdf 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3286,7 +3286,9 @@ static void K_GetKartBoostPower(player_t *player) if (player->invincibilitytimer) // Invincibility { - ADDBOOST(3*FRACUNIT/8 + (FRACUNIT / 1400 * (player->invincibilitytimer)), 3*FRACUNIT, SLIPTIDEHANDLING/2); // + 37.5 + ?% top speed, + 300% acceleration, +25% handling + // S-Monitor: no extra % + fixed_t extra = FRACUNIT / 1400 * (player->invincibilitytimer - K_PowerUpRemaining(player, POWERUP_SMONITOR)); + ADDBOOST(3*FRACUNIT/8 + extra, 3*FRACUNIT, SLIPTIDEHANDLING/2); // + 37.5 + ?% top speed, + 300% acceleration, +25% handling } if (player->growshrinktimer > 0) // Grow From 3724dd542baab5c1c044ee243352b335758a9ea2 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 15 Jan 2024 23:34:34 -0800 Subject: [PATCH 5/9] Battle: do not reduce hitlag for Insta-Whip (DMG_WHUMBLE), prevent double-damage window --- src/p_inter.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/p_inter.c b/src/p_inter.c index a36f74262..b645d374f 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3471,7 +3471,9 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (source && source->player && target) G_GhostAddHit((INT32) (source->player - players), target); - if ((gametyperules & GTR_BUMPERS) && !battleprisons) + // Insta-Whip (DMG_WHUMBLE): do not reduce hitlag because + // this can leave room for double-damage. + if ((damagetype & DMG_TYPEMASK) != DMG_WHUMBLE && (gametyperules & GTR_BUMPERS) && !battleprisons) laglength /= 2; K_SetHitLagForObjects(target, inflictor, source, laglength, true); From ecf70c6eea947096037878cb7fad38c79284b55d Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 15 Jan 2024 23:53:52 -0800 Subject: [PATCH 6/9] Battle UFO: polish drops - Whip - Player gets power-up instantly, no paper item spawned - Items - Put a small delay on the drop appearing - Adjusted drop spawn position so it spawns right under the UFO --- src/k_powerup.cpp | 2 ++ src/objects/battle-ufo.cpp | 33 +++++++++++++++++++-------------- src/p_inter.c | 1 - 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/k_powerup.cpp b/src/k_powerup.cpp index 69bbddc36..5ec9f8a99 100644 --- a/src/k_powerup.cpp +++ b/src/k_powerup.cpp @@ -50,6 +50,8 @@ void K_GivePowerUp(player_t* player, kartitems_t powerup, tic_t time) Obj_SpawnPowerUpAura(player); } + player->flashing = 2*TICRATE; + switch (powerup) { case POWERUP_SMONITOR: diff --git a/src/objects/battle-ufo.cpp b/src/objects/battle-ufo.cpp index 5abb0cf91..76f29a5cb 100644 --- a/src/objects/battle-ufo.cpp +++ b/src/objects/battle-ufo.cpp @@ -12,6 +12,7 @@ #include "../p_local.h" #include "../k_battle.h" #include "../k_objects.h" +#include "../k_powerup.h" #include "../k_kart.h" #include "../k_hud.h" // K_AddMessage @@ -151,26 +152,30 @@ void Obj_BattleUFODeath(mobj_t *mobj, mobj_t *inflictor) { UFO* ufo = static_cast(mobj); const SINT8 flip = P_MobjFlip(ufo); + const kartitems_t pwrup = static_cast(P_RandomRange(PR_BATTLEUFO, FIRSTPOWERUP, LASTPOWERUP)); ufo->momz = -(8*mapobjectscale)/2; - mobj_t* drop = K_CreatePaperItem( - ufo->x, - ufo->y, - ufo->z + (flip), - 0, - flip, - P_RandomRange(PR_BATTLEUFO, FIRSTPOWERUP, LASTPOWERUP), - BATTLE_POWERUP_TIME - ); - - if (!P_MobjWasRemoved(inflictor) && inflictor->type == MT_INSTAWHIP) + if (!P_MobjWasRemoved(inflictor) && inflictor->type == MT_INSTAWHIP && + !P_MobjWasRemoved(inflictor->target) && inflictor->target->player) { - // Take momentum of player who whips - inflictor = inflictor->target; + // Just give it to the player, they earned it. + K_GivePowerUp(inflictor->target->player, pwrup, BATTLE_POWERUP_TIME); } + else + { + mobj_t *drop = K_CreatePaperItem( + ufo->x, + ufo->y, + ufo->z + ufo->sprzoff() + (flip), + 0, + flip, + pwrup, + BATTLE_POWERUP_TIME + ); - drop->momz = !P_MobjWasRemoved(inflictor) ? inflictor->momz : 0; + drop->hitlag = ufo->hitlag(); + } if (ufo->spawner()) { diff --git a/src/p_inter.c b/src/p_inter.c index b645d374f..5a11f7101 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -402,7 +402,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) return; K_GivePowerUp(player, special->threshold, special->movecount); - player->flashing = 2*TICRATE; } else { From 54e4dd5cd8cea892a5bb8306904527e4ee7b7928 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 16 Jan 2024 02:18:29 -0800 Subject: [PATCH 7/9] Battle UFO: do not suck player who is spinning out --- src/p_map.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 95e509cca..b700a4b5e 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -781,7 +781,7 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) if (thing->type == MT_BATTLEUFO) { - if (tm.thing->type != MT_PLAYER) + if (!tm.thing->player) { return BMIT_CONTINUE; // not a player } @@ -801,7 +801,12 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) return BMIT_CONTINUE; // underneath } - if (!tm.thing->player || !tm.thing->player->fastfall) + if (P_PlayerInPain(tm.thing->player)) + { + return BMIT_CONTINUE; // spinout would cause a softlock + } + + if (!tm.thing->player->fastfall) { fixed_t tractorHeight = 211*mapobjectscale; fixed_t zRange = FixedDiv(thing->z - tm.thing->z, tractorHeight); From ecb20e8f64c11c7afa877563a38b43ab4640e15d Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 16 Jan 2024 02:24:28 -0800 Subject: [PATCH 8/9] Battle: put sting damage condition on zero bumpers instead of zero spheres --- src/k_collide.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_collide.cpp b/src/k_collide.cpp index de19100f4..525248fdf 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -1149,7 +1149,7 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) bool stung = false; - if (t2->player->rings <= 0 && t2->player->spheres <= 0) + if (t2->player->rings <= 0 && t2->health == 1) // no bumpers { P_DamageMobj(t2, t1, t1, 1, DMG_STING|DMG_WOMBO); stung = true; From 1aab476b00d9238a9b82416d63aead1ff5267be9 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 16 Jan 2024 02:35:32 -0800 Subject: [PATCH 9/9] Battle: base Overtime Laser height on camera position instead of player object position --- src/k_battle.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/k_battle.c b/src/k_battle.c index e6a971163..ce5b3db37 100644 --- a/src/k_battle.c +++ b/src/k_battle.c @@ -609,6 +609,7 @@ static void K_SpawnOvertimeLaser(fixed_t x, fixed_t y, fixed_t scale) for (i = 0; i <= r_splitscreen; i++) { + camera_t *cam = &camera[i]; player_t *player = &players[displayplayers[i]]; fixed_t zpos; SINT8 flip; @@ -620,13 +621,13 @@ static void K_SpawnOvertimeLaser(fixed_t x, fixed_t y, fixed_t scale) if (player->mo->eflags & MFE_VERTICALFLIP) { - zpos = player->mo->z + player->mo->height; - zpos = min(zpos + heightPadding, player->mo->ceilingz); + zpos = cam->z + player->mo->height; + zpos = min(zpos + heightPadding, cam->ceilingz); } else { - zpos = player->mo->z; - zpos = max(zpos - heightPadding, player->mo->floorz); + zpos = cam->z; + zpos = max(zpos - heightPadding, cam->floorz); } flip = P_MobjFlip(player->mo);