From 3b617337ee818339f71a767dc26fc03205766f68 Mon Sep 17 00:00:00 2001 From: Latapostrophe Date: Mon, 29 Mar 2021 00:27:56 +0200 Subject: [PATCH] Fancy rotating sparkles --- src/info.c | 48 ++++++++++++++++++++++++------------------------ src/info.h | 1 + src/k_kart.c | 28 +++++++++++++++++----------- src/p_enemy.c | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+), 35 deletions(-) diff --git a/src/info.c b/src/info.c index 3a33634c9..01d949383 100644 --- a/src/info.c +++ b/src/info.c @@ -4159,31 +4159,31 @@ state_t states[NUMSTATES] = {SPR_AIDU, FF_ANIMATE|FF_PAPERSPRITE, 5*2, {NULL}, 5, 2, S_NULL}, // S_KARTAIZDRIFTSTRAT - {SPR_KINV, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARTINVULN2}, // S_KARTINVULN1 - {SPR_KINV, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_KARTINVULN3}, // S_KARTINVULN2 - {SPR_KINV, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_KARTINVULN4}, // S_KARTINVULN3 - {SPR_KINV, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_KARTINVULN5}, // S_KARTINVULN4 - {SPR_KINV, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_KARTINVULN6}, // S_KARTINVULN5 - {SPR_KINV, FF_FULLBRIGHT|5, 1, {NULL}, 0, 0, S_KARTINVULN7}, // S_KARTINVULN6 - {SPR_KINV, FF_FULLBRIGHT|6, 1, {NULL}, 0, 0, S_KARTINVULN8}, // S_KARTINVULN7 - {SPR_KINV, FF_FULLBRIGHT|7, 1, {NULL}, 0, 0, S_KARTINVULN9}, // S_KARTINVULN8 - {SPR_KINV, FF_FULLBRIGHT|8, 1, {NULL}, 0, 0, S_KARTINVULN10}, // S_KARTINVULN9 - {SPR_KINV, FF_FULLBRIGHT|9, 1, {NULL}, 0, 0, S_KARTINVULN11}, // S_KARTINVULN10 - {SPR_KINV, FF_FULLBRIGHT|10, 1, {NULL}, 0, 0, S_KARTINVULN12}, // S_KARTINVULN11 - {SPR_KINV, FF_FULLBRIGHT|11, 1, {NULL}, 0, 0, S_NULL}, // S_KARTINVULN12 + {SPR_KINV, FF_FULLBRIGHT, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN2}, // S_KARTINVULN1 + {SPR_KINV, FF_FULLBRIGHT|1, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN3}, // S_KARTINVULN2 + {SPR_KINV, FF_FULLBRIGHT|2, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN4}, // S_KARTINVULN3 + {SPR_KINV, FF_FULLBRIGHT|3, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN5}, // S_KARTINVULN4 + {SPR_KINV, FF_FULLBRIGHT|4, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN6}, // S_KARTINVULN5 + {SPR_KINV, FF_FULLBRIGHT|5, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN7}, // S_KARTINVULN6 + {SPR_KINV, FF_FULLBRIGHT|6, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN8}, // S_KARTINVULN7 + {SPR_KINV, FF_FULLBRIGHT|7, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN9}, // S_KARTINVULN8 + {SPR_KINV, FF_FULLBRIGHT|8, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN10}, // S_KARTINVULN9 + {SPR_KINV, FF_FULLBRIGHT|9, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN11}, // S_KARTINVULN10 + {SPR_KINV, FF_FULLBRIGHT|10, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULN12}, // S_KARTINVULN11 + {SPR_KINV, FF_FULLBRIGHT|11, 1, {A_InvincSparkleRotate}, 0, 0, S_NULL}, // S_KARTINVULN12 - {SPR_KINB, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARTINVULNB2}, // S_KARTINVULNB1 - {SPR_KINB, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_KARTINVULNB3}, // S_KARTINVULNB2 - {SPR_KINB, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_KARTINVULNB4}, // S_KARTINVULNB3 - {SPR_KINB, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_KARTINVULNB5}, // S_KARTINVULNB4 - {SPR_KINB, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_KARTINVULNB6}, // S_KARTINVULNB5 - {SPR_KINB, FF_FULLBRIGHT|5, 1, {NULL}, 0, 0, S_KARTINVULNB7}, // S_KARTINVULNB6 - {SPR_KINB, FF_FULLBRIGHT|6, 1, {NULL}, 0, 0, S_KARTINVULNB8}, // S_KARTINVULNB7 - {SPR_KINB, FF_FULLBRIGHT|7, 1, {NULL}, 0, 0, S_KARTINVULNB9}, // S_KARTINVULNB8 - {SPR_KINB, FF_FULLBRIGHT|8, 1, {NULL}, 0, 0, S_KARTINVULNB10}, // S_KARTINVULNB9 - {SPR_KINB, FF_FULLBRIGHT|9, 1, {NULL}, 0, 0, S_KARTINVULNB11}, // S_KARTINVULNB10 - {SPR_KINB, FF_FULLBRIGHT|10, 1, {NULL}, 0, 0, S_KARTINVULNB12}, // S_KARTINVULNB11 - {SPR_KINB, FF_FULLBRIGHT|11, 1, {NULL}, 0, 0, S_NULL}, // S_KARTINVULNB12 + {SPR_KINB, FF_FULLBRIGHT, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB2}, // S_KARTINVULNB1 + {SPR_KINB, FF_FULLBRIGHT|1, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB3}, // S_KARTINVULNB2 + {SPR_KINB, FF_FULLBRIGHT|2, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB4}, // S_KARTINVULNB3 + {SPR_KINB, FF_FULLBRIGHT|3, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB5}, // S_KARTINVULNB4 + {SPR_KINB, FF_FULLBRIGHT|4, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB6}, // S_KARTINVULNB5 + {SPR_KINB, FF_FULLBRIGHT|5, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB7}, // S_KARTINVULNB6 + {SPR_KINB, FF_FULLBRIGHT|6, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB8}, // S_KARTINVULNB7 + {SPR_KINB, FF_FULLBRIGHT|7, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB9}, // S_KARTINVULNB8 + {SPR_KINB, FF_FULLBRIGHT|8, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB10}, // S_KARTINVULNB9 + {SPR_KINB, FF_FULLBRIGHT|9, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB11}, // S_KARTINVULNB10 + {SPR_KINB, FF_FULLBRIGHT|10, 1, {A_InvincSparkleRotate}, 0, 0, S_KARTINVULNB12}, // S_KARTINVULNB11 + {SPR_KINB, FF_FULLBRIGHT|11, 1, {A_InvincSparkleRotate}, 0, 0, S_NULL}, // S_KARTINVULNB12 {SPR_KINF, FF_FULLBRIGHT|FF_TRANS90, 1, {NULL}, 0, 0, S_INVULNFLASH2}, // S_INVULNFLASH1 {SPR_NULL, FF_FULLBRIGHT|FF_TRANS90, 1, {NULL}, 0, 0, S_INVULNFLASH3}, // S_INVULNFLASH2 diff --git a/src/info.h b/src/info.h index 7903af0c6..73c4da345 100644 --- a/src/info.h +++ b/src/info.h @@ -183,6 +183,7 @@ void A_MayonakaArrow(); //SRB2kart: midnight channel arrow sign void A_ReaperThinker(); //SRB2kart: mementos reaper void A_MementosTPParticles(); //SRB2kart: mementos teleporter particles. Man that's a lot of actions for my shite. void A_FlameShieldPaper(); +void A_InvincSparkleRotate(); // SRB2kart: invinc sparkle rotation void A_OrbitNights(); void A_GhostMe(); void A_SetObjectState(); diff --git a/src/k_kart.c b/src/k_kart.c index 76001c4d2..5070de4ff 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2494,7 +2494,7 @@ static void K_GetKartBoostPower(player_t *player) if (player->kartstuff[k_draftpower] > 0) // Drafting { // 30% - 44%, each point of speed adds 1.75% - fixed_t draftspeed = ((3*FRACUNIT)/10) + ((player->kartspeed-1) * ((7*FRACUNIT)/400)); + fixed_t draftspeed = ((3*FRACUNIT)/10) + ((player->kartspeed-1) * ((7*FRACUNIT)/400)); speedboost += FixedMul(draftspeed, player->kartstuff[k_draftpower]); // (Drafting suffers no boost stack penalty.) numboosts++; } @@ -3764,13 +3764,14 @@ void K_SpawnBoostTrail(player_t *player) void K_SpawnSparkleTrail(mobj_t *mo) { - const INT32 rad = (mo->radius*3)>>FRACBITS; + const INT32 rad = (mo->radius*3)/FRACUNIT; mobj_t *sparkle; - angle_t newangle; + //angle_t newangle; INT32 i; - UINT8 frame; + //UINT8 frame; UINT8 invanimnum; UINT8 index = 1; + fixed_t newx, newy, newz; I_Assert(mo != NULL); I_Assert(!P_MobjWasRemoved(mo)); @@ -3780,18 +3781,23 @@ void K_SpawnSparkleTrail(mobj_t *mo) if (leveltime & 2) index = 2; - CONS_Printf("%d\n", index); - CONS_Printf("%d\n", invanimnum); + //CONS_Printf("%d\n", index); + //CONS_Printf("%d\n", invanimnum); for (i = 0; i < 8; i++) { - newangle = (mo->angle + ANGLE_157h) + FixedAngle(((360 / 8) * i) << FRACBITS) + ANGLE_90; - fixed_t newx = mo->x + (mo->momx*4)/5 + (P_RandomRange(-rad, rad)<y + mo->momy + (P_RandomRange(-rad, rad*2)<z + (mo->momz*4)/5 + (P_RandomRange(0, mo->height>>FRACBITS)<angle + ANGLE_157h) + FixedAngle(((360 / 8) * i) << FRACBITS) + ANGLE_90; + newx = mo->x + (P_RandomRange(-rad, rad)*FRACUNIT); + newy = mo->y + (P_RandomRange(-rad, rad)*FRACUNIT); + newz = mo->z + (P_RandomRange(0, mo->height>>FRACBITS)*FRACUNIT); sparkle = P_SpawnMobj(newx, newy, newz, MT_SPARKLETRAIL); - sparkle->angle = newangle; + sparkle->angle = R_PointToAngle2(mo->x, mo->y, sparkle->x, sparkle->y); + sparkle->movefactor = R_PointToDist2(mo->x, mo->y, sparkle->x, sparkle->y); // Save the distance we spawned away from the player. + CONS_Printf("movefactor: %d\n", sparkle->movefactor/FRACUNIT); + sparkle->extravalue1 = (sparkle->z - mo->z); // Keep track of our Z position relative to the player's, I suppose. + sparkle->extravalue2 = P_RandomRange(0, 1) ? 1 : -1; // Rotation direction? + sparkle->cvmem = P_RandomRange(-25, 25)*mo->scale; // Vertical "angle" K_FlipFromObject(sparkle, mo); //if (i == 0) diff --git a/src/p_enemy.c b/src/p_enemy.c index ce3186442..696a247e3 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -211,6 +211,7 @@ void A_MayonakaArrow(mobj_t *actor); //SRB2kart void A_ReaperThinker(mobj_t *actor); //SRB2kart void A_MementosTPParticles(mobj_t *actor); //SRB2kart void A_FlameShieldPaper(mobj_t *actor); // SRB2kart +void A_InvincSparkleRotate(mobj_t *actor); // SRB2kart void A_OrbitNights(mobj_t *actor); void A_GhostMe(mobj_t *actor); void A_SetObjectState(mobj_t *actor); @@ -9810,6 +9811,39 @@ void A_FlameShieldPaper(mobj_t *actor) } } + +// Rotation thinker for invinc sparkles. + +// actor->movefactor: fixed_t distance away from the target (not updated with the target's scale since our actor will barely last 12 frames lmao) +// actor->angle: angle_t to rotate from. Updates itself each call of this action. +// actor->extravalue1: z diff between the actor and its target when spawned. Used to know the Z position to teleport to each frame. +// actor->extravalue2: -1 or 1 to tell if we should rotate clockwise or counterclockwise respectively. + +void A_InvincSparkleRotate(mobj_t *actor) +{ + + fixed_t sx, sy, sz; // Teleport dests. + + if (LUA_CallAction("A_InvincSparkleRotate", actor)) + return; + + if (!actor->target || P_MobjWasRemoved(actor->target)) + return; + + CONS_Printf("%d\n", actor->movefactor/FRACUNIT); + sx = actor->target->x + FixedMul((actor->movefactor), FINECOSINE((actor->angle)>>ANGLETOFINESHIFT)); + sy = actor->target->y + FixedMul((actor->movefactor), FINESINE((actor->angle)>>ANGLETOFINESHIFT)); + sz = actor->target->z + (actor->extravalue1) + FixedMul((actor->cvmem), FINECOSINE((leveltime*ANG1*10 + actor->angle)>>ANGLETOFINESHIFT)); + P_TeleportMove(actor, sx, sy, sz); + + actor->momx = actor->target->momx; + actor->momy = actor->target->momy; + actor->momz = actor->target->momz; // Give momentum for eventual interp builds idk. + + actor->angle += ANG1*10*(actor->extravalue2); // Arbitrary value, change this if you want, I suppose. +} + + //} // Function: A_OrbitNights