Kill bouncy air drop

Too contentious of a mechanic to hardcode
This commit is contained in:
yamamama 2026-02-04 13:07:12 -05:00
parent f719824f37
commit 5895959265

View file

@ -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)