From 5895959265d65a43ebde03d11fe0d97d8856c4e8 Mon Sep 17 00:00:00 2001 From: yamamama Date: Wed, 4 Feb 2026 13:07:12 -0500 Subject: [PATCH] Kill bouncy air drop Too contentious of a mechanic to hardcode --- src/k_kart.c | 110 ++++++--------------------------------------------- 1 file changed, 13 insertions(+), 97 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index e851b1665..392267ec1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6993,88 +6993,17 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) { if (airdropactive == AIRDROP_HEAVY) { - if (player->airdropflags & PAF_BOUNCYAIRDROP) + if (player->rings > 0) { - const fixed_t maxBounce = mapobjectscale * 10; - const fixed_t minBounce = mapobjectscale; - fixed_t bounce = 2 * abs(player->airdroptime) / 3; - - // Lose speed on bad bounce. - // Slow down more as horizontal momentum shrinks - // compared to vertical momentum. - angle_t a = R_PointToAngle2(0, 0, 4 * maxBounce, player->speed); - fixed_t f = FSIN(a); - player->mo->momx = FixedMul(player->mo->momx, f); - player->mo->momy = FixedMul(player->mo->momy, f); - if (bounce > maxBounce) - { - bounce = maxBounce; - } - else if (bounce < minBounce) - { - bounce = minBounce; - } - - if (player->mo->eflags & MFE_UNDERWATER) - bounce = (117 * bounce) / 200; - - // Nudge the player in their facing angle, and provide a little starting momentum if they need it. - // The bounce is already a strong tradeoff, so this allows it to be used for saves and get you back into flow. - angle_t momangle = K_MomentumAngle(player->mo); - fixed_t minspeed = K_GetKartSpeed(player, false, false)/2; - fixed_t returnspeed = max(FixedHypot(player->mo->momx, player->mo->momy), minspeed); - - // Initial momentum set uses real speed to avoid some weird twitchy behavior at low XY speed - P_InstaThrust(player->mo, momangle, FixedHypot(player->mo->momx, player->mo->momy)/2); - P_Thrust(player->mo, player->mo->angle, returnspeed/2); - - player->mo->z += P_MobjFlip(player->mo); - player->mo->momz = bounce * P_MobjFlip(player->mo); - - if (S_SoundPlaying(player->mo, sfx_s3kd9l)) - { - S_StopSoundByID(player->mo, sfx_s3kd9l); - } - - if (player->rings > 0) - { - // Spill some rings with every bounce. Ring Drop lives! - - // Convert the bounce data to floats. It's goddamned 2026. - float fbounce, fmaxbounce; - - fbounce = FIXED_TO_FLOAT(max(0, bounce - minBounce)); - fmaxbounce = FIXED_TO_FLOAT(maxBounce - minBounce); - - fbounce /= fmaxbounce; - - INT32 ringloss = (INT32)(3.0f * fbounce); - - // Better bounces means more rings lost. - if (ringloss) - { - P_PlayerRingBurst(player, min(ringloss, player->rings)); - } - } - - - // POOMP! - S_StartSound(player->mo, sfx_vclgna); + P_PlayerRingBurst(player, min(2, player->rings)); } - else - { - if (player->rings > 0) - { - P_PlayerRingBurst(player, min(2, player->rings)); - } - player->startboost = TICRATE/2; + player->startboost = TICRATE/2; - // Take off! - S_StartSound(player->mo, sfx_s3k81); + // Take off! + S_StartSound(player->mo, sfx_s3k81); - // POOMP! - S_StartSound(player->mo, sfx_vclgna); - } + // POOMP! + S_StartSound(player->mo, sfx_vclgna); } } player->airdroptime = 0; @@ -7084,7 +7013,7 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) if ((cmd->buttons & BT_BRAKE) && !(player->airdropflags & PAF_WANTSAIRDROP)) { - if (airdropactive == AIRDROP_HEAVY && !(player->airdropflags & (PAF_AIRDROP|PAF_BOUNCYAIRDROP))) + if (airdropactive == AIRDROP_HEAVY && !(player->airdropflags & (PAF_AIRDROP))) { // TODO: heavy air drop should allow keeping current boost stack S_StartSound(player->mo, sfx_s3k66); @@ -7109,26 +7038,13 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) if (airdropactive == AIRDROP_HEAVY) { - if (player->airdropflags & PAF_BOUNCYAIRDROP) - { - player->airdroptime = player->mo->momz; - if (!S_SoundPlaying(player->mo, sfx_s3kd9l)) - { - S_StartSound(player->mo, sfx_s3kd9l); - } + if (player->airdroptime < UINT8_MAX) + player->airdroptime++; - player->mo->momz -= FixedMul(2*gravity, mapobjectscale)*P_MobjFlip(player->mo); - } - else + if (player->airdroptime <= TICRATE/4) { - if (player->airdroptime < UINT8_MAX) - player->airdroptime++; - - if (player->airdroptime <= TICRATE/4) - { - player->mo->momz -= FixedMul(4*gravity, mapobjectscale)*P_MobjFlip(player->mo); - K_SpawnAirdropTrail(player); - } + player->mo->momz -= FixedMul(4*gravity, mapobjectscale)*P_MobjFlip(player->mo); + K_SpawnAirdropTrail(player); } } else if (airdropactive == AIRDROP_LIGHT)