From 184e2e3c5de6ac2a821b184ca845b5f8a7614316 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Sun, 20 Jul 2025 19:35:22 -0400 Subject: [PATCH] Slidey wall transfers --- src/k_kart.c | 21 ++++++++++++++++++--- src/p_map.c | 3 ++- src/p_mobj.c | 7 +++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 421d0abc6..08aa37387 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9625,7 +9625,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) fixed_t fuckfactor = FRACUNIT; fixed_t transfergravity = 10*FRACUNIT/100; - fixed_t transferclamp = min(abs(player->transfer), (player->mo->scale*100)); + fixed_t transferclamp = min(abs(player->transfer), player->mo->scale*100); if (player->transfer < 0) transferclamp *= -1; @@ -9646,8 +9646,16 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) spdl->renderflags |= RF_REDUCEVFX; P_InstaScale(spdl, 4*player->mo->scale/2); - if (abs(player->mo->momz) < (3*transferclamp/2)) - player->mo->momz -= FixedMul(transferclamp, FixedMul(fuckfactor, transfergravity)); + fixed_t diff = abs(transferclamp) - abs(player->mo->momz); + + if (diff > 0) // we have room to speed up + { + fixed_t sub = FixedMul(transferclamp, FixedMul(fuckfactor, transfergravity)); + if (abs(sub) > diff) // don't one-tic error to speed up beyond clamp + sub = diff * (sub > 0 ? 1 : -1); + player->mo->momz -= sub; + } + } else { @@ -13318,6 +13326,13 @@ static void K_KartSpindash(player_t *player) if (K_CanSuperTransfer(player)) { S_StartSound(player->mo, sfx_ggfall); + /* + fixed_t movepenalty = min(abs(player->transfer*3/4), abs(player->mo->momz)); + if (player->transfer > 0) + player->transfer -= movepenalty; + else + player->transfer += movepenalty; + */ } else { diff --git a/src/p_map.c b/src/p_map.c index 414296f2c..46a0c3298 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -4127,7 +4127,8 @@ static void P_BouncePlayerMove(mobj_t *mo, TryMoveResult_t *result) else { // Some walls aren't bouncy even if you are - if (bestslideline && (bestslideline->flags & ML_NOTBOUNCY)) + if ((bestslideline && (bestslideline->flags & ML_NOTBOUNCY)) + || (mo->player && mo->player->transfer)) { // SRB2Kart: Non-bouncy line! P_SlideMove(mo, result); diff --git a/src/p_mobj.c b/src/p_mobj.c index db2efd7f3..c182f2745 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1807,6 +1807,13 @@ boolean P_XYMovement(mobj_t *mo) { if (abs(transfermomz) > 10*mo->scale) { + /* + fixed_t clamp = 3*K_GetKartSpeed(mo->player, false, false)/2; + if (transfermomz > 0) + mo->player->transfer = min(transfermomz, clamp); + else + mo->player->transfer = max(transfermomz, clamp); + */ mo->player->transfer = transfermomz; S_StartSound(mo, sfx_s3k98); }