Ironman: move transform VFX into function for reuse

This commit is contained in:
AJ Martinez 2022-10-31 19:14:30 -07:00
parent 8d2d6bfc78
commit 770378eea0
4 changed files with 54 additions and 71 deletions

View file

@ -2727,6 +2727,47 @@ void K_SpawnBumpEffect(mobj_t *mo)
S_StartSound(mo, sfx_s3k49);
}
void K_SpawnMagicianParticles(mobj_t *mo, int spread)
{
INT32 i;
mobj_t *target = mo->target;
if (P_MobjWasRemoved(target))
target = mo;
for (i = 0; i < 16; i++)
{
fixed_t hmomentum = P_RandomRange(PR_DECORATION, spread * -1, spread) * mo->scale;
fixed_t vmomentum = P_RandomRange(PR_DECORATION, spread * -1, spread) * mo->scale;
UINT16 color = P_RandomKey(PR_DECORATION, numskincolors);
fixed_t ang = FixedAngle(P_RandomRange(PR_DECORATION, 0, 359)*FRACUNIT);
SINT8 flip = 1;
mobj_t *dust;
if (i & 1)
ang -= ANGLE_90;
else
ang += ANGLE_90;
dust = P_SpawnMobjFromMobj(mo,
FixedMul(mo->radius, FINECOSINE(ang >> ANGLETOFINESHIFT)),
FixedMul(mo->radius, FINESINE(ang >> ANGLETOFINESHIFT)),
target->height, (i%3 == 0) ? MT_SIGNSPARKLE : MT_SPINDASHDUST
);
flip = P_MobjFlip(dust);
dust->momx = target->momx + FixedMul(hmomentum, FINECOSINE(ang >> ANGLETOFINESHIFT));
dust->momy = target->momy + FixedMul(hmomentum, FINESINE(ang >> ANGLETOFINESHIFT));
dust->momz = vmomentum * flip;
dust->scale = dust->scale*4;
dust->frame |= FF_SUBTRACT|FF_TRANS90;
dust->color = color;
dust->colorized = true;
}
}
static SINT8 K_GlanceAtPlayers(player_t *glancePlayer)
{
const fixed_t maxdistance = FixedMul(1280 * mapobjectscale, K_GetKartGameSpeedScalar(gamespeed));

View file

@ -110,6 +110,7 @@ void K_SpawnBoostTrail(player_t *player);
void K_SpawnSparkleTrail(mobj_t *mo);
void K_SpawnWipeoutTrail(mobj_t *mo);
void K_SpawnDraftDust(mobj_t *mo);
void K_SpawnMagicianParticles(mobj_t *mo, int spread);
void K_DriftDustHandling(mobj_t *spawner);
void K_Squish(mobj_t *mo);
mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, INT32 defaultDir, INT32 altthrow, angle_t angleOffset);

View file

@ -7613,11 +7613,13 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
{
fixed_t destx, desty, fakeangle;
fixed_t zoff = 0;
INT32 j;
// EV1: rotation rate
// EV2: lifetime
// cusval: should play sounds (limit 1)
// cusval: responsible for disappear FX (should only happen once)
// S_MAGICANBOX: sides, starting angle is set in the spawner (SetRandomFakePlayerSkin)
// S_MAGICIANBOX_TOP, S_MAGICIANBOX_BOTTOM: splats with their own offset sprite sets
mobj->extravalue2--;
@ -7657,37 +7659,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
S_StartSound(mobj, sfx_kc2e);
S_StartSound(mobj, sfx_s3k9f);
for (j = 0; j < 16; j++)
{
fixed_t hmomentum = P_RandomRange(PR_DECORATION, -5, 5) * mobj->scale;
fixed_t vmomentum = P_RandomRange(PR_DECORATION, -5, 5) * mobj->scale;
UINT16 color = P_RandomKey(PR_DECORATION, numskincolors);
fixed_t ang = FixedAngle(P_RandomRange(PR_DECORATION, 0, 359)*FRACUNIT);
SINT8 flip = 1;
mobj_t *dust;
if (j & 1)
ang -= ANGLE_90;
else
ang += ANGLE_90;
dust = P_SpawnMobjFromMobj(mobj,
FixedMul(mobj->radius, FINECOSINE(ang >> ANGLETOFINESHIFT)),
FixedMul(mobj->radius, FINESINE(ang >> ANGLETOFINESHIFT)),
mobj->target->height, (j%3 == 0) ? MT_SIGNSPARKLE : MT_SPINDASHDUST
);
flip = P_MobjFlip(dust);
dust->momx = mobj->target->momx + FixedMul(hmomentum, FINECOSINE(ang >> ANGLETOFINESHIFT));
dust->momy = mobj->target->momy + FixedMul(hmomentum, FINESINE(ang >> ANGLETOFINESHIFT));
dust->momz = vmomentum * flip;
dust->scale = dust->scale*4;
dust->frame |= FF_SUBTRACT|FF_TRANS90;
dust->color = color;
dust->colorized = true;
}
K_SpawnMagicianParticles(mobj, 5);
return true;
}
else

View file

@ -363,15 +363,14 @@ void SetRandomFakePlayerSkin(player_t* player, boolean fast)
S_StartSound(player->mo, sfx_cdfm44);
mobj_t *parent = player->mo;
fixed_t rad = FixedDiv(FixedHypot(parent->radius, parent->radius), parent->scale);
fixed_t baseangle = P_RandomRange(PR_DECORATION, 0, 359);
INT32 j, k;
INT32 j;
for (k = 0; k < 6; k++)
for (j = 0; j < 6; j++) // 0-3 = sides, 4 = top, 5 = bottom
{
mobj_t *box = P_SpawnMobjFromMobj(parent, 0, 0, 0, MT_MAGICIANBOX);
box->target = parent;
box->angle = FixedAngle((baseangle + k*90) * FRACUNIT);
box->angle = FixedAngle((baseangle + j*90) * FRACUNIT);
box->flags2 |= MF2_AMBUSH;
if (fast)
{
@ -383,50 +382,20 @@ void SetRandomFakePlayerSkin(player_t* player, boolean fast)
box->extravalue1 = 1;
box->extravalue2 = 3*TICRATE/2;
}
if (k == 0)
if (j == 0)
box->cusval = 1; // Should play sounds when disappearing
else
box->cusval = 0;
if (k > 3)
if (j > 3)
{
P_SetMobjState(box, (k == 4) ? S_MAGICIANBOX_TOP : S_MAGICIANBOX_BOTTOM);
P_SetMobjState(box, (j == 4) ? S_MAGICIANBOX_TOP : S_MAGICIANBOX_BOTTOM);
box->renderflags |= RF_NOSPLATBILLBOARD;
box->angle = FixedAngle(baseangle*FRACUNIT);
}
}
for (j = 0; j < 16; j++)
{
fixed_t hmomentum = P_RandomRange(PR_DECORATION, -10, 10) * parent->scale;
fixed_t vmomentum = P_RandomRange(PR_DECORATION, -10, 10) * parent->scale;
UINT16 color = P_RandomKey(PR_DECORATION, numskincolors);
angle_t ang = FixedAngle(P_RandomRange(PR_DECORATION, 0, 359)*FRACUNIT);
SINT8 flip = 1;
mobj_t *dust;
if (j & 1)
ang -= ANGLE_90;
else
ang += ANGLE_90;
dust = P_SpawnMobjFromMobj(parent,
FixedMul(rad, FINECOSINE(ang >> ANGLETOFINESHIFT)),
FixedMul(rad, FINESINE(ang >> ANGLETOFINESHIFT)),
parent->height, (j%3 == 0) ? MT_SIGNSPARKLE : MT_SPINDASHDUST
);
flip = P_MobjFlip(dust);
dust->momx = parent->momx + FixedMul(hmomentum, FINECOSINE(ang >> ANGLETOFINESHIFT));
dust->momy = parent->momy + FixedMul(hmomentum, FINESINE(ang >> ANGLETOFINESHIFT));
dust->momz = vmomentum * flip;
dust->scale = dust->scale*4;
dust->frame |= FF_SUBTRACT|FF_TRANS90;
dust->color = color;
dust->colorized = true;
}
K_SpawnMagicianParticles(player->mo, 10);
}
}