diff --git a/src/deh_tables.c b/src/deh_tables.c index a6a7c35cb..831098d43 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3527,6 +3527,9 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_DRIFTWARNSPARK3", "S_DRIFTWARNSPARK4", + // Drift electricity + "S_DRIFTELECTRICITY", + // Fast lines "S_FASTLINE1", "S_FASTLINE2", @@ -5451,6 +5454,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_DRIFTSPARK", "MT_BRAKEDRIFT", "MT_DRIFTDUST", + "MT_DRIFTELECTRICITY", "MT_ROCKETSNEAKER", // Rocket sneakers diff --git a/src/info.c b/src/info.c index 51cce3e7d..e68bc0e95 100644 --- a/src/info.c +++ b/src/info.c @@ -541,6 +541,7 @@ char sprnames[NUMSPRITES + 1][5] = "DRIF", // Drift Sparks "BDRF", // Brake drift sparks "DRWS", // Drift dust sparks + "DREL", // Drift electricity // Kart Items "RSHE", // Rocket sneaker @@ -4096,6 +4097,8 @@ state_t states[NUMSTATES] = {SPR_DRWS, FF_FULLBRIGHT|FF_TRANS20|2, 3, {NULL}, 0, 0, S_DRIFTWARNSPARK4}, // S_DRIFTWARNSPARK3 {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_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 {SPR_FAST, FF_PAPERSPRITE|FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_FASTLINE4}, // S_FASTLINE3 @@ -23473,6 +23476,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_DRIFTELECTRICITY + -1, // doomednum + S_DRIFTELECTRICITY, // 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 + 0, // speed + 16*FRACUNIT, // radius + 32*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 527dc5a05..93231ebd2 100644 --- a/src/info.h +++ b/src/info.h @@ -1093,6 +1093,7 @@ typedef enum sprite SPR_DRIF, // Drift Sparks SPR_BDRF, // Brake drift sparks SPR_DRWS, // Drift dust sparks + SPR_DREL, // Drift electricity // Kart Items SPR_RSHE, // Rocket sneaker @@ -4500,6 +4501,9 @@ typedef enum state S_DRIFTWARNSPARK3, S_DRIFTWARNSPARK4, + // Drift electricity + S_DRIFTELECTRICITY, + // Fast lines S_FASTLINE1, S_FASTLINE2, @@ -6462,6 +6466,7 @@ typedef enum mobj_type MT_DRIFTSPARK, MT_BRAKEDRIFT, MT_DRIFTDUST, + MT_DRIFTELECTRICITY, MT_ROCKETSNEAKER, diff --git a/src/k_kart.c b/src/k_kart.c index a6f6df049..6f8fd11b6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3573,14 +3573,18 @@ UINT16 K_DriftSparkColor(player_t *player, INT32 charge) else if (charge >= dsthree) { // Stage 3: Purple - if (charge <= dsthree+(32*3)) + if (charge <= dsthree+(16*3)) + { + color = SKINCOLOR_TAFFY; + } + else if (charge <= dsthree+(32*3)) { // transition - color = SKINCOLOR_ULTRAMARINE; + color = SKINCOLOR_MOONSET; } else { - color = SKINCOLOR_THISTLE; + color = SKINCOLOR_PURPLE; } } else if (charge >= dstwo) @@ -3613,6 +3617,30 @@ UINT16 K_DriftSparkColor(player_t *player, INT32 charge) return color; } +static void K_SpawnDriftElectricity(player_t *player) +{ + UINT8 i; + 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); + angle_t verticalangle = K_MomentumAngle(mo) + ANGLE_180; + + for (i = 0; i < 2; i++) + { + mobj_t *spark; + angle_t horizonatalangle = verticalangle + (2*i - 1) * ANGLE_90; + fixed_t x = P_ReturnThrustX(mo, verticalangle, verticalradius) + + P_ReturnThrustX(mo, horizonatalangle, horizontalradius); + fixed_t y = P_ReturnThrustY(mo, verticalangle, verticalradius) + + P_ReturnThrustY(mo, horizonatalangle, horizontalradius); + + spark = P_SpawnMobjFromMobj(mo, x, y, 0, MT_DRIFTELECTRICITY); + spark->angle = verticalangle + ANGLE_180;// + (2*i - 1) * ANGLE_22h; + spark->color = K_DriftSparkColor(player, player->kartstuff[k_driftcharge]); + K_GenericExtraFlagsNoZAdjust(spark, mo); + } +} + static void K_SpawnDriftSparks(player_t *player) { const INT32 dsone = K_GetKartDriftSparkValueForStage(player, 1); @@ -3758,6 +3786,11 @@ static void K_SpawnDriftSparks(player_t *player) K_MatchGenericExtraFlags(spark, player->mo); } + + if (player->kartstuff[k_driftcharge] >= dsthree) + { + K_SpawnDriftElectricity(player); + } } static void K_SpawnAIZDust(player_t *player)