From 730e00ab1901cd1413ebe3b79d7f2f5c146e510e Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 7 May 2022 23:56:52 -0700 Subject: [PATCH] Brake dust - Spawns outward from both front wheels, from outer wheel only if brake-drifting. - Scales with speed, up to 200%. Also applies to drift sparks. --- src/deh_tables.c | 5 +++ src/info.c | 31 ++++++++++++++++ src/info.h | 6 ++++ src/k_kart.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++- src/p_mobj.c | 3 ++ 5 files changed, 138 insertions(+), 1 deletion(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index ba216a481..c5acec7f8 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3307,6 +3307,10 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi // Brake drift sparks "S_BRAKEDRIFT", + // Brake dust + "S_BRAKEDUST1", + "S_BRAKEDUST2", + // Drift Smoke "S_DRIFTDUST1", "S_DRIFTDUST2", @@ -5259,6 +5263,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_WIPEOUTTRAIL", "MT_DRIFTSPARK", "MT_BRAKEDRIFT", + "MT_BRAKEDUST", "MT_DRIFTDUST", "MT_DRIFTELECTRICITY", "MT_DRIFTELECTRICSPARK", diff --git a/src/info.c b/src/info.c index 3fb87a000..917d26bc6 100644 --- a/src/info.c +++ b/src/info.c @@ -542,6 +542,7 @@ char sprnames[NUMSPRITES + 1][5] = "WIPD", // Wipeout dust trail "DRIF", // Drift Sparks "BDRF", // Brake drift sparks + "BRAK", // Brake dust "DRWS", // Drift dust sparks "DREL", // Drift electricity "DRES", // Drift electric sparks @@ -3883,6 +3884,9 @@ state_t states[NUMSTATES] = {SPR_BDRF, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE, -1, {NULL}, 5, 2, S_BRAKEDRIFT}, // S_BRAKEDRIFT + {SPR_BRAK, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_BRAKEDUST2}, // S_BRAKEDUST1 + {SPR_BRAK, FF_FULLBRIGHT|FF_ANIMATE, 7, {NULL}, 6, 1, S_NULL}, // S_BRAKEDUST2 + {SPR_DUST, 0, 3, {NULL}, 0, 0, S_DRIFTDUST2}, // S_DRIFTDUST1 {SPR_DUST, 1, 3, {NULL}, 0, 0, S_DRIFTDUST3}, // S_DRIFTDUST2 {SPR_DUST, FF_TRANS20|2, 3, {NULL}, 0, 0, S_DRIFTDUST4}, // S_DRIFTDUST3 @@ -22951,6 +22955,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_BRAKEDUST + -1, // doomednum + S_BRAKEDUST1, // 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 + 8*FRACUNIT, // height + 1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_DONTENCOREMAP|MF_NOSQUISH, // flags + S_NULL // raisestate + }, + { // MT_DRIFTDUST -1, // doomednum S_DRIFTDUST1, // spawnstate diff --git a/src/info.h b/src/info.h index fc53d7e08..5e4ef6418 100644 --- a/src/info.h +++ b/src/info.h @@ -1089,6 +1089,7 @@ typedef enum sprite SPR_WIPD, // Wipeout dust trail SPR_DRIF, // Drift Sparks SPR_BDRF, // Brake drift sparks + SPR_BRAK, // Brake brak SPR_DRWS, // Drift dust sparks SPR_DREL, // Drift electricity SPR_DRES, // Drift electric sparks @@ -4289,6 +4290,10 @@ typedef enum state // Brake drift sparks S_BRAKEDRIFT, + // Brake dust + S_BRAKEDUST1, + S_BRAKEDUST2, + // Drift Smoke S_DRIFTDUST1, S_DRIFTDUST2, @@ -6278,6 +6283,7 @@ typedef enum mobj_type MT_WIPEOUTTRAIL, MT_DRIFTSPARK, MT_BRAKEDRIFT, + MT_BRAKEDUST, MT_DRIFTDUST, MT_DRIFTELECTRICITY, MT_DRIFTELECTRICSPARK, diff --git a/src/k_kart.c b/src/k_kart.c index 4fdfee4f0..83f654545 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2029,6 +2029,17 @@ void K_SpawnDashDustRelease(player_t *player) } } +static fixed_t K_GetBrakeFXScale(player_t *player) +{ + fixed_t s = FixedDiv(player->speed, + K_GetKartSpeed(player, false)); + + s = max(s, FRACUNIT); + s = min(s, 2*FRACUNIT); + + return s; +} + static void K_SpawnBrakeDriftSparks(player_t *player) // Be sure to update the mobj thinker case too! { mobj_t *sparks; @@ -2041,11 +2052,85 @@ static void K_SpawnBrakeDriftSparks(player_t *player) // Be sure to update the m // This avoids needing to dupe code if we don't need it. sparks = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BRAKEDRIFT); P_SetTarget(&sparks->target, player->mo); - P_SetScale(sparks, (sparks->destscale = player->mo->scale)); + P_SetScale(sparks, (sparks->destscale = FixedMul(K_GetBrakeFXScale(player), player->mo->scale))); K_MatchGenericExtraFlags(sparks, player->mo); sparks->renderflags |= RF_DONTDRAW; } +static void +spawn_brake_dust +( mobj_t * master, + angle_t aoff, + int radf, + fixed_t scale) +{ + const fixed_t rad = radf * master->radius; + + const angle_t a = master->angle + aoff; + + mobj_t *spark = P_SpawnMobjFromMobj(master, + P_ReturnThrustX(NULL, a, rad), + P_ReturnThrustY(NULL, a, rad), 0, + MT_BRAKEDUST); + + spark->momx = master->momx; + spark->momy = master->momy; + spark->momz = P_GetMobjZMovement(master); + spark->angle = a - ANGLE_180; + spark->pitch = master->pitch; + spark->roll = master->roll; + + P_Thrust(spark, a, 16 * spark->scale); + + P_SetScale(spark, (spark->destscale = + FixedMul(scale, spark->scale))); +} + +static void K_SpawnBrakeVisuals(player_t *player) +{ + const fixed_t scale = K_GetBrakeFXScale(player); + + if (leveltime & 1) + { + angle_t aoff; + UINT8 radm; + + UINT8 wheel = 3; + + if (player->drift) + { + /* brake-drifting: dust flies from outer wheel */ + wheel ^= 1 << (player->drift < 0); + + aoff = 7 * ANG10; + radm = 8; + } + else + { + aoff = ANG30; + radm = 6; + } + + if (wheel & 1) + { + spawn_brake_dust(player->mo, + aoff, radm, scale); + } + + if (wheel & 2) + { + spawn_brake_dust(player->mo, + InvAngle(aoff), radm, scale); + } + } + + if (leveltime % 4 == 0) + S_StartSound(player->mo, sfx_s3k67); + + /* vertical shaking, scales with speed */ + player->mo->spriteyoffset = P_RandomFlip(2 * scale); +} + void K_SpawnDriftBoostClip(player_t *player) { mobj_t *clip; @@ -7418,6 +7503,13 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } K_KartEbrakeVisuals(player); + + if (K_GetKartButtons(player) & BT_BRAKE && + P_IsObjectOnGround(player->mo) && + K_GetKartSpeed(player, false) / 2 <= player->speed) + { + K_SpawnBrakeVisuals(player); + } } void K_KartPlayerAfterThink(player_t *player) diff --git a/src/p_mobj.c b/src/p_mobj.c index 64695a2af..c9f68b8f3 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7185,6 +7185,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->renderflags |= RF_DONTDRAW; } break; + case MT_BRAKEDUST: + //mobj->renderflags ^= RF_DONTDRAW; + break; case MT_JANKSPARK: if (!mobj->target) {