diff --git a/src/info.c b/src/info.c index 7b3f3c177..b75f8cae0 100644 --- a/src/info.c +++ b/src/info.c @@ -3950,9 +3950,9 @@ state_t states[NUMSTATES] = {SPR_SLPT, FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_SLIPTIDEZIP - {SPR_IWHP, FF_FLOORSPRITE|FF_ANIMATE|0, -1, {NULL}, 6, 2, S_NULL}, // S_INSTAWHIP - {SPR_GRNG, FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_BLOCKRING - {SPR_GBDY, FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY + {SPR_IWHP, FF_FULLBRIGHT|FF_FLOORSPRITE|FF_ANIMATE|0, -1, {NULL}, 6, 2, S_NULL}, // S_INSTAWHIP + {SPR_GRNG, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_BLOCKRING + {SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY {SPR_SGNS, FF_ADD|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_SIGNSPARK2}, // S_SIGNSPARK1 {SPR_SGNS, FF_ADD|FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_SIGNSPARK3}, // S_SIGNSPARK2 diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 6528a2c08..af5e79d48 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -811,7 +811,7 @@ boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim) if (victim != attacker && !P_PlayerInPain(victimPlayer) && victimPlayer->flashing == 0) { // BLOW THAT SHIT THE FUCK UP with guard - if (K_PlayerEBrake(victimPlayer) && victimPlayer->spheres > 0) + if (K_PlayerGuard(victimPlayer)) //if (true) { victimHitlag = 2*victimHitlag; @@ -876,7 +876,7 @@ boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim) || victim->type == MT_BANANA || victim->type == MT_EGGMANITEM || victim->type == MT_BALLHOG || victim->type == MT_SSMINE || victim->type == MT_LANDMINE || victim->type == MT_SINK || victim->type == MT_GARDENTOP || victim->type == MT_DROPTARGET || victim->type == MT_BATTLECAPSULE - || victim->type == MT_MONITOR) + || victim->type == MT_MONITOR || victim->type == MT_SPECIAL_UFO) { // Monitor hack. We can hit monitors once per instawhip, no multihit shredding! // Damage values in Obj_MonitorGetDamage. diff --git a/src/k_kart.c b/src/k_kart.c index adc4512a7..f71700098 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -718,7 +718,7 @@ static void K_SpawnBumpForObjs(mobj_t *mobj1, mobj_t *mobj2) } } -static void K_PlayerJustBumped(player_t *player) +static void K_PlayerJustBumped(player_t *player, boolean guardbreak) { mobj_t *playerMobj = NULL; @@ -742,6 +742,13 @@ static void K_PlayerJustBumped(player_t *player) player->rmomy = playerMobj->momy - player->cmomy; } + if (guardbreak && K_PlayerGuard(player)) + { + S_StartSound(player->mo, sfx_s3k9e); + K_AddHitLag(player->mo, TICRATE, true); + player->instaShieldCooldown = 2*TICRATE; + } + player->justbumped = bumptime; player->spindash = 0; @@ -933,8 +940,8 @@ boolean K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2) K_SpawnBumpForObjs(mobj1, mobj2); - K_PlayerJustBumped(mobj1->player); - K_PlayerJustBumped(mobj2->player); + K_PlayerJustBumped(mobj1->player, true); + K_PlayerJustBumped(mobj2->player, true); return true; } @@ -1003,7 +1010,7 @@ boolean K_KartSolidBounce(mobj_t *bounceMobj, mobj_t *solidMobj) bounceMobj->momz = -bounceMobj->momz; K_SpawnBumpForObjs(bounceMobj, solidMobj); - K_PlayerJustBumped(bounceMobj->player); + K_PlayerJustBumped(bounceMobj->player, false); return true; } @@ -9797,6 +9804,11 @@ boolean K_PlayerEBrake(player_t *player) return false; } +boolean K_PlayerGuard(player_t *player) +{ + return (K_PlayerEBrake(player) && player->spheres > 0 && player->instaShieldCooldown == 0); +} + SINT8 K_Sliptiding(player_t *player) { if (player->mo->eflags & MFE_UNDERWATER) diff --git a/src/k_kart.h b/src/k_kart.h index 6bee97b4b..46f530900 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -178,6 +178,7 @@ SINT8 K_GetForwardMove(player_t *player); fixed_t K_GetNewSpeed(player_t *player); fixed_t K_3dKartMovement(player_t *player); boolean K_PlayerEBrake(player_t *player); +boolean K_PlayerGuard(player_t *player); SINT8 K_Sliptiding(player_t *player); boolean K_FastFallBounce(player_t *player); fixed_t K_PlayerBaseFriction(player_t *player, fixed_t original); diff --git a/src/objects/block.c b/src/objects/block.c index ad70ffd6d..bf54f908a 100644 --- a/src/objects/block.c +++ b/src/objects/block.c @@ -2,6 +2,7 @@ #include "../info.h" #include "../k_objects.h" #include "../p_local.h" +#include "../k_kart.h" void Obj_BlockRingThink (mobj_t *ring) { @@ -34,7 +35,7 @@ void Obj_BlockRingThink (mobj_t *ring) else ring->renderflags |= RF_DONTDRAW; - if (player->spheres == 0) + if (!K_PlayerGuard(player)) ring->renderflags |= RF_DONTDRAW; } } @@ -69,7 +70,7 @@ void Obj_BlockBodyThink (mobj_t *body) else body->renderflags |= RF_DONTDRAW; - if (player->spheres == 0) + if (!K_PlayerGuard(player)) body->renderflags |= RF_DONTDRAW; } } \ No newline at end of file diff --git a/src/objects/ufo.c b/src/objects/ufo.c index 7d8b2ea8e..7a4cf56c0 100644 --- a/src/objects/ufo.c +++ b/src/objects/ufo.c @@ -670,6 +670,7 @@ static UINT8 GetUFODamage(mobj_t *inflictor, UINT8 damageType) { case MT_JAWZ_SHIELD: case MT_ORBINAUT_SHIELD: + case MT_INSTAWHIP: { // Shields deal chip damage. return 10; diff --git a/src/p_inter.c b/src/p_inter.c index 7db485759..b598e9365 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2209,7 +2209,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da { sfx = sfx_grownd; } - else if (player->spheres > 0 && K_PlayerEBrake(player)) + else if (K_PlayerGuard(player)) { sfx = sfx_s3k3a; clash = true;