From 6f02923d8917dcea115a11e218750ff8693ee57a Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 19 May 2023 17:59:47 -0700 Subject: [PATCH] Shield VFX --- src/k_collide.cpp | 26 ++++++++++++++++++++------ src/k_kart.c | 22 ++++++++++++---------- src/k_kart.h | 2 +- src/p_inter.c | 9 ++++++++- src/r_things.c | 2 +- 5 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/k_collide.cpp b/src/k_collide.cpp index dc34a204d..6528a2c08 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -789,8 +789,8 @@ boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2) boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim) { - const int victimHitlag = 10; - const int attackerHitlag = 4; + int victimHitlag = 10; + int attackerHitlag = 4; // EV1 is used to indicate that we should no longer hit monitors. // EV2 indicates we should no longer hit anything. @@ -810,8 +810,12 @@ 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 (true) { + victimHitlag = 2*victimHitlag; + if (P_PlayerInPain(attackerPlayer)) return false; // never punish shield more than once @@ -825,22 +829,31 @@ boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim) shield->flags |= MF_NOCLIPTHING; attacker->renderflags &= ~RF_DONTDRAW; + attackerPlayer->spindashboost = 0; + attackerPlayer->sneakertimer = 0; attackerPlayer->instaShieldCooldown = TICRATE*2; attackerPlayer->flashing = 0; + mobj_t *broly = Obj_SpawnBrolyKi(victim, victimHitlag); + broly->extravalue2 = 16*mapobjectscale; + + P_PlayVictorySound(victim); + P_DamageMobj(attacker, victim, victim, 1, DMG_STING); S_StartSound(victim, sfx_mbv92); - K_AddHitLag(attacker, 2*victimHitlag, true); + K_AddHitLag(attacker, victimHitlag, true); K_AddHitLag(victim, attackerHitlag, false); - attacker->hitlag = std::min(attacker->hitlag, 2*victimHitlag); shield->hitlag = attacker->hitlag; + K_DoPowerClash(shield, victim); + shield->extravalue2 = 1; return true; } + // if you're here, you're getting hit // Damage is a bit hacky, we want only a small loss-of-control // while still behaving as if it's a "real" hit. P_PlayRinglossSound(victim); @@ -967,12 +980,13 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) || (t1->player->invincibilitytimer > 0) || (t1->player->flamedash > 0 && t1->player->itemtype == KITEM_FLAMESHIELD) || (t1->player->curshield == KSHIELD_TOP && !K_IsHoldingDownTop(t1->player)) - || (t1->player->bubbleblowup > 0); + || (t1->player->bubbleblowup > 0) + || (t1->player->spheres > 0 && K_PlayerEBrake(t1->player)); }; if (canClash(t1, t2) && canClash(t2, t1)) { - K_DoPowerClash(t1->player, t2->player); + K_DoPowerClash(t1, t2); return false; } diff --git a/src/k_kart.c b/src/k_kart.c index 4499ca04f..adc4512a7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3606,25 +3606,27 @@ void K_DoInstashield(player_t *player) P_SetTarget(&layerb->target, player->mo); } -void K_DoPowerClash(player_t *t1, player_t *t2) { +void K_DoPowerClash(mobj_t *t1, mobj_t *t2) { mobj_t *clash; // short-circuit instashield for vfx visibility - t1->instashield = 1; - t2->instashield = 1; + if (t1->player) + t1->player->instashield = 1; + if (t2->player) + t2->player->instashield = 1; - S_StartSound(t1->mo, sfx_parry); - K_AddHitLag(t1->mo, 6, false); - K_AddHitLag(t2->mo, 6, false); + S_StartSound(t1, sfx_parry); + K_AddHitLag(t1, 6, false); + K_AddHitLag(t2, 6, false); - clash = P_SpawnMobj((t1->mo->x/2) + (t2->mo->x/2), (t1->mo->y/2) + (t2->mo->y/2), (t1->mo->z/2) + (t2->mo->z/2), MT_POWERCLASH); + clash = P_SpawnMobj((t1->x/2) + (t2->x/2), (t1->y/2) + (t2->y/2), (t1->z/2) + (t2->z/2), MT_POWERCLASH); // needs to handle mixed scale collisions (t1 grow t2 invinc)... - clash->z = clash->z + (t1->mo->height/4) + (t2->mo->height/4); - clash->angle = R_PointToAngle2(clash->x, clash->y, t1->mo->x, t1->mo->y) + ANGLE_90; + clash->z = clash->z + (t1->height/4) + (t2->height/4); + clash->angle = R_PointToAngle2(clash->x, clash->y, t1->x, t1->y) + ANGLE_90; // Shrink over time (accidental behavior that looked good) - clash->destscale = (t1->mo->scale/2) + (t2->mo->scale/2); + clash->destscale = (t1->scale) + (t2->scale); P_SetScale(clash, 3*clash->destscale/2); } diff --git a/src/k_kart.h b/src/k_kart.h index 839cadc6c..6bee97b4b 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -90,7 +90,7 @@ void K_AddHitLag(mobj_t *mo, INT32 tics, boolean fromDamage); void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fromDamage); void K_AwardPlayerRings(player_t *player, INT32 rings, boolean overload); void K_DoInstashield(player_t *player); -void K_DoPowerClash(player_t *t1, player_t *t2); +void K_DoPowerClash(mobj_t *t1, mobj_t *t2); void K_BattleAwardHit(player_t *player, player_t *victim, mobj_t *inflictor, UINT8 bumpersRemoved); void K_RemoveGrowShrink(player_t *player); boolean K_IsBigger(mobj_t *compare, mobj_t *other); diff --git a/src/p_inter.c b/src/p_inter.c index 1196bd836..7db485759 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2188,6 +2188,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (!force) { boolean invincible = true; + boolean clash = false; sfxenum_t sfx = sfx_None; if (!(gametyperules & GTR_BUMPERS)) @@ -2211,7 +2212,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da else if (player->spheres > 0 && K_PlayerEBrake(player)) { sfx = sfx_s3k3a; - player->spheres = max(player->spheres - 10, 0); + clash = true; } else if (player->hyudorotimer > 0) ; @@ -2254,6 +2255,12 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da S_StartSound(target, sfx); } + if (clash) + { + player->spheres = max(player->spheres - 10, 0); + K_DoPowerClash(target, inflictor); + } + // Full invulnerability K_DoInstashield(player); return false; diff --git a/src/r_things.c b/src/r_things.c index 337b9c8cf..bc73df96e 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -49,7 +49,7 @@ #include "k_kart.h" // HITLAGJITTERS #include "r_fps.h" -#define MINZ (FRACUNIT*16) +#define MINZ (FRACUNIT*4) #define BASEYCENTER (BASEVIDHEIGHT/2) typedef struct