From d915af3cb5e38544673c7619aabb5002d7ce75cf Mon Sep 17 00:00:00 2001 From: minenice55 Date: Thu, 5 Feb 2026 21:33:45 -0500 Subject: [PATCH] "fusion" air drop --- src/d_netcmd.c | 1 + src/d_player.h | 9 +++-- src/k_kart.c | 104 +++++++++++++++++++++++++------------------------ src/k_kart.h | 1 + 4 files changed, 62 insertions(+), 53 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index a3d0b41db..2f1fdbb80 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -616,6 +616,7 @@ consvar_t cv_kartdrafting_basedistance = CVAR_INIT ("kartdrafting_basedistance", static CV_PossibleValue_t airdrop_cons_t[] = {{AIRDROP_NONE, "Off"}, {AIRDROP_LIGHT, "Light"}, {AIRDROP_HEAVY, "Heavy"}, + {AIRDROP_FUSION, "Fusion"}, {0, NULL}}; consvar_t cv_kartairdrop = CVAR_INIT ("kartairdrop", "Off", CV_NETVAR|CV_CALL|CV_NOINIT|CV_GUARD, airdrop_cons_t, KartAirDrop_OnChange); diff --git a/src/d_player.h b/src/d_player.h index bd194f8ae..29640e1c9 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -113,9 +113,12 @@ typedef enum typedef enum { - PAF_WANTSAIRDROP = 1<<0, // Wants Air drop (input pressed and buffered) - PAF_AIRDROP = 1<<1, // Is in Air Drop (activation / deactivation criteria change if light or heavy) - PAF_AIRDROPINPUT = 1<<2, // Air drop input held + PAF_AIRDROPINPUT = 1<<0, // Air drop input held + PAF_WANTSAIRDROP = 1<<1, // Wants Air drop (input pressed and buffered) + PAF_AIRDROP_LIGHT = 1<<2, // Is in Light Air Drop + PAF_AIRDROP_HEAVY = 1<<3, // Is in Heavy Air Drop + + PAF_AIRDROP_MASK = (PAF_AIRDROP_LIGHT|PAF_AIRDROP_HEAVY), // Is in any Air Drop state } p_airdropflags_t; typedef enum diff --git a/src/k_kart.c b/src/k_kart.c index 897bbc5dc..464827e6c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6978,6 +6978,8 @@ static void K_SpawnFallLines(player_t *player, boolean ringdrop) static void K_AirDrop(player_t *player, ticcmd_t *cmd) { + const tic_t airbrakedelay = TICRATE/3; + if (player->airdropbuffer > 0) { player->airdropbuffer--; @@ -6995,7 +6997,7 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) else { player->airdropflags &= ~PAF_AIRDROPINPUT; - if (airdropactive == AIRDROP_LIGHT) + if (airdropactive == AIRDROP_LIGHT || airdropactive == AIRDROP_FUSION) { player->airdropflags &= ~PAF_WANTSAIRDROP; } @@ -7006,7 +7008,7 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) player->airdropflags &= ~PAF_WANTSAIRDROP; } - if (!(player->airdropflags & PAF_AIRDROP)) + if (!(player->airdropflags & PAF_AIRDROP_HEAVY)) { if (player->karthud[khud_heavydropcam] > 0) { @@ -7018,29 +7020,26 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) player->karthud[khud_postdropcam]--; } - if (P_IsObjectOnGround(player->mo)) + if (K_AirDropActive() && P_IsObjectOnGround(player->mo)) { - if (K_AirDropActive() && (player->airdropflags & PAF_AIRDROP)) + if ((player->airdropflags & PAF_AIRDROP_HEAVY)) { - if (airdropactive == AIRDROP_HEAVY) + if (player->rings > 0 && player->airdroptime > TICRATE/4) { - if (player->rings > 0 && player->airdroptime > TICRATE/4) - { - P_PlayerRingBurst(player, min(2, player->rings)); - } - if (player->airdroptime > 1) - { - player->startboost = TICRATE/2; - - // Take off! - S_StartSound(player->mo, sfx_shrpgo); - } - - // POOMP! - S_StartSound(player->mo, sfx_vclgna); - - player->karthud[khud_postdropcam] = min(2*player->karthud[khud_heavydropcam], TICRATE/4); + P_PlayerRingBurst(player, min(2, player->rings)); } + if (player->airdroptime > 1) + { + player->startboost = TICRATE/2; + + // Take off! + S_StartSound(player->mo, sfx_shrpgo); + } + + // POOMP! + S_StartSound(player->mo, sfx_vclgna); + + player->karthud[khud_postdropcam] = min(2*player->karthud[khud_heavydropcam], TICRATE/4); } } @@ -7051,14 +7050,20 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) ) { player->airdroptime = 0; - player->airdropflags &= ~PAF_AIRDROP; + player->airdropflags &= ~PAF_AIRDROP_MASK; return; } if (player->airdropflags & PAF_WANTSAIRDROP) { - if (airdropactive == AIRDROP_HEAVY && !(player->airdropflags & (PAF_AIRDROP))) + if ((airdropactive == AIRDROP_LIGHT) || (airdropactive == AIRDROP_FUSION && (cmd->buttons & BT_ACCELERATE))) { + player->airdropflags |= PAF_AIRDROP_LIGHT; + } + else if (!(player->airdropflags & (PAF_AIRDROP_HEAVY))) // in fusion, fires if brake is held but not accel + { + player->airdropflags |= PAF_AIRDROP_HEAVY; + player->airdroptime = 0; player->airdropbuffer = 0; // TODO: heavy air drop should allow keeping current boost stack @@ -7067,43 +7072,42 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) player->mo->momx = FixedMul(player->mo->momx, 90*FRACUNIT/100); player->mo->momy = FixedMul(player->mo->momy, 90*FRACUNIT/100); - player->mo->momz -= 8*P_MobjFlip(player->mo)*mapobjectscale; + player->mo->momz -= 12*P_MobjFlip(player->mo)*mapobjectscale; } - player->airdropflags |= PAF_AIRDROP; } else { - if (airdropactive == AIRDROP_LIGHT) - player->airdropflags &= ~PAF_AIRDROP; + if (airdropactive == AIRDROP_LIGHT || airdropactive == AIRDROP_FUSION) + { + player->airdropflags &= ~PAF_AIRDROP_LIGHT; + } } - if (player->airdropflags & PAF_AIRDROP) + // heavy air drop always overrides light air drop + if (player->airdropflags & PAF_AIRDROP_HEAVY) { - tic_t airbrakedelay = TICRATE/3; K_SpawnFallLines(player, false); - - if (airdropactive == AIRDROP_HEAVY) + if (player->airdroptime <= airbrakedelay) { - if (player->airdroptime <= airbrakedelay) - { - player->mo->momz -= FixedMul(4*gravity, mapobjectscale)*P_MobjFlip(player->mo); - K_SpawnAirdropTrail(player); - } - else - { - player->mo->momz -= FixedMul(2*gravity, mapobjectscale)*P_MobjFlip(player->mo); - } - - if (player->karthud[khud_heavydropcam] < TICRATE) - player->karthud[khud_heavydropcam]++; + player->mo->momz -= FixedMul(5*gravity, mapobjectscale)*P_MobjFlip(player->mo); + K_SpawnAirdropTrail(player); } - else if (airdropactive == AIRDROP_LIGHT) + else { - if (player->airdroptime >= airbrakedelay) - { - player->mo->momz -= FixedMul(gravity, mapobjectscale)*P_MobjFlip(player->mo); - K_SpawnAirdropTrail(player); - } + player->mo->momz -= FixedMul(2*gravity, mapobjectscale)*P_MobjFlip(player->mo); + } + + player->airdroptime++; + if (player->karthud[khud_heavydropcam] < TICRATE) + player->karthud[khud_heavydropcam]++; + } + else if (player->airdropflags & PAF_AIRDROP_LIGHT) + { + K_SpawnFallLines(player, false); + if (player->airdroptime >= airbrakedelay) + { + player->mo->momz -= FixedMul(gravity, mapobjectscale)*P_MobjFlip(player->mo); + K_SpawnAirdropTrail(player); } player->airdroptime++; } @@ -11728,7 +11732,7 @@ boolean K_DraftingActive(void) boolean K_AirDropActive(void) { - if (airdropactive) + if (airdropactive > AIRDROP_NONE) { // Air Drop is enabled! return true; diff --git a/src/k_kart.h b/src/k_kart.h index b980d8945..2f9a5d776 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -424,6 +424,7 @@ typedef enum AIRDROP_NONE = 0, AIRDROP_LIGHT, AIRDROP_HEAVY, + AIRDROP_FUSION, } airdroptype_t; #ifdef __cplusplus