From 8c273039ab325a8995c852f52919f9b8710c684e Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 1 May 2023 19:35:26 -0400 Subject: [PATCH] Add first pass at hitlag EFX Only 9-tic animation is here currently, so hitlag is forced to 9 tics for testing. --- src/deh_tables.c | 3 +++ src/info.c | 30 ++++++++++++++++++++++++ src/info.h | 4 ++++ src/k_kart.c | 60 +++++++++++++++++++++++++++++++++++++++++++++--- src/k_kart.h | 2 +- src/p_inter.c | 1 - 6 files changed, 95 insertions(+), 5 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 78aaeca84..b10d62564 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -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 diff --git a/src/info.c b/src/info.c index 360e3d887..c017c12ca 100644 --- a/src/info.c +++ b/src/info.c @@ -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 diff --git a/src/info.h b/src/info.h index f5f402566..35207dae8 100644 --- a/src/info.h +++ b/src/info.h @@ -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, diff --git a/src/k_kart.c b/src/k_kart.c index e3d5d5a2a..bd3b3d276 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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; } diff --git a/src/k_kart.h b/src/k_kart.h index ecf32b771..da966e4c9 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -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) diff --git a/src/p_inter.c b/src/p_inter.c index f1c8409e3..6199e36fd 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -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;