mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Add soft tumble, don't drop items vs invinc
This commit is contained in:
parent
d288b588d1
commit
bf585359c9
4 changed files with 21 additions and 8 deletions
15
src/k_kart.c
15
src/k_kart.c
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue