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);
}
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;

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

View file

@ -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;
}

View file

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