From 6e9c3cd864f642cb8a4d44317ec17a83aeef9776 Mon Sep 17 00:00:00 2001 From: lachablock Date: Tue, 20 Apr 2021 15:57:45 +1000 Subject: [PATCH] Lightning sparks when releasing purple/rainbow drifts --- src/deh_tables.c | 2 ++ src/info.c | 29 +++++++++++++++++++++++++++++ src/info.h | 3 +++ src/k_kart.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- src/p_mobj.c | 1 + 5 files changed, 82 insertions(+), 1 deletion(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 831098d43..a538d7e39 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3529,6 +3529,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi // Drift electricity "S_DRIFTELECTRICITY", + "S_DRIFTELECTRICSPARK", // Fast lines "S_FASTLINE1", @@ -5455,6 +5456,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_BRAKEDRIFT", "MT_DRIFTDUST", "MT_DRIFTELECTRICITY", + "MT_DRIFTELECTRICSPARK", "MT_ROCKETSNEAKER", // Rocket sneakers diff --git a/src/info.c b/src/info.c index e68bc0e95..53882452d 100644 --- a/src/info.c +++ b/src/info.c @@ -542,6 +542,7 @@ char sprnames[NUMSPRITES + 1][5] = "BDRF", // Brake drift sparks "DRWS", // Drift dust sparks "DREL", // Drift electricity + "DRES", // Drift electric sparks // Kart Items "RSHE", // Rocket sneaker @@ -4098,6 +4099,7 @@ state_t states[NUMSTATES] = {SPR_DRWS, FF_FULLBRIGHT|FF_TRANS20|3, 3, {NULL}, 0, 0, S_NULL}, // S_DRIFTWARNSPARK4 {SPR_DREL, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE|FF_GLOBALANIM, 2, {NULL}, 5, 2, S_NULL}, // S_DRIFTELECTRICITY + {SPR_DRES, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE, 20, {NULL}, 1, 10, S_NULL}, // S_DRIFTELECTRICSPARK {SPR_FAST, FF_PAPERSPRITE|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_FASTLINE2}, // S_FASTLINE1 {SPR_FAST, FF_PAPERSPRITE|FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_FASTLINE3}, // S_FASTLINE2 @@ -23503,6 +23505,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_DRIFTELECTRICSPARK + -1, // doomednum + S_DRIFTELECTRICSPARK, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // 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 + 4*FRACUNIT, // speed + 9*FRACUNIT, // radius + 37*FRACUNIT, // height + 0, // display offset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOCLIP|MF_NOCLIPTHING|MF_NOGRAVITY|MF_SCENERY|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 93231ebd2..894a84126 100644 --- a/src/info.h +++ b/src/info.h @@ -1094,6 +1094,7 @@ typedef enum sprite SPR_BDRF, // Brake drift sparks SPR_DRWS, // Drift dust sparks SPR_DREL, // Drift electricity + SPR_DRES, // Drift electric sparks // Kart Items SPR_RSHE, // Rocket sneaker @@ -4503,6 +4504,7 @@ typedef enum state // Drift electricity S_DRIFTELECTRICITY, + S_DRIFTELECTRICSPARK, // Fast lines S_FASTLINE1, @@ -6467,6 +6469,7 @@ typedef enum mobj_type MT_BRAKEDRIFT, MT_DRIFTDUST, MT_DRIFTELECTRICITY, + MT_DRIFTELECTRICSPARK, MT_ROCKETSNEAKER, diff --git a/src/k_kart.c b/src/k_kart.c index 1dbebc69f..f5cc25742 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3620,6 +3620,7 @@ UINT16 K_DriftSparkColor(player_t *player, INT32 charge) static void K_SpawnDriftElectricity(player_t *player) { UINT8 i; + UINT16 color = K_DriftSparkColor(player, player->kartstuff[k_driftcharge]); mobj_t *mo = player->mo; fixed_t verticalradius = FixedDiv(mo->radius/3, mo->scale); // P_SpawnMobjFromMobj will rescale fixed_t horizontalradius = FixedDiv(5*mo->radius/3, mo->scale); @@ -3650,7 +3651,7 @@ static void K_SpawnDriftElectricity(player_t *player) + P_ReturnThrustY(mo, horizonatalangle, horizontalradius); spark = P_SpawnMobjFromMobj(mo, x, y, 0, MT_DRIFTELECTRICITY); spark->angle = sparkangle; - spark->color = K_DriftSparkColor(player, player->kartstuff[k_driftcharge]); + spark->color = color; K_GenericExtraFlagsNoZAdjust(spark, mo); spark->spritexscale += scalefactor/3; @@ -3658,6 +3659,49 @@ static void K_SpawnDriftElectricity(player_t *player) } } +static void K_SpawnDriftElectricSparks(player_t *player) +{ + SINT8 hdir, vdir, i; + + mobj_t *mo = player->mo; + angle_t momangle = K_MomentumAngle(mo) + ANGLE_180; + fixed_t radius = 2 * FixedDiv(mo->radius, mo->scale); // P_SpawnMobjFromMobj will rescale + fixed_t x = P_ReturnThrustX(mo, momangle, radius); + fixed_t y = P_ReturnThrustY(mo, momangle, radius); + fixed_t z = FixedDiv(mo->height, 2 * mo->scale); // P_SpawnMobjFromMobj will rescale + + fixed_t sparkspeed = mobjinfo[MT_DRIFTELECTRICSPARK].speed; + fixed_t sparkradius = 2 * mobjinfo[MT_DRIFTELECTRICSPARK].radius; + UINT16 color = K_DriftSparkColor(player, player->kartstuff[k_driftcharge]); + + for (hdir = -1; hdir <= 1; hdir += 2) + { + for (vdir = -1; vdir <= 1; vdir += 2) + { + fixed_t hspeed = FixedMul(hdir * sparkspeed, mo->scale); // P_InstaThrust treats speed as absolute + fixed_t vspeed = vdir * sparkspeed; // P_SetObjectMomZ scales speed with object scale + angle_t sparkangle = mo->angle + ANGLE_45; + + for (i = 0; i < 4; i++) + { + fixed_t xoff = P_ReturnThrustX(mo, sparkangle, sparkradius); + fixed_t yoff = P_ReturnThrustY(mo, sparkangle, sparkradius); + mobj_t *spark = P_SpawnMobjFromMobj(mo, x + xoff, y + yoff, z, MT_DRIFTELECTRICSPARK); + + spark->angle = sparkangle; + spark->color = color; + P_InstaThrust(spark, mo->angle + ANGLE_90, hspeed); + P_SetObjectMomZ(spark, vspeed, false); + spark->momx += mo->momx; // copy player speed + spark->momy += mo->momy; + + sparkangle += ANGLE_90; + } + } + } + S_StartSound(mo, sfx_s3k45); +} + static void K_SpawnDriftSparks(player_t *player) { const INT32 dsone = K_GetKartDriftSparkValueForStage(player, 1); @@ -7436,6 +7480,7 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_driftboost] = 90; K_SpawnDriftBoostExplosion(player, 3); + K_SpawnDriftElectricSparks(player); } else if (player->kartstuff[k_driftcharge] >= dsfour) { @@ -7447,6 +7492,7 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_driftboost] = 160; K_SpawnDriftBoostExplosion(player, 4); + K_SpawnDriftElectricSparks(player); } } diff --git a/src/p_mobj.c b/src/p_mobj.c index f28485f66..949bfc656 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -5876,6 +5876,7 @@ static void P_MobjSceneryThink(mobj_t *mobj) mobj->renderflags ^= RF_DONTDRAW; break; case MT_SPINDASHWIND: + case MT_DRIFTELECTRICSPARK: mobj->renderflags ^= RF_DONTDRAW; break; case MT_VWREF: