Implement particle spawn frequency, offset spawning by player num

This commit is contained in:
Sally Coolatta 2022-01-03 00:07:46 -05:00 committed by SinnamonLat
parent b6e935e51d
commit d1a308d38e

View file

@ -612,7 +612,7 @@ void K_SpawnSplashForMobj(mobj_t *mo, fixed_t impact)
See header file for description. See header file for description.
--------------------------------------------------*/ --------------------------------------------------*/
static void K_SpawnFootstepParticle(mobj_t *mo, t_footstep_t *fs) static void K_SpawnFootstepParticle(mobj_t *mo, t_footstep_t *fs, tic_t timer)
{ {
mobj_t *dust = NULL; mobj_t *dust = NULL;
angle_t pushAngle = ANGLE_MAX; angle_t pushAngle = ANGLE_MAX;
@ -621,6 +621,13 @@ static void K_SpawnFootstepParticle(mobj_t *mo, t_footstep_t *fs)
fixed_t speedValue = INT32_MAX; fixed_t speedValue = INT32_MAX;
fixed_t momH = INT32_MAX; fixed_t momH = INT32_MAX;
fixed_t momV = INT32_MAX; fixed_t momV = INT32_MAX;
fixed_t xOff = INT32_MAX;
fixed_t yOff = INT32_MAX;
if (timer % fs->frequency != 0)
{
return;
}
momentum = P_AproxDistance(mo->momx, mo->momy); momentum = P_AproxDistance(mo->momx, mo->momy);
@ -645,7 +652,7 @@ static void K_SpawnFootstepParticle(mobj_t *mo, t_footstep_t *fs)
pushAngle = K_MomentumAngle(mo) + ANGLE_180; pushAngle = K_MomentumAngle(mo) + ANGLE_180;
if ((leveltime / 2) & 1) if (((timer / fs->frequency) / 2) & 1)
{ {
tireAngle -= ANGLE_45; tireAngle -= ANGLE_45;
tireAngle -= P_RandomRange(0, fs->cone / ANG1) * ANG1; tireAngle -= P_RandomRange(0, fs->cone / ANG1) * ANG1;
@ -658,10 +665,13 @@ static void K_SpawnFootstepParticle(mobj_t *mo, t_footstep_t *fs)
pushAngle += P_RandomRange(0, fs->cone / ANG1) * ANG1; pushAngle += P_RandomRange(0, fs->cone / ANG1) * ANG1;
} }
xOff = P_RandomRange(-fs->spread / FRACUNIT, fs->spread / FRACUNIT) * FRACUNIT;
yOff = P_RandomRange(-fs->spread / FRACUNIT, fs->spread / FRACUNIT) * FRACUNIT;
dust = P_SpawnMobjFromMobj( dust = P_SpawnMobjFromMobj(
mo, mo,
(P_RandomRange(-2, 2) * FRACUNIT) + (24 * FINECOSINE(tireAngle >> ANGLETOFINESHIFT)), xOff + (24 * FINECOSINE(tireAngle >> ANGLETOFINESHIFT)),
(P_RandomRange(-2, 2) * FRACUNIT) + (24 * FINESINE(tireAngle >> ANGLETOFINESHIFT)), yOff + (24 * FINESINE(tireAngle >> ANGLETOFINESHIFT)),
0, fs->mobjType 0, fs->mobjType
); );
@ -687,7 +697,7 @@ static void K_SpawnFootstepParticle(mobj_t *mo, t_footstep_t *fs)
dust->color = fs->color; dust->color = fs->color;
} }
if ((fs->sfx != sfx_None) && (fs->sfxFreq > 0) && (leveltime % fs->sfxFreq == 0)) if ((fs->sfx != sfx_None) && (fs->sfxFreq > 0) && (timer % fs->sfxFreq == 0))
{ {
S_StartSound(mo, fs->sfx); S_StartSound(mo, fs->sfx);
} }
@ -700,6 +710,7 @@ static void K_SpawnFootstepParticle(mobj_t *mo, t_footstep_t *fs)
--------------------------------------------------*/ --------------------------------------------------*/
void K_HandleFootstepParticles(mobj_t *mo) void K_HandleFootstepParticles(mobj_t *mo)
{ {
tic_t timer = leveltime;
t_footstep_t *fs = NULL; t_footstep_t *fs = NULL;
if (mo == NULL || P_MobjWasRemoved(mo) == true) if (mo == NULL || P_MobjWasRemoved(mo) == true)
@ -723,15 +734,21 @@ void K_HandleFootstepParticles(mobj_t *mo)
fs = K_GetFootstepByIndex(mo->terrain->footstepID); fs = K_GetFootstepByIndex(mo->terrain->footstepID);
} }
if (fs == NULL || fs->mobjType == MT_NULL) if (fs == NULL || fs->mobjType == MT_NULL || fs->frequency <= 0)
{ {
// No particles to spawn. // No particles to spawn.
return; return;
} }
if (mo->player != NULL)
{
// Offset timer by player ID.
timer += mo->player - players;
}
// Idea for later: if different spawning styles are desired, // Idea for later: if different spawning styles are desired,
// we can put a switch case here! // we can put a switch case here!
K_SpawnFootstepParticle(mo, fs); K_SpawnFootstepParticle(mo, fs, timer);
} }
/*-------------------------------------------------- /*--------------------------------------------------
@ -780,7 +797,7 @@ static void K_SplashDefaults(t_splash_t *splash)
splash->pushH = FRACUNIT/4; splash->pushH = FRACUNIT/4;
splash->pushV = FRACUNIT/64; splash->pushV = FRACUNIT/64;
splash->spread = 2; splash->spread = 2*FRACUNIT;
splash->cone = ANGLE_11hh; splash->cone = ANGLE_11hh;
splash->numParticles = 8; splash->numParticles = 8;
@ -880,7 +897,7 @@ static void K_FootstepDefaults(t_footstep_t *footstep)
footstep->pushH = FRACUNIT/2; footstep->pushH = FRACUNIT/2;
footstep->pushV = FRACUNIT/32; footstep->pushV = FRACUNIT/32;
footstep->spread = 2; footstep->spread = 2*FRACUNIT;
footstep->cone = ANGLE_11hh; footstep->cone = ANGLE_11hh;
footstep->sfxFreq = 6; footstep->sfxFreq = 6;