From 770378eea066bb1487ca149d7358441e8c7fd55e Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Mon, 31 Oct 2022 19:14:30 -0700 Subject: [PATCH] Ironman: move transform VFX into function for reuse --- src/k_kart.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/k_kart.h | 1 + src/p_mobj.c | 38 +++++--------------------------------- src/r_skins.c | 45 +++++++-------------------------------------- 4 files changed, 54 insertions(+), 71 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index dff8c406a..d8fe83541 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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)); diff --git a/src/k_kart.h b/src/k_kart.h index a5d2b0185..db280afc0 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -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); diff --git a/src/p_mobj.c b/src/p_mobj.c index 0967eff2e..c2ef43d05 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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 diff --git a/src/r_skins.c b/src/r_skins.c index 71ea80f1f..59156ba06 100644 --- a/src/r_skins.c +++ b/src/r_skins.c @@ -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); } }