Add first pass at hitlag EFX

Only 9-tic animation is here currently, so hitlag is forced to 9 tics for testing.
This commit is contained in:
Sally Coolatta 2023-05-01 19:35:26 -04:00 committed by James R
parent a8a8d375c3
commit 8c273039ab
6 changed files with 95 additions and 5 deletions

View file

@ -4563,6 +4563,8 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_JANKSPARK3",
"S_JANKSPARK4",
"S_HITLAG_9",
// Broly Ki Orb
"S_BROLY1",
"S_BROLY2",
@ -5394,6 +5396,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_DRIFTELECTRICITY",
"MT_DRIFTELECTRICSPARK",
"MT_JANKSPARK",
"MT_HITLAG",
"MT_ROCKETSNEAKER", // Rocket sneakers

View file

@ -573,6 +573,7 @@ char sprnames[NUMSPRITES + 1][5] =
"DREL", // Drift electricity
"DRES", // Drift electric sparks
"JANK", // Stair janking sparks
"HFX9", // Hitlag stage 9
// Kart Items
"RSHE", // Rocket sneaker
@ -5236,6 +5237,8 @@ state_t states[NUMSTATES] =
{SPR_JANK, 0, 0, {A_SetCustomValue}, -1, 5, S_JANKSPARK4}, // S_JANKSPARK3
{SPR_JANK, 0, 0, {A_ChangeAngleRelative}, 180, 180, S_JANKSPARK2}, // S_JANKSPARK4
{SPR_HFX9, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE, 9, {NULL}, 8, 1, S_NULL}, // S_HITLAG_9
// Broly Ki Orb
{SPR_LSSJ, FF_REVERSESUBTRACT|FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_BROLY2}, // S_BROLY1
{SPR_NULL, 0, 5*TICRATE, {A_SSMineFlash}, 0, 0, S_NULL}, // S_BROLY2
@ -23478,6 +23481,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_HITLAG
-1, // doomednum
S_HITLAG_9, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
8, // speed
8*FRACUNIT, // radius
16*FRACUNIT, // height
1, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags
S_NULL // raisestate
},
{ // MT_ROCKETSNEAKER
-1, // doomednum
S_ROCKETSNEAKER_L, // spawnstate

View file

@ -1124,6 +1124,7 @@ typedef enum sprite
SPR_DREL, // Drift electricity
SPR_DRES, // Drift electric sparks
SPR_JANK, // Stair janking sparks
SPR_HFX9, // Hitlag: stage 9
// Kart Items
SPR_RSHE, // Rocket sneaker
@ -5666,6 +5667,8 @@ typedef enum state
S_JANKSPARK3,
S_JANKSPARK4,
S_HITLAG_9,
// Broly Ki Orb
S_BROLY1,
S_BROLY2,
@ -6516,6 +6519,7 @@ typedef enum mobj_type
MT_DRIFTELECTRICITY,
MT_DRIFTELECTRICSPARK,
MT_JANKSPARK,
MT_HITLAG,
MT_ROCKETSNEAKER,

View file

@ -3650,6 +3650,56 @@ void K_AddHitLag(mobj_t *mo, INT32 tics, boolean fromDamage)
}
}
static void K_SpawnHitLagEFX(mobj_t *mo1, mobj_t *mo2, INT32 tics)
{
mobj_t *spark = NULL;
vector3_t offset = { 0, 0, 0 };
INT32 i;
I_Assert(P_MobjWasRemoved(mo1) == false);
P_StartQuakeFromMobj(tics, tics * 2 * mapobjectscale, 512 * mapobjectscale, mo1);
if (P_MobjWasRemoved(mo2) == false)
{
offset.x = (mo2->x - mo1->x) / 2;
offset.y = (mo2->y - mo1->y) / 2;
offset.z = (P_GetMobjHead(mo2) - P_GetMobjHead(mo1)) / 2;
}
else
{
offset.z = mo1->height;
}
offset.x = FixedDiv(offset.x, mapobjectscale);
offset.y = FixedDiv(offset.y, mapobjectscale);
offset.z = FixedDiv(offset.z, mapobjectscale);
for (i = 0; i < 2; i++)
{
spark = P_SpawnMobjFromMobj(
mo1,
offset.x, offset.y, offset.z,
MT_HITLAG
);
P_SetTarget(&spark->target, mo1);
spark->destscale *= 3;
P_SetScale(spark, spark->scale * 3);
spark->hitlag = 0;
spark->angle = R_PointToAngle2(
mo1->x, mo1->y,
spark->x, spark->y
);
if (i & 1)
{
spark->angle += ANGLE_90;
}
}
}
void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fromDamage)
{
INT32 finalTics = tics;
@ -3690,8 +3740,15 @@ void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fromDam
}
}
finalTics = 9;
K_AddHitLag(mo1, finalTics, fromDamage);
K_AddHitLag(mo2, finalTics, false); // mo2 is the inflictor, so don't use the damage property.
if (P_MobjWasRemoved(mo1) == false && fromDamage == true)
{
K_SpawnHitLagEFX(mo1, mo2, finalTics);
}
}
void K_AwardPlayerRings(player_t *player, INT32 rings, boolean overload)
@ -3956,7 +4013,6 @@ void K_TumblePlayer(player_t *player, mobj_t *inflictor, mobj_t *source)
player->mo->momz = K_TumbleZ(player->mo, player->tumbleHeight * FRACUNIT);
P_SetPlayerMobjState(player->mo, S_KART_SPINOUT);
P_StartQuakeFromMobj(10, 64 * player->mo->scale, 512 * player->mo->scale, player->mo);
}
angle_t K_StumbleSlope(angle_t angle, angle_t pitch, angle_t roll)
@ -3995,7 +4051,6 @@ void K_StumblePlayer(player_t *player)
player->mo->momz = K_TumbleZ(player->mo, player->tumbleHeight * FRACUNIT);
P_SetPlayerMobjState(player->mo, S_KART_SPINOUT);
P_StartQuakeFromMobj(10, 64 * player->mo->scale, 512 * player->mo->scale, player->mo);
// Reset slope.
player->mo->pitch = player->mo->roll = 0;
@ -4470,7 +4525,6 @@ INT32 K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source) // A
player->mo->momz = (117 * player->mo->momz) / 200;
P_SetPlayerMobjState(player->mo, S_KART_SPINOUT);
P_StartQuakeFromMobj(5, 64 * player->mo->scale, 512 * player->mo->scale, player->mo);
return ringburst;
}

View file

@ -23,7 +23,7 @@ Make sure this matches the actual number of states
*/
#define KART_NUMINVSPARKLESANIM 12
#define MAXHITLAGTICS 18 //12
#define MAXHITLAGTICS (20)
#define HITLAGJITTERS (FRACUNIT / 20)
#define GROW_SCALE (2*FRACUNIT)

View file

@ -2521,7 +2521,6 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
ringburst = K_ExplodePlayer(player, inflictor, source);
break;
case DMG_WIPEOUT:
P_StartQuakeFromMobj(5, 32 * player->mo->scale, 512 * player->mo->scale, player->mo);
K_SpinPlayer(player, inflictor, source, KSPIN_WIPEOUT);
K_KartPainEnergyFling(player);
break;