From be1308b0cf9e32c42c2260cce27d629085d169bb Mon Sep 17 00:00:00 2001 From: NepDisk Date: Thu, 9 Jan 2025 20:14:17 -0500 Subject: [PATCH] New Drift Effect Much less of an eyesore then final RR while still looking cool! --- src/deh_tables.c | 1 + src/info.c | 2 ++ src/info.h | 2 ++ src/k_kart.c | 32 +++++++++++++++++++++++++++++++- src/p_mobj.c | 40 +++++++++++++++++++++++++++++++++++++--- 5 files changed, 73 insertions(+), 4 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index b0d40e690..8e0be3ffb 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3571,6 +3571,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi // Sneaker boost effect "S_BOOSTFLAME", + "S_DRIFTBOOSTFLAME", "S_BOOSTSMOKESPAWNER", "S_BOOSTSMOKE1", "S_BOOSTSMOKE2", diff --git a/src/info.c b/src/info.c index 97f38f658..76ae33ce1 100644 --- a/src/info.c +++ b/src/info.c @@ -527,6 +527,7 @@ char sprnames[NUMSPRITES + 1][5] = "FAST", // Speed boost trail "DSHR", // Speed boost dust release "BOST", // Sneaker booster flame + "DRPO", // Drift booster flame "BOSM", // Sneaker booster smoke "KFRE", // Sneaker fire trail "KINV", // Lighter invincibility sparkle trail @@ -4125,6 +4126,7 @@ state_t states[NUMSTATES] = {SPR_DSHR, FF_PAPERSPRITE|6, 1, {NULL}, 0, 0, S_NULL}, // S_FASTDUST7 {SPR_BOST, FF_FULLBRIGHT|FF_ANIMATE, TICRATE, {NULL}, 6, 1, S_BOOSTSMOKESPAWNER}, // S_BOOSTFLAME + {SPR_DRPO, FF_FULLBRIGHT|FF_ANIMATE|FF_ADD, TICRATE, {NULL}, 5, 2, S_NULL}, // S_DRIFTBOOSTFLAME {SPR_NULL, 0, TICRATE/2, {NULL}, 0, 0, S_NULL}, // S_BOOSTSMOKESPAWNER {SPR_BOSM, FF_TRANS50, 3, {NULL}, 0, 0, S_BOOSTSMOKE2}, // S_BOOSTSMOKE1 diff --git a/src/info.h b/src/info.h index 90218b413..8189b1237 100644 --- a/src/info.h +++ b/src/info.h @@ -1080,6 +1080,7 @@ typedef enum sprite SPR_FAST, // Speed boost trail SPR_DSHR, // Speed boost dust release SPR_BOST, // Sneaker booster flame + SPR_DRPO, // Drift booster flame SPR_BOSM, // Sneaker booster smoke SPR_KFRE, // Sneaker fire trail SPR_KINV, // Lighter invincibility sparkle trail @@ -4534,6 +4535,7 @@ typedef enum state // Sneaker boost effect S_BOOSTFLAME, + S_DRIFTBOOSTFLAME, S_BOOSTSMOKESPAWNER, S_BOOSTSMOKE1, S_BOOSTSMOKE2, diff --git a/src/k_kart.c b/src/k_kart.c index 66bae998e..f1d1d4db9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7978,6 +7978,31 @@ INT32 K_GetKartDriftSparkValueForStage(player_t *player, UINT8 stage) return (FixedMul(K_GetKartDriftSparkValue(player) * FRACUNIT, mul) / FRACUNIT); } +static void K_SpawnDriftEFX(player_t *player,SINT8 level) +{ + mobj_t *overlay = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BOOSTFLAME); + P_SetTarget(&overlay->target, player->mo); + P_SetScale(overlay, (overlay->destscale = player->mo->scale)); + K_FlipFromObject(overlay, player->mo); + overlay->extravalue1 = 1; + + if (level == 1) + { + overlay->color = SKINCOLOR_SAPPHIRE; + overlay->tics = overlay->tics/2; // Less time for blue drift + } + else if (level == 2) + { + overlay->color = SKINCOLOR_KETCHUP; + } + else if (level == 3) + { + overlay->extravalue2 = 1; + overlay->tics = 5*overlay->tics/2; // More time for rainbow drift + } + +} + static void K_KartDrift(player_t *player, boolean onground) { fixed_t minspeed = (10 * player->mo->scale); @@ -8009,6 +8034,7 @@ static void K_KartDrift(player_t *player, boolean onground) if (player->driftboost < 20) player->driftboost = 20; S_StartSound(player->mo, sfx_s23c); + K_SpawnDriftEFX(player, 1); player->driftcharge = 0; } else if ((player->drift != -5 && player->drift != 5) @@ -8018,6 +8044,8 @@ static void K_KartDrift(player_t *player, boolean onground) if (player->driftboost < 50) player->driftboost = 50; S_StartSound(player->mo, sfx_s23c); + S_StartSound(player->mo, sfx_kc5b); + K_SpawnDriftEFX(player, 2); player->driftcharge = 0; } else if ((player->drift != -5 && player->drift != 5) @@ -8026,7 +8054,9 @@ static void K_KartDrift(player_t *player, boolean onground) { if (player->driftboost < 125) player->driftboost = 125; - S_StartSound(player->mo, sfx_s23c); + S_StartSound(player->mo, sfx_kc5b); + S_StartSound(player->mo, sfx_kc3c); + K_SpawnDriftEFX(player, 3); player->driftcharge = 0; } diff --git a/src/p_mobj.c b/src/p_mobj.c index b259ef673..a15b1d276 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7151,12 +7151,46 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (p) { - if (p->sneakertimer > mobj->movecount) - P_SetMobjState(mobj, S_BOOSTFLAME); - mobj->movecount = p->sneakertimer; + if (mobj->extravalue1) + { + if (p->driftboost > mobj->movecount) + P_SetMobjState(mobj, S_DRIFTBOOSTFLAME); + mobj->movecount = p->driftboost; + + if (p->driftboost == 0) + { + P_RemoveMobj(mobj); + return false; + } + } + else + { + if (p->sneakertimer > mobj->movecount) + P_SetMobjState(mobj, S_BOOSTFLAME); + mobj->movecount = p->sneakertimer; + } } } + if (mobj->extravalue1) + { + + if (leveltime % 2 == 1) + { + mobj->frame |= FF_TRANS60; + } + else + { + mobj->frame &= ~FF_TRANS60; + } + + if (mobj->extravalue2) + { + mobj->color = K_RainbowColor(leveltime); + } + + } + if (mobj->state == &states[S_BOOSTSMOKESPAWNER]) { mobj_t *smoke = P_SpawnMobj(mobj->x, mobj->y, mobj->z+(8<