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.
This commit is contained in:
James R 2022-05-07 23:56:52 -07:00
parent 364651ac39
commit 730e00ab19
5 changed files with 138 additions and 1 deletions

View file

@ -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",

View file

@ -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

View file

@ -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,

View file

@ -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)

View file

@ -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)
{