From bf585359c928916df9e1737191b8aee6b3978537 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Wed, 1 May 2024 18:09:34 -0700 Subject: [PATCH] Add soft tumble, don't drop items vs invinc --- src/k_kart.c | 15 +++++++++++---- src/k_kart.h | 2 +- src/lua_baselib.c | 4 +++- src/p_inter.c | 8 ++++++-- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 0914ac943..d14da36f3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4226,7 +4226,7 @@ static fixed_t K_TumbleZ(mobj_t *mo, fixed_t input) return FixedMul(input, -gravityAdjust); } -void K_TumblePlayer(player_t *player, mobj_t *inflictor, mobj_t *source) +void K_TumblePlayer(player_t *player, mobj_t *inflictor, mobj_t *source, boolean soften) { (void)source; @@ -4250,11 +4250,18 @@ void K_TumblePlayer(player_t *player, mobj_t *inflictor, mobj_t *source) if (inflictor && !P_MobjWasRemoved(inflictor)) { - const fixed_t addHeight = FixedHypot(FixedHypot(inflictor->momx, inflictor->momy) / 2, FixedHypot(player->mo->momx, player->mo->momy) / 2); + fixed_t addHeight = FixedHypot(FixedHypot(inflictor->momx, inflictor->momy) / 2, FixedHypot(player->mo->momx, player->mo->momy) / 2); + if (soften) + addHeight = FixedMul(addHeight, 6*FRACUNIT/10); player->tumbleHeight += (addHeight / player->mo->scale); player->tumbleHeight = min(200, player->tumbleHeight); } + if (soften) + { + player->tumbleBounces = 2; + } + S_StartSound(player->mo, sfx_s3k9b); player->mo->momz = K_TumbleZ(player->mo, player->tumbleHeight * FRACUNIT); @@ -4834,7 +4841,7 @@ void K_ApplyTripWire(player_t *player, tripwirestate_t state) { // We are either softlocked or wildly misbehaving. Stop that! if (state == TRIPSTATE_BLOCKED && player->tripwireReboundDelay && (player->speed > 5 * K_GetKartSpeed(player, false, false))) - K_TumblePlayer(player, NULL, NULL); + K_TumblePlayer(player, NULL, NULL, false); if (state == TRIPSTATE_PASSED) { @@ -4875,7 +4882,7 @@ void K_ApplyTripWire(player_t *player, tripwirestate_t state) if (state == TRIPSTATE_PASSED && player->spinouttimer && player->speed > K_PlayerTripwireSpeedThreshold(player)) { - K_TumblePlayer(player, NULL, NULL); + K_TumblePlayer(player, NULL, NULL, false); } player->tripwireUnstuck += 10; diff --git a/src/k_kart.h b/src/k_kart.h index 09c2d46d4..6556138e1 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -137,7 +137,7 @@ void K_BattleAwardHit(player_t *player, player_t *victim, mobj_t *inflictor, UIN void K_RemoveGrowShrink(player_t *player); boolean K_IsBigger(mobj_t *compare, mobj_t *other); void K_SpinPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 type); -void K_TumblePlayer(player_t *player, mobj_t *inflictor, mobj_t *source); +void K_TumblePlayer(player_t *player, mobj_t *inflictor, mobj_t *source, boolean soften); void K_TumbleInterrupt(player_t *player); angle_t K_StumbleSlope(angle_t angle, angle_t pitch, angle_t roll); void K_StumblePlayer(player_t *player); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 181a80b45..d282b99a5 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -3169,6 +3169,7 @@ static int lib_kTumblePlayer(lua_State *L) player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); mobj_t *inflictor = NULL; mobj_t *source = NULL; + boolean soften = false; NOHUD if (!player) return LUA_ErrInvalid(L, "player_t"); @@ -3176,7 +3177,8 @@ static int lib_kTumblePlayer(lua_State *L) inflictor = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ)); if (!lua_isnone(L, 3) && lua_isuserdata(L, 3)) source = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ)); - K_TumblePlayer(player, inflictor, source); + soften = lua_optboolean(L, 4); + K_TumblePlayer(player, inflictor, source, soften); return 0; } diff --git a/src/p_inter.c b/src/p_inter.c index dc51f2d84..884091c2d 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3145,6 +3145,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da damage = 0; } + boolean hitFromInvinc = false; + // Sting and stumble shouldn't be rewarding Battle hits. if (type == DMG_STING || type == DMG_STUMBLE) { @@ -3162,6 +3164,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da { tic_t kinvextend; + hitFromInvinc = true; + if (gametyperules & GTR_CLOSERPLAYERS) kinvextend = 2*TICRATE; else @@ -3284,7 +3288,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da ringburst = 0; break; case DMG_TUMBLE: - K_TumblePlayer(player, inflictor, source); + K_TumblePlayer(player, inflictor, source, hitFromInvinc); ringburst = 10; break; case DMG_EXPLODE: @@ -3328,7 +3332,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (gametyperules & GTR_BUMPERS) player->spheres = min(player->spheres + 10, 40); - if ((hardhit == true) || cv_kartdebughuddrop.value) + if ((hardhit == true && !hitFromInvinc) || cv_kartdebughuddrop.value) { K_DropItems(player); }