From f8b19a239f29185edeb0f938c3a34c7cd428f883 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 19 Jul 2020 18:04:11 -0700 Subject: [PATCH] Drift Boost Clip, bounces on floor and sparks, then flickers until it dies --- src/dehacked.c | 15 +++++++++++ src/info.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++- src/info.h | 18 ++++++++++++++ src/k_kart.c | 29 ++++++++++++++++++++++ src/k_kart.h | 1 + src/p_mobj.c | 15 +++++++++++ 6 files changed, 144 insertions(+), 1 deletion(-) diff --git a/src/dehacked.c b/src/dehacked.c index d8a3f6d01..336a407a1 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6586,6 +6586,19 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_DRIFTEXPLODE3", "S_DRIFTEXPLODE4", + // Drift boost clip + "S_DRIFTCLIP1", + "S_DRIFTCLIP2", + "S_DRIFTCLIP3", + "S_DRIFTCLIP4", + "S_DRIFTCLIP5", + "S_DRIFTCLIP6", + "S_DRIFTCLIP7", + "S_DRIFTCLIP8", + + // Drift boost clip spark + "S_DRIFTCLIPSPARK", + // Sneaker boost effect "S_BOOSTFLAME", "S_BOOSTSMOKESPAWNER", @@ -8093,6 +8106,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_FASTLINE", "MT_FASTDUST", "MT_DRIFTEXPLODE", + "MT_DRIFTCLIP", + "MT_DRIFTCLIPSPARK", "MT_BOOSTFLAME", "MT_BOOSTSMOKE", "MT_SNEAKERTRAIL", diff --git a/src/info.c b/src/info.c index ca367fa75..0a0f827dc 100644 --- a/src/info.c +++ b/src/info.c @@ -72,7 +72,7 @@ char sprnames[NUMSPRITES + 1][5] = "BFRT","OFRT","RFRT","PFRT","ASPK","HBST","HBSO","HBSF","WBLZ","WBLN", "FWRK","MXCL","RGSP","DRAF","GRES","OTFG","DBOS","EGOO","WTRL","XMS4", - "XMS5","FBUB","GCHA","CHEZ","VIEW" + "XMS5","FBUB","GCHA","CHEZ","VIEW","DBCL","DBNC", }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -2565,6 +2565,17 @@ state_t states[NUMSTATES] = {SPR_DBOS, FF_FULLBRIGHT|2, 2, {NULL}, 6, 1, S_DRIFTEXPLODE4}, // S_DRIFTEXPLODE3 {SPR_DBOS, FF_FULLBRIGHT|3, 2, {NULL}, 6, 1, S_DRIFTEXPLODE1}, // S_DRIFTEXPLODE4 + {SPR_DBCL, FF_FULLBRIGHT, 2, {NULL}, 6, 1, S_DRIFTCLIP2}, // S_DRIFTCLIP1 + {SPR_DBCL, FF_FULLBRIGHT|1, 2, {NULL}, 6, 1, S_DRIFTCLIP3}, // S_DRIFTCLIP2 + {SPR_DBCL, FF_FULLBRIGHT|2, 2, {NULL}, 6, 1, S_DRIFTCLIP4}, // S_DRIFTCLIP3 + {SPR_DBCL, FF_FULLBRIGHT|3, 2, {NULL}, 6, 1, S_DRIFTCLIP5}, // S_DRIFTCLIP4 + {SPR_DBCL, FF_FULLBRIGHT|4, 2, {NULL}, 6, 1, S_DRIFTCLIP6}, // S_DRIFTCLIP5 + {SPR_DBCL, FF_FULLBRIGHT|5, 2, {NULL}, 6, 1, S_DRIFTCLIP7}, // S_DRIFTCLIP6 + {SPR_DBCL, FF_FULLBRIGHT|6, 2, {NULL}, 6, 1, S_DRIFTCLIP8}, // S_DRIFTCLIP7 + {SPR_DBCL, FF_FULLBRIGHT|7, 2, {NULL}, 6, 1, S_DRIFTCLIP1}, // S_DRIFTCLIP8 + + {SPR_DBNC, FF_FULLBRIGHT|FF_ANIMATE, 14, {NULL}, 6, 1, S_NULL}, // S_DRIFTCLIPSPARK + {SPR_BOST, FF_FULLBRIGHT|FF_ANIMATE, TICRATE, {NULL}, 6, 1, S_BOOSTSMOKESPAWNER}, // S_BOOSTFLAME {SPR_NULL, 0, TICRATE/2, {NULL}, 0, 0, S_NULL}, // S_BOOSTSMOKESPAWNER @@ -15346,6 +15357,60 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_DRIFTCLIP + -1, // doomednum + S_DRIFTCLIP1, // 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 + 32*FRACUNIT, // radius + 64*FRACUNIT, // height + 1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_DONTENCOREMAP|MF_GRENADEBOUNCE|MF_BOUNCE, // flags + S_NULL // raisestate + }, + + { // MT_DRIFTCLIPSPARK + -1, // doomednum + S_DRIFTCLIPSPARK, // 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 + 32*FRACUNIT, // radius + 64*FRACUNIT, // height + 1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + { // MT_BOOSTFLAME -1, // doomednum S_BOOSTFLAME, // spawnstate diff --git a/src/info.h b/src/info.h index c79f2ae5e..a0bc61088 100644 --- a/src/info.h +++ b/src/info.h @@ -811,6 +811,9 @@ typedef enum sprite // First person view sprites; this is a sprite so that it can be replaced by a specialized MD2 draw later SPR_VIEW, + SPR_DBCL, // Drift boost clip + SPR_DBNC, // Drift boost clip's sparks + SPR_FIRSTFREESLOT, SPR_LASTFREESLOT = SPR_FIRSTFREESLOT + NUMSPRITEFREESLOTS - 1, NUMSPRITES @@ -3247,6 +3250,19 @@ typedef enum state S_DRIFTEXPLODE3, S_DRIFTEXPLODE4, + // Drift boost clip + S_DRIFTCLIP1, + S_DRIFTCLIP2, + S_DRIFTCLIP3, + S_DRIFTCLIP4, + S_DRIFTCLIP5, + S_DRIFTCLIP6, + S_DRIFTCLIP7, + S_DRIFTCLIP8, + + // Drift boost clip sparks + S_DRIFTCLIPSPARK, + // Sneaker boost effect S_BOOSTFLAME, S_BOOSTSMOKESPAWNER, @@ -4791,6 +4807,8 @@ typedef enum mobj_type MT_FASTLINE, MT_FASTDUST, MT_DRIFTEXPLODE, + MT_DRIFTCLIP, + MT_DRIFTCLIPSPARK, MT_BOOSTFLAME, MT_BOOSTSMOKE, MT_SNEAKERTRAIL, diff --git a/src/k_kart.c b/src/k_kart.c index d87d7f092..aed96ad27 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1648,6 +1648,35 @@ static void K_SpawnBrakeDriftSparks(player_t *player) // Be sure to update the m sparks->flags2 |= MF2_DONTDRAW; } +static fixed_t K_RandomFlip(fixed_t f) +{ + return ( ( leveltime & 1 ) ? f : -f ); +} + +void K_SpawnDriftBoostClip(player_t *player) +{ + mobj_t *clip; + fixed_t scale = 115*FRACUNIT/100; + + clip = P_SpawnMobj( + player->mo->x, + player->mo->y, + player->mo->z + player->mo->height, + MT_DRIFTCLIP + ); + + P_SetTarget(&clip->target, player->mo); + P_SetScale(clip, ( clip->destscale = FixedMul(scale, player->mo->scale) )); + K_MatchGenericExtraFlags(clip, player->mo); + + clip->fuse = 105; + clip->momz = 4 * clip->scale; + + P_InstaThrust(clip, player->mo->angle + + K_RandomFlip(P_RandomRange(FRACUNIT/2, FRACUNIT)), + FixedMul(scale, player->speed)); +} + /** \brief Handles the state changing for moving players, moved here to eliminate duplicate code \param player player data diff --git a/src/k_kart.h b/src/k_kart.h index 2508b6f63..f4bf84cc8 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -30,6 +30,7 @@ void K_FlipFromObject(mobj_t *mo, mobj_t *master); void K_MatchGenericExtraFlags(mobj_t *mo, mobj_t *master); void K_GenericExtraFlagsNoZAdjust(mobj_t *mo, mobj_t *master); void K_SpawnDashDustRelease(player_t *player); +void K_SpawnDriftBoostClip(player_t *player); void K_KartMoveAnimation(player_t *player); void K_KartPlayerHUDUpdate(player_t *player); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); diff --git a/src/p_mobj.c b/src/p_mobj.c index ac5b35121..8e15b3507 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2457,6 +2457,18 @@ static boolean P_ZMovement(mobj_t *mo) mom.z = P_MobjFlip(mo)*FixedMul(5*FRACUNIT, mo->scale); else if (mo->type == MT_SPINFIRE) // elemental shield fire is another exception here ; + else if (mo->type == MT_DRIFTCLIP) + { + mom.z = -mom.z/2; + if (abs(mom.z) > 4 * mo->scale / 3) + { + mobj_t *spark = P_SpawnMobj(mo->x, mo->y, mo->z, MT_DRIFTCLIPSPARK); + spark->momx = mo->momx/2; + spark->momy = mo->momy/2; + } + else + mo->flags2 ^= MF2_DONTDRAW; + } else if (mo->flags & MF_MISSILE) { if (!(mo->flags & MF_NOCLIP)) @@ -8338,6 +8350,9 @@ void P_MobjThinker(mobj_t *mobj) else if (mobj->fuse > 32) mobj->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); + if (mobj->fuse == 17 || mobj->fuse == 33)/* to red/blue */ + K_SpawnDriftBoostClip(mobj->target->player); + { player_t *p = NULL; if (mobj->target->target && mobj->target->target->player)