Add soft tumble, don't drop items vs invinc

This commit is contained in:
AJ Martinez 2024-05-01 18:09:34 -07:00
parent d288b588d1
commit bf585359c9
4 changed files with 21 additions and 8 deletions

View file

@ -4226,7 +4226,7 @@ static fixed_t K_TumbleZ(mobj_t *mo, fixed_t input)
return FixedMul(input, -gravityAdjust); 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; (void)source;
@ -4250,11 +4250,18 @@ void K_TumblePlayer(player_t *player, mobj_t *inflictor, mobj_t *source)
if (inflictor && !P_MobjWasRemoved(inflictor)) 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 += (addHeight / player->mo->scale);
player->tumbleHeight = min(200, player->tumbleHeight); player->tumbleHeight = min(200, player->tumbleHeight);
} }
if (soften)
{
player->tumbleBounces = 2;
}
S_StartSound(player->mo, sfx_s3k9b); S_StartSound(player->mo, sfx_s3k9b);
player->mo->momz = K_TumbleZ(player->mo, player->tumbleHeight * FRACUNIT); 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! // We are either softlocked or wildly misbehaving. Stop that!
if (state == TRIPSTATE_BLOCKED && player->tripwireReboundDelay && (player->speed > 5 * K_GetKartSpeed(player, false, false))) 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) if (state == TRIPSTATE_PASSED)
{ {
@ -4875,7 +4882,7 @@ void K_ApplyTripWire(player_t *player, tripwirestate_t state)
if (state == TRIPSTATE_PASSED && player->spinouttimer && if (state == TRIPSTATE_PASSED && player->spinouttimer &&
player->speed > K_PlayerTripwireSpeedThreshold(player)) player->speed > K_PlayerTripwireSpeedThreshold(player))
{ {
K_TumblePlayer(player, NULL, NULL); K_TumblePlayer(player, NULL, NULL, false);
} }
player->tripwireUnstuck += 10; player->tripwireUnstuck += 10;

View file

@ -137,7 +137,7 @@ void K_BattleAwardHit(player_t *player, player_t *victim, mobj_t *inflictor, UIN
void K_RemoveGrowShrink(player_t *player); void K_RemoveGrowShrink(player_t *player);
boolean K_IsBigger(mobj_t *compare, mobj_t *other); 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_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); void K_TumbleInterrupt(player_t *player);
angle_t K_StumbleSlope(angle_t angle, angle_t pitch, angle_t roll); angle_t K_StumbleSlope(angle_t angle, angle_t pitch, angle_t roll);
void K_StumblePlayer(player_t *player); void K_StumblePlayer(player_t *player);

View file

@ -3169,6 +3169,7 @@ static int lib_kTumblePlayer(lua_State *L)
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
mobj_t *inflictor = NULL; mobj_t *inflictor = NULL;
mobj_t *source = NULL; mobj_t *source = NULL;
boolean soften = false;
NOHUD NOHUD
if (!player) if (!player)
return LUA_ErrInvalid(L, "player_t"); 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)); inflictor = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
if (!lua_isnone(L, 3) && lua_isuserdata(L, 3)) if (!lua_isnone(L, 3) && lua_isuserdata(L, 3))
source = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ)); 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; return 0;
} }

View file

@ -3145,6 +3145,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
damage = 0; damage = 0;
} }
boolean hitFromInvinc = false;
// Sting and stumble shouldn't be rewarding Battle hits. // Sting and stumble shouldn't be rewarding Battle hits.
if (type == DMG_STING || type == DMG_STUMBLE) 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; tic_t kinvextend;
hitFromInvinc = true;
if (gametyperules & GTR_CLOSERPLAYERS) if (gametyperules & GTR_CLOSERPLAYERS)
kinvextend = 2*TICRATE; kinvextend = 2*TICRATE;
else else
@ -3284,7 +3288,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
ringburst = 0; ringburst = 0;
break; break;
case DMG_TUMBLE: case DMG_TUMBLE:
K_TumblePlayer(player, inflictor, source); K_TumblePlayer(player, inflictor, source, hitFromInvinc);
ringburst = 10; ringburst = 10;
break; break;
case DMG_EXPLODE: 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) if (gametyperules & GTR_BUMPERS)
player->spheres = min(player->spheres + 10, 40); player->spheres = min(player->spheres + 10, 40);
if ((hardhit == true) || cv_kartdebughuddrop.value) if ((hardhit == true && !hitFromInvinc) || cv_kartdebughuddrop.value)
{ {
K_DropItems(player); K_DropItems(player);
} }