Shield VFX

This commit is contained in:
AJ Martinez 2023-05-19 17:59:47 -07:00
parent a3d954e4ef
commit 6f02923d89
5 changed files with 42 additions and 19 deletions

View file

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

View file

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

View file

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

View file

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

View file

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