mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-04-28 04:51:42 +00:00
Shield VFX
This commit is contained in:
parent
a3d954e4ef
commit
6f02923d89
5 changed files with 42 additions and 19 deletions
|
|
@ -789,8 +789,8 @@ boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2)
|
||||||
|
|
||||||
boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim)
|
boolean K_InstaWhipCollide(mobj_t *shield, mobj_t *victim)
|
||||||
{
|
{
|
||||||
const int victimHitlag = 10;
|
int victimHitlag = 10;
|
||||||
const int attackerHitlag = 4;
|
int attackerHitlag = 4;
|
||||||
|
|
||||||
// EV1 is used to indicate that we should no longer hit monitors.
|
// EV1 is used to indicate that we should no longer hit monitors.
|
||||||
// EV2 indicates we should no longer hit anything.
|
// 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)
|
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_PlayerEBrake(victimPlayer) && victimPlayer->spheres > 0)
|
||||||
|
//if (true)
|
||||||
{
|
{
|
||||||
|
victimHitlag = 2*victimHitlag;
|
||||||
|
|
||||||
if (P_PlayerInPain(attackerPlayer))
|
if (P_PlayerInPain(attackerPlayer))
|
||||||
return false; // never punish shield more than once
|
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;
|
shield->flags |= MF_NOCLIPTHING;
|
||||||
|
|
||||||
attacker->renderflags &= ~RF_DONTDRAW;
|
attacker->renderflags &= ~RF_DONTDRAW;
|
||||||
|
attackerPlayer->spindashboost = 0;
|
||||||
|
attackerPlayer->sneakertimer = 0;
|
||||||
attackerPlayer->instaShieldCooldown = TICRATE*2;
|
attackerPlayer->instaShieldCooldown = TICRATE*2;
|
||||||
attackerPlayer->flashing = 0;
|
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);
|
P_DamageMobj(attacker, victim, victim, 1, DMG_STING);
|
||||||
|
|
||||||
S_StartSound(victim, sfx_mbv92);
|
S_StartSound(victim, sfx_mbv92);
|
||||||
K_AddHitLag(attacker, 2*victimHitlag, true);
|
K_AddHitLag(attacker, victimHitlag, true);
|
||||||
K_AddHitLag(victim, attackerHitlag, false);
|
K_AddHitLag(victim, attackerHitlag, false);
|
||||||
attacker->hitlag = std::min(attacker->hitlag, 2*victimHitlag);
|
|
||||||
shield->hitlag = attacker->hitlag;
|
shield->hitlag = attacker->hitlag;
|
||||||
|
|
||||||
|
K_DoPowerClash(shield, victim);
|
||||||
|
|
||||||
shield->extravalue2 = 1;
|
shield->extravalue2 = 1;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if you're here, you're getting hit
|
||||||
// Damage is a bit hacky, we want only a small loss-of-control
|
// Damage is a bit hacky, we want only a small loss-of-control
|
||||||
// while still behaving as if it's a "real" hit.
|
// while still behaving as if it's a "real" hit.
|
||||||
P_PlayRinglossSound(victim);
|
P_PlayRinglossSound(victim);
|
||||||
|
|
@ -967,12 +980,13 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2)
|
||||||
|| (t1->player->invincibilitytimer > 0)
|
|| (t1->player->invincibilitytimer > 0)
|
||||||
|| (t1->player->flamedash > 0 && t1->player->itemtype == KITEM_FLAMESHIELD)
|
|| (t1->player->flamedash > 0 && t1->player->itemtype == KITEM_FLAMESHIELD)
|
||||||
|| (t1->player->curshield == KSHIELD_TOP && !K_IsHoldingDownTop(t1->player))
|
|| (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))
|
if (canClash(t1, t2) && canClash(t2, t1))
|
||||||
{
|
{
|
||||||
K_DoPowerClash(t1->player, t2->player);
|
K_DoPowerClash(t1, t2);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
22
src/k_kart.c
22
src/k_kart.c
|
|
@ -3606,25 +3606,27 @@ void K_DoInstashield(player_t *player)
|
||||||
P_SetTarget(&layerb->target, player->mo);
|
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;
|
mobj_t *clash;
|
||||||
|
|
||||||
// short-circuit instashield for vfx visibility
|
// short-circuit instashield for vfx visibility
|
||||||
t1->instashield = 1;
|
if (t1->player)
|
||||||
t2->instashield = 1;
|
t1->player->instashield = 1;
|
||||||
|
if (t2->player)
|
||||||
|
t2->player->instashield = 1;
|
||||||
|
|
||||||
S_StartSound(t1->mo, sfx_parry);
|
S_StartSound(t1, sfx_parry);
|
||||||
K_AddHitLag(t1->mo, 6, false);
|
K_AddHitLag(t1, 6, false);
|
||||||
K_AddHitLag(t2->mo, 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)...
|
// needs to handle mixed scale collisions (t1 grow t2 invinc)...
|
||||||
clash->z = clash->z + (t1->mo->height/4) + (t2->mo->height/4);
|
clash->z = clash->z + (t1->height/4) + (t2->height/4);
|
||||||
clash->angle = R_PointToAngle2(clash->x, clash->y, t1->mo->x, t1->mo->y) + ANGLE_90;
|
clash->angle = R_PointToAngle2(clash->x, clash->y, t1->x, t1->y) + ANGLE_90;
|
||||||
|
|
||||||
// Shrink over time (accidental behavior that looked good)
|
// 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);
|
P_SetScale(clash, 3*clash->destscale/2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fromDamage);
|
||||||
void K_AwardPlayerRings(player_t *player, INT32 rings, boolean overload);
|
void K_AwardPlayerRings(player_t *player, INT32 rings, boolean overload);
|
||||||
void K_DoInstashield(player_t *player);
|
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_BattleAwardHit(player_t *player, player_t *victim, mobj_t *inflictor, UINT8 bumpersRemoved);
|
||||||
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);
|
||||||
|
|
|
||||||
|
|
@ -2188,6 +2188,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
||||||
if (!force)
|
if (!force)
|
||||||
{
|
{
|
||||||
boolean invincible = true;
|
boolean invincible = true;
|
||||||
|
boolean clash = false;
|
||||||
sfxenum_t sfx = sfx_None;
|
sfxenum_t sfx = sfx_None;
|
||||||
|
|
||||||
if (!(gametyperules & GTR_BUMPERS))
|
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))
|
else if (player->spheres > 0 && K_PlayerEBrake(player))
|
||||||
{
|
{
|
||||||
sfx = sfx_s3k3a;
|
sfx = sfx_s3k3a;
|
||||||
player->spheres = max(player->spheres - 10, 0);
|
clash = true;
|
||||||
}
|
}
|
||||||
else if (player->hyudorotimer > 0)
|
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);
|
S_StartSound(target, sfx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (clash)
|
||||||
|
{
|
||||||
|
player->spheres = max(player->spheres - 10, 0);
|
||||||
|
K_DoPowerClash(target, inflictor);
|
||||||
|
}
|
||||||
|
|
||||||
// Full invulnerability
|
// Full invulnerability
|
||||||
K_DoInstashield(player);
|
K_DoInstashield(player);
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@
|
||||||
#include "k_kart.h" // HITLAGJITTERS
|
#include "k_kart.h" // HITLAGJITTERS
|
||||||
#include "r_fps.h"
|
#include "r_fps.h"
|
||||||
|
|
||||||
#define MINZ (FRACUNIT*16)
|
#define MINZ (FRACUNIT*4)
|
||||||
#define BASEYCENTER (BASEVIDHEIGHT/2)
|
#define BASEYCENTER (BASEVIDHEIGHT/2)
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue