From c6f3ac651ed57758c045d4a0e1297fda045691bb Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 14 Mar 2020 01:43:54 -0400 Subject: [PATCH 01/16] Switch red & blue sparks, add yellow sparks, add big spark sprites --- src/dehacked.c | 2 + src/info.c | 3 + src/info.h | 2 + src/k_kart.c | 191 ++++++++++++++++++++++++++++++++++--------------- src/p_mobj.c | 6 +- 5 files changed, 144 insertions(+), 60 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 8a8a159db..efb39dd7d 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6347,6 +6347,8 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_DRIFTSPARK_B1", "S_DRIFTSPARK_C1", "S_DRIFTSPARK_C2", + "S_DRIFTSPARK_D1", + "S_DRIFTSPARK_D2", // Brake drift sparks "S_BRAKEDRIFT", diff --git a/src/info.c b/src/info.c index 275c70018..6803e8a33 100644 --- a/src/info.c +++ b/src/info.c @@ -2587,6 +2587,9 @@ state_t states[NUMSTATES] = {SPR_DRIF, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_DRIFTSPARK_C2}, // S_DRIFTSPARK_C1 {SPR_DRIF, FF_FULLBRIGHT|FF_TRANS20, 1, {NULL}, 0, 0, S_DRIFTSPARK_A3}, // S_DRIFTSPARK_C2 (Loop back to A3) + {SPR_DRIF, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_DRIFTSPARK_D2}, // S_DRIFTSPARK_D1 + {SPR_DRIF, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_DRIFTSPARK_A2}, // S_DRIFTSPARK_D2 (Loop back to A2) + {SPR_BDRF, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE, -1, {NULL}, 5, 2, S_BRAKEDRIFT}, // S_BRAKEDRIFT {SPR_DUST, 0, 3, {NULL}, 0, 0, S_DRIFTDUST2}, // S_DRIFTDUST1 diff --git a/src/info.h b/src/info.h index b6cc0e7ff..50887e93f 100644 --- a/src/info.h +++ b/src/info.h @@ -3236,6 +3236,8 @@ typedef enum state S_DRIFTSPARK_B1, S_DRIFTSPARK_C1, S_DRIFTSPARK_C2, + S_DRIFTSPARK_D1, + S_DRIFTSPARK_D2, // Brake drift sparks S_BRAKEDRIFT, diff --git a/src/k_kart.c b/src/k_kart.c index 64320fb68..3f57b3e83 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3151,13 +3151,17 @@ static void K_SpawnDriftSparks(player_t *player) if (!P_IsObjectOnGround(player->mo)) return; - if (!player->kartstuff[k_drift] || player->kartstuff[k_driftcharge] < K_GetKartDriftSparkValue(player)) + if (!player->kartstuff[k_drift] + || (player->kartstuff[k_driftcharge] < K_GetKartDriftSparkValue(player) && !(player->kartstuff[k_driftcharge] < 0))) return; travelangle = player->mo->angle-(ANGLE_45/5)*player->kartstuff[k_drift]; for (i = 0; i < 2; i++) { + SINT8 size = 1; + UINT8 trail = 0; + newx = player->mo->x + P_ReturnThrustX(player->mo, travelangle + ((i&1) ? -1 : 1)*ANGLE_135, FixedMul(32*FRACUNIT, player->mo->scale)); newy = player->mo->y + P_ReturnThrustY(player->mo, travelangle + ((i&1) ? -1 : 1)*ANGLE_135, FixedMul(32*FRACUNIT, player->mo->scale)); spark = P_SpawnMobj(newx, newy, player->mo->z, MT_DRIFTSPARK); @@ -3171,20 +3175,62 @@ static void K_SpawnDriftSparks(player_t *player) spark->momy = player->mo->momy/2; //spark->momz = player->mo->momz/2; - if (player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(player)*4) + if (player->kartstuff[k_driftcharge] < 0) { - spark->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); + // Stage 0: Yellow + spark->color = SKINCOLOR_GOLD; + size = 0; + } + else if (player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(player)*4) + { + // Stage 3: Rainbow + size = 2; + + if (player->kartstuff[k_driftcharge] <= (K_GetKartDriftSparkValue(player)*4)+(32*3)) + { + // transition + spark->color = SKINCOLOR_SILVER; + P_SetScale(spark, (spark->destscale = spark->scale*3/2)); + trail = 1; + } + else + { + spark->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); + spark->colorized = true; + trail = 2; + } } else if (player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(player)*2) { - if (player->kartstuff[k_driftcharge] <= (K_GetKartDriftSparkValue(player)*2)+(24*3)) - spark->color = SKINCOLOR_RASPBERRY; // transition + // Stage 2: Blue + size = 2; + + if (player->kartstuff[k_driftcharge] <= (K_GetKartDriftSparkValue(player)*2)+(32*3)) + { + // transition + spark->color = SKINCOLOR_PURPLE; + P_SetScale(spark, (spark->destscale = spark->scale*3/2)); + } else - spark->color = SKINCOLOR_KETCHUP; + { + spark->color = SKINCOLOR_SAPPHIRE; + } } else { - spark->color = SKINCOLOR_SAPPHIRE; + // Stage 1: Red + size = 1; + + if (player->kartstuff[k_driftcharge] <= (K_GetKartDriftSparkValue(player))+(32*3)) + { + // transition + spark->color = SKINCOLOR_RASPBERRY; + P_SetScale(spark, (spark->destscale = spark->scale*2)); + } + else + { + spark->color = SKINCOLOR_KETCHUP; + } } if ((player->kartstuff[k_drift] > 0 && player->cmd.driftturn > 0) // Inward drifts @@ -3192,22 +3238,40 @@ static void K_SpawnDriftSparks(player_t *player) { if ((player->kartstuff[k_drift] < 0 && (i & 1)) || (player->kartstuff[k_drift] > 0 && !(i & 1))) - P_SetMobjState(spark, S_DRIFTSPARK_A1); + { + size++; + } else if ((player->kartstuff[k_drift] < 0 && !(i & 1)) || (player->kartstuff[k_drift] > 0 && (i & 1))) - P_SetMobjState(spark, S_DRIFTSPARK_C1); + { + size--; + } } else if ((player->kartstuff[k_drift] > 0 && player->cmd.driftturn < 0) // Outward drifts || (player->kartstuff[k_drift] < 0 && player->cmd.driftturn > 0)) { if ((player->kartstuff[k_drift] < 0 && (i & 1)) || (player->kartstuff[k_drift] > 0 && !(i & 1))) - P_SetMobjState(spark, S_DRIFTSPARK_C1); + { + size--; + } else if ((player->kartstuff[k_drift] < 0 && !(i & 1)) || (player->kartstuff[k_drift] > 0 && (i & 1))) - P_SetMobjState(spark, S_DRIFTSPARK_A1); + { + size++; + } } + if (size == 2) + P_SetMobjState(spark, S_DRIFTSPARK_A1); + else if (size < 1) + P_SetMobjState(spark, S_DRIFTSPARK_C1); + else if (size > 2) + P_SetMobjState(spark, S_DRIFTSPARK_D1); + + if (trail > 0) + spark->tics += trail; + K_MatchGenericExtraFlags(spark, player->mo); } } @@ -5721,42 +5785,40 @@ static void K_KartDrift(player_t *player, boolean onground) // Drift Release (Moved here so you can't "chain" drifts) if ((player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5) // || (player->kartstuff[k_drift] >= 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] <= -1 && player->kartstuff[k_turndir] != -1)) - && player->kartstuff[k_driftcharge] < dsone && onground) { - player->kartstuff[k_driftcharge] = 0; - } - else if ((player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5) - // || (player->kartstuff[k_drift] >= 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] <= -1 && player->kartstuff[k_turndir] != -1)) - && (player->kartstuff[k_driftcharge] >= dsone && player->kartstuff[k_driftcharge] < dstwo) - && onground) - { - if (player->kartstuff[k_driftboost] < 20) - player->kartstuff[k_driftboost] = 20; - S_StartSound(player->mo, sfx_s23c); - //K_SpawnDashDustRelease(player); - player->kartstuff[k_driftcharge] = 0; - } - else if ((player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5) - // || (player->kartstuff[k_drift] >= 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] <= -1 && player->kartstuff[k_turndir] != -1)) - && player->kartstuff[k_driftcharge] < dsthree - && onground) - { - if (player->kartstuff[k_driftboost] < 50) - player->kartstuff[k_driftboost] = 50; - S_StartSound(player->mo, sfx_s23c); - //K_SpawnDashDustRelease(player); - player->kartstuff[k_driftcharge] = 0; - } - else if ((player->kartstuff[k_drift] != -5 && player->kartstuff[k_drift] != 5) - // || (player->kartstuff[k_drift] >= 1 && player->kartstuff[k_turndir] != 1) || (player->kartstuff[k_drift] <= -1 && player->kartstuff[k_turndir] != -1)) - && player->kartstuff[k_driftcharge] >= dsthree - && onground) - { - if (player->kartstuff[k_driftboost] < 125) - player->kartstuff[k_driftboost] = 125; - S_StartSound(player->mo, sfx_s23c); - //K_SpawnDashDustRelease(player); + if (player->kartstuff[k_driftcharge] < 0 || player->kartstuff[k_driftcharge] >= dsone) + { + S_StartSound(player->mo, sfx_s23c); + //K_SpawnDashDustRelease(player); + + if (player->kartstuff[k_driftcharge] < 0) + { + // Stage 0: Yellow sparks + if (player->kartstuff[k_driftboost] < 15) + player->kartstuff[k_driftboost] = 15; + } + else if (player->kartstuff[k_driftcharge] >= dsone && player->kartstuff[k_driftcharge] < dstwo) + { + // Stage 1: Red sparks + if (player->kartstuff[k_driftboost] < 20) + player->kartstuff[k_driftboost] = 20; + } + else if (player->kartstuff[k_driftcharge] < dsthree) + { + // Stage 2: Blue sparks + if (player->kartstuff[k_driftboost] < 50) + player->kartstuff[k_driftboost] = 50; + } + else if (player->kartstuff[k_driftcharge] >= dsthree) + { + // Stage 3: Rainbow sparks + if (player->kartstuff[k_driftboost] < 125) + player->kartstuff[k_driftboost] = 125; + } + } + + // Remove charge player->kartstuff[k_driftcharge] = 0; } @@ -5792,10 +5854,16 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_driftend] = 0; } - - // Incease/decrease the drift value to continue drifting in that direction - if (player->kartstuff[k_spinouttimer] == 0 && player->kartstuff[k_jmp] == 1 && onground && player->kartstuff[k_drift] != 0) + if (player->kartstuff[k_spinouttimer] > 0) { + // Stop drifting + player->kartstuff[k_drift] = player->kartstuff[k_driftcharge] = 0; + player->kartstuff[k_aizdriftstrat] = player->kartstuff[k_brakedrift] = 0; + player->kartstuff[k_getsparks] = 0; + } + else if (player->kartstuff[k_jmp] == 1 && onground && player->kartstuff[k_drift] != 0) + { + // Incease/decrease the drift value to continue drifting in that direction fixed_t driftadditive = 24; if (player->kartstuff[k_drift] >= 1) // Drifting to the left @@ -5828,11 +5896,26 @@ static void K_KartDrift(player_t *player, boolean onground) && !player->kartstuff[k_hyudorotimer] && !EITHERSNEAKER(player))) driftadditive = 0; - if (player->speed > minspeed*2) + + if (player->speed >= minspeed*2) + { player->kartstuff[k_getsparks] = 1; + if (player->kartstuff[k_driftcharge] <= -1) + player->kartstuff[k_driftcharge] = dsone; + } + else + { + player->kartstuff[k_getsparks] = 0; + driftadditive = 0; + + if (player->kartstuff[k_driftcharge] >= dsone) + player->kartstuff[k_driftcharge] = -1; + } + // This spawns the drift sparks - if (player->kartstuff[k_driftcharge] + driftadditive >= dsone) + if ((player->kartstuff[k_driftcharge] + driftadditive >= dsone) + || (player->kartstuff[k_driftcharge] < 0)) K_SpawnDriftSparks(player); // Sound whenever you get a different tier of sparks @@ -5849,14 +5932,6 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_driftend] = 0; } - // Stop drifting - if (player->kartstuff[k_spinouttimer] > 0 || player->speed < minspeed) - { - player->kartstuff[k_drift] = player->kartstuff[k_driftcharge] = 0; - player->kartstuff[k_aizdriftstrat] = player->kartstuff[k_brakedrift] = 0; - player->kartstuff[k_getsparks] = 0; - } - if ((!EITHERSNEAKER(player)) || (!player->cmd.driftturn) || (!player->kartstuff[k_aizdriftstrat]) diff --git a/src/p_mobj.c b/src/p_mobj.c index a532dddc5..1ae299749 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8378,9 +8378,11 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)*4) mobj->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); else if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)*2) - mobj->color = SKINCOLOR_KETCHUP; - else if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)) mobj->color = SKINCOLOR_SAPPHIRE; + else if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)) + mobj->color = SKINCOLOR_KETCHUP; + else if (mobj->target->player->kartstuff[k_driftcharge] < 0) + mobj->color = SKINCOLOR_GOLD; else mobj->color = SKINCOLOR_SILVER; From f37b1268b420f91a055d861268970125e03bec3c Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 14 Mar 2020 18:12:36 -0400 Subject: [PATCH 02/16] Slight adjustments to yellow spark nuances Instead of setting you to yellow sparks when before you could keep red sparks, it keeps your previous "state". When going below 20 speed when you have sparks, you no longer stop charging sparks, but you have to break above 20 speed once you have yellow sparks to get normal sparks again. --- src/k_kart.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 3f57b3e83..3f41e5ee8 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5897,20 +5897,23 @@ static void K_KartDrift(player_t *player, boolean onground) && !EITHERSNEAKER(player))) driftadditive = 0; - if (player->speed >= minspeed*2) + // Inbetween minspeed and minspeed*2, it'll keep your previous drift-spark state. + if (player->speed > minspeed*2) { player->kartstuff[k_getsparks] = 1; if (player->kartstuff[k_driftcharge] <= -1) - player->kartstuff[k_driftcharge] = dsone; + player->kartstuff[k_driftcharge] = dsone; // Back to red } - else + else if (player->speed <= minspeed) { player->kartstuff[k_getsparks] = 0; driftadditive = 0; if (player->kartstuff[k_driftcharge] >= dsone) - player->kartstuff[k_driftcharge] = -1; + player->kartstuff[k_driftcharge] = -1; // Set yellow sparks + else + player->kartstuff[k_driftcharge] = 0; // No sparks } // This spawns the drift sparks From 9dfbd918a4106b0c65df09d94233d08e4ba489a1 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 14 Mar 2020 18:14:21 -0400 Subject: [PATCH 03/16] Don't forcefully remove drift when bumping walls --- src/p_map.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 9e34e04d9..8c4bf8240 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3667,8 +3667,6 @@ void P_BouncePlayerMove(mobj_t *mo) mmomx = mo->player->rmomx; mmomy = mo->player->rmomy; - mo->player->kartstuff[k_drift] = 0; - mo->player->kartstuff[k_driftcharge] = 0; mo->player->kartstuff[k_pogospring] = 0; // trace along the three leading corners From 219d4aebf2bacf13df78eb8006f3c2c375158e4f Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 14 Mar 2020 18:31:53 -0400 Subject: [PATCH 04/16] Actually, might've reintroduced more lawnmower problems; let's play it safe --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 3f41e5ee8..c2fee8494 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5905,7 +5905,7 @@ static void K_KartDrift(player_t *player, boolean onground) if (player->kartstuff[k_driftcharge] <= -1) player->kartstuff[k_driftcharge] = dsone; // Back to red } - else if (player->speed <= minspeed) + else { player->kartstuff[k_getsparks] = 0; driftadditive = 0; From ed9919d47c616de59beed51ed8000c3fb595f98d Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 14 Mar 2020 18:38:01 -0400 Subject: [PATCH 05/16] Remove drift when hitting 0 speed Prevents silliness like this: https://cdn.discordapp.com/attachments/275750804227489794/688515983471804455/kart0027.gif --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index c2fee8494..3a7ccfb7d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5854,7 +5854,7 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_driftend] = 0; } - if (player->kartstuff[k_spinouttimer] > 0) + if (player->kartstuff[k_spinouttimer] > 0 || player->speed == 0) { // Stop drifting player->kartstuff[k_drift] = player->kartstuff[k_driftcharge] = 0; From f235a50d2ef8d2d3e97701ed8bc90cfe65046ac1 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 14 Mar 2020 18:46:22 -0400 Subject: [PATCH 06/16] Blue sparks trail longer --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 3a7ccfb7d..37011eb4b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3185,25 +3185,25 @@ static void K_SpawnDriftSparks(player_t *player) { // Stage 3: Rainbow size = 2; + trail = 2; if (player->kartstuff[k_driftcharge] <= (K_GetKartDriftSparkValue(player)*4)+(32*3)) { // transition spark->color = SKINCOLOR_SILVER; P_SetScale(spark, (spark->destscale = spark->scale*3/2)); - trail = 1; } else { spark->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); spark->colorized = true; - trail = 2; } } else if (player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(player)*2) { // Stage 2: Blue size = 2; + trail = 1; if (player->kartstuff[k_driftcharge] <= (K_GetKartDriftSparkValue(player)*2)+(32*3)) { From 69cc03a4343c42b1f4bbfd2d32910006e70a5e6d Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 14 Mar 2020 19:01:34 -0400 Subject: [PATCH 07/16] This line broke yellow sparks entirely --- src/k_kart.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 37011eb4b..9792c5a3c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5912,8 +5912,6 @@ static void K_KartDrift(player_t *player, boolean onground) if (player->kartstuff[k_driftcharge] >= dsone) player->kartstuff[k_driftcharge] = -1; // Set yellow sparks - else - player->kartstuff[k_driftcharge] = 0; // No sparks } // This spawns the drift sparks From 01885c516634f81efc598c3e137abae8684724f3 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 15 Mar 2020 20:52:41 -0400 Subject: [PATCH 08/16] Revert "Actually, might've reintroduced more lawnmower problems; let's play it safe" This reverts commit 219d4aebf2bacf13df78eb8006f3c2c375158e4f. --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9792c5a3c..3a62be45a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5905,7 +5905,7 @@ static void K_KartDrift(player_t *player, boolean onground) if (player->kartstuff[k_driftcharge] <= -1) player->kartstuff[k_driftcharge] = dsone; // Back to red } - else + else if (player->speed <= minspeed) { player->kartstuff[k_getsparks] = 0; driftadditive = 0; From 7d1c132ca2d758bf3352f713252b554b0508123d Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 15 Mar 2020 21:21:07 -0400 Subject: [PATCH 09/16] Fix drift spark camera when you go to yellow sparks --- src/p_user.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index 8185667a0..c8b03267f 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7498,7 +7498,14 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (player->kartstuff[k_drift] != 0) { fixed_t panmax = (dist/5); - pan = FixedDiv(FixedMul(min((fixed_t)player->kartstuff[k_driftcharge], K_GetKartDriftSparkValue(player)), panmax), K_GetKartDriftSparkValue(player)); + INT32 driftval = K_GetKartDriftSparkValue(player); + INT32 dc = player->kartstuff[k_driftcharge]; + + if (dc > driftval || dc < 0) + dc = driftval; + + pan = FixedDiv(FixedMul((fixed_t)dc, panmax), driftval); + if (pan > panmax) pan = panmax; if (player->kartstuff[k_drift] < 0) From c4dd88bbaee7b4eaac593f044d03b7f3b29dd332 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 15 Mar 2020 21:59:22 -0400 Subject: [PATCH 10/16] Turn sparkles that warn you when you're about to hit a new drift spark! --- src/dehacked.c | 6 ++++++ src/info.c | 13 +++++++++---- src/info.h | 7 +++++++ src/k_kart.c | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index efb39dd7d..061eb9388 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6359,6 +6359,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_DRIFTDUST3", "S_DRIFTDUST4", + // Drift Sparkles + "S_DRIFTWARNSPARK1", + "S_DRIFTWARNSPARK2", + "S_DRIFTWARNSPARK3", + "S_DRIFTWARNSPARK4", + // Fast lines "S_FASTLINE1", "S_FASTLINE2", diff --git a/src/info.c b/src/info.c index 6803e8a33..df8f31061 100644 --- a/src/info.c +++ b/src/info.c @@ -57,10 +57,10 @@ char sprnames[NUMSPRITES + 1][5] = "SRBL","SRBM","SRBN","SRBO", //SRB2kart Sprites "RNDM","RPOP","SGNS","FAST","DSHR","BOST","BOSM","KFRE","KINV","KINF", - "WIPD","DRIF","BDRF","DUST","RSHE","FITM","BANA","ORBN","JAWZ","SSMN", - "KRBM","BHOG","BHBM","SPBM","THNS","SINK","SITR","KBLN","DEZL","POKE", - "AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM","SACO","CRAB", - "BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB","ARRO","ITEM", + "WIPD","DRIF","BDRF","DUST","DRWS","RSHE","FITM","BANA","ORBN","JAWZ", + "SSMN","KRBM","BHOG","BHBM","SPBM","THNS","SINK","SITR","KBLN","DEZL", + "POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM","SACO", + "CRAB","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB","ARRO","ITEM", "ITMO","ITMI","ITMN","WANT","PBOM","HIT1","HIT2","HIT3","RETI","AIDU", "KSPK","LZI1","LZI2","KLIT","FZSM","FZBM","FPRT","SBUS","MARB","FUFO", "RUST","BLON","VAPE","HTZA","HTZB","SGVA","SGVB","SGVC","PGTR","PGF1", @@ -2597,6 +2597,11 @@ state_t states[NUMSTATES] = {SPR_DUST, FF_TRANS20|2, 3, {NULL}, 0, 0, S_DRIFTDUST4}, // S_DRIFTDUST3 {SPR_DUST, FF_TRANS20|3, 3, {NULL}, 0, 0, S_NULL}, // S_DRIFTDUST4 + {SPR_DRWS, FF_FULLBRIGHT|0, 3, {NULL}, 0, 0, S_DRIFTWARNSPARK2}, // S_DRIFTWARNSPARK1 + {SPR_DRWS, FF_FULLBRIGHT|1, 3, {NULL}, 0, 0, S_DRIFTWARNSPARK3}, // S_DRIFTWARNSPARK2 + {SPR_DRWS, FF_FULLBRIGHT|FF_TRANS20|2, 3, {NULL}, 0, 0, S_DRIFTWARNSPARK4}, // S_DRIFTWARNSPARK3 + {SPR_DRWS, FF_FULLBRIGHT|FF_TRANS20|3, 3, {NULL}, 0, 0, S_NULL}, // S_DRIFTWARNSPARK4 + {SPR_FAST, FF_PAPERSPRITE|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_FASTLINE2}, // S_FASTLINE1 {SPR_FAST, FF_PAPERSPRITE|FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_FASTLINE3}, // S_FASTLINE2 {SPR_FAST, FF_PAPERSPRITE|FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_FASTLINE4}, // S_FASTLINE3 diff --git a/src/info.h b/src/info.h index 50887e93f..78902d297 100644 --- a/src/info.h +++ b/src/info.h @@ -608,6 +608,7 @@ typedef enum sprite SPR_DRIF, // Drift Sparks SPR_BDRF, // Brake drift sparks SPR_DUST, // Drift Dust + SPR_DRWS, // Drift dust sparks // Kart Items SPR_RSHE, // Rocket sneaker @@ -3248,6 +3249,12 @@ typedef enum state S_DRIFTDUST3, S_DRIFTDUST4, + // Drift Sparkles + S_DRIFTWARNSPARK1, + S_DRIFTWARNSPARK2, + S_DRIFTWARNSPARK3, + S_DRIFTWARNSPARK4, + // Fast lines S_FASTLINE1, S_FASTLINE2, diff --git a/src/k_kart.c b/src/k_kart.c index 3a62be45a..3b30b1c3f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3587,6 +3587,47 @@ void K_DriftDustHandling(mobj_t *spawner) S_StartSound(spawner, sfx_screec); K_MatchGenericExtraFlags(dust, spawner); + + // Sparkle-y warning for when you're about to change drift sparks! + if (spawner->player && spawner->player->kartstuff[k_drift]) + { + INT32 driftval = K_GetKartDriftSparkValue(spawner->player); + INT32 warntime = driftval/3; + INT32 dc = spawner->player->kartstuff[k_driftcharge]; + UINT8 c = SKINCOLOR_NONE; + boolean rainbow = false; + + if (dc < 0) + { + c = SKINCOLOR_GOLD; + } + else if (dc >= (driftval - warntime)) + { + if (dc >= ((2*driftval) - warntime)) + { + if (dc >= ((4*driftval) - warntime)) + { + c = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); + rainbow = true; + } + else + { + c = SKINCOLOR_SAPPHIRE; + } + } + else + { + c = SKINCOLOR_KETCHUP; + } + } + + if (c != SKINCOLOR_NONE) + { + P_SetMobjState(dust, S_DRIFTWARNSPARK1); + dust->color = c; + dust->colorized = rainbow; + } + } } } From 3093a3078e744d34d13acd60f464fc550cf84b12 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 15 Mar 2020 22:05:43 -0400 Subject: [PATCH 11/16] Scale dust properly --- src/k_kart.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 3b30b1c3f..db1be60e2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3550,7 +3550,7 @@ void K_DriftDustHandling(mobj_t *spawner) { angle_t playerangle = spawner->angle; - if (spawner->player->speed < 5<player->speed < 5*spawner->scale) return; if (spawner->player->cmd.forwardmove < 0) @@ -3561,7 +3561,7 @@ void K_DriftDustHandling(mobj_t *spawner) } else { - if (P_AproxDistance(spawner->momx, spawner->momy) < 5<momx, spawner->momy) < 5*spawner->scale) return; anglediff = abs((signed)(spawner->angle - R_PointToAngle2(0, 0, spawner->momx, spawner->momy))); @@ -3572,12 +3572,12 @@ void K_DriftDustHandling(mobj_t *spawner) if (anglediff > ANG10*4) // Trying to turn further than 40 degrees { - fixed_t spawnx = P_RandomRange(-spawnrange, spawnrange)<scale; + fixed_t spawny = P_RandomRange(-spawnrange, spawnrange) * spawner->scale; INT32 speedrange = 2; mobj_t *dust = P_SpawnMobj(spawner->x + spawnx, spawner->y + spawny, spawner->z, MT_DRIFTDUST); - dust->momx = FixedMul(spawner->momx + (P_RandomRange(-speedrange, speedrange)<scale)/4); - dust->momy = FixedMul(spawner->momy + (P_RandomRange(-speedrange, speedrange)<scale)/4); + dust->momx = FixedMul(spawner->momx + (P_RandomRange(-speedrange, speedrange) * spawner->scale), 3*(spawner->scale)/4); + dust->momy = FixedMul(spawner->momy + (P_RandomRange(-speedrange, speedrange) * spawner->scale), 3*(spawner->scale)/4); dust->momz = P_MobjFlip(spawner) * (P_RandomRange(1, 4) * (spawner->scale)); P_SetScale(dust, spawner->scale/2); dust->destscale = spawner->scale * 3; From 4174d9a23ee6411e5e21c6acd27ff92062695882 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 15 Mar 2020 23:02:43 -0400 Subject: [PATCH 12/16] Add a function for retrieving drift spark color, to simplify a lot of code & add transition colors to everything --- src/k_kart.c | 178 ++++++++++++++++++++++++++++----------------------- src/k_kart.h | 1 + src/p_mobj.c | 11 +--- 3 files changed, 102 insertions(+), 88 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index db1be60e2..fb76fd947 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3133,6 +3133,59 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I return NULL; } +UINT8 K_DriftSparkColor(player_t *player, INT32 charge) +{ + INT32 ds = K_GetKartDriftSparkValue(player); + UINT8 color = SKINCOLOR_NONE; + + if (charge < 0) + { + // Stage 0: Yellow + color = SKINCOLOR_GOLD; + } + else if (charge >= ds*4) + { + // Stage 3: Rainbow + if (charge <= (ds*4)+(32*3)) + { + // transition + color = SKINCOLOR_SILVER; + } + else + { + color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); + } + } + else if (charge >= ds*2) + { + // Stage 2: Blue + if (charge <= (ds*2)+(32*3)) + { + // transition + color = SKINCOLOR_PURPLE; + } + else + { + color = SKINCOLOR_SAPPHIRE; + } + } + else if (charge >= ds) + { + // Stage 1: Red + if (charge <= (ds)+(32*3)) + { + // transition + color = SKINCOLOR_RASPBERRY; + } + else + { + color = SKINCOLOR_KETCHUP; + } + } + + return color; +} + static void K_SpawnDriftSparks(player_t *player) { fixed_t newx; @@ -3159,6 +3212,7 @@ static void K_SpawnDriftSparks(player_t *player) for (i = 0; i < 2; i++) { + INT32 ds = K_GetKartDriftSparkValue(player); SINT8 size = 1; UINT8 trail = 0; @@ -3175,62 +3229,51 @@ static void K_SpawnDriftSparks(player_t *player) spark->momy = player->mo->momy/2; //spark->momz = player->mo->momz/2; + spark->color = K_DriftSparkColor(player, player->kartstuff[k_driftcharge]); + if (player->kartstuff[k_driftcharge] < 0) { // Stage 0: Yellow - spark->color = SKINCOLOR_GOLD; size = 0; } - else if (player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(player)*4) + else if (player->kartstuff[k_driftcharge] >= ds*4) { // Stage 3: Rainbow size = 2; trail = 2; - if (player->kartstuff[k_driftcharge] <= (K_GetKartDriftSparkValue(player)*4)+(32*3)) + if (player->kartstuff[k_driftcharge] <= (ds*4)+(32*3)) { // transition - spark->color = SKINCOLOR_SILVER; P_SetScale(spark, (spark->destscale = spark->scale*3/2)); } else { - spark->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); spark->colorized = true; } } - else if (player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(player)*2) + else if (player->kartstuff[k_driftcharge] >= ds*2) { // Stage 2: Blue size = 2; trail = 1; - if (player->kartstuff[k_driftcharge] <= (K_GetKartDriftSparkValue(player)*2)+(32*3)) + if (player->kartstuff[k_driftcharge] <= (ds*2)+(32*3)) { // transition - spark->color = SKINCOLOR_PURPLE; P_SetScale(spark, (spark->destscale = spark->scale*3/2)); } - else - { - spark->color = SKINCOLOR_SAPPHIRE; - } } else { // Stage 1: Red size = 1; - if (player->kartstuff[k_driftcharge] <= (K_GetKartDriftSparkValue(player))+(32*3)) + if (player->kartstuff[k_driftcharge] <= (ds)+(32*3)) { // transition - spark->color = SKINCOLOR_RASPBERRY; P_SetScale(spark, (spark->destscale = spark->scale*2)); } - else - { - spark->color = SKINCOLOR_KETCHUP; - } } if ((player->kartstuff[k_drift] > 0 && player->cmd.driftturn > 0) // Inward drifts @@ -3597,28 +3640,16 @@ void K_DriftDustHandling(mobj_t *spawner) UINT8 c = SKINCOLOR_NONE; boolean rainbow = false; - if (dc < 0) + if (dc >= 0) { - c = SKINCOLOR_GOLD; + dc += warntime; } - else if (dc >= (driftval - warntime)) + + c = K_DriftSparkColor(spawner->player, dc); + + if (dc > (4*driftval)+(32*3)) { - if (dc >= ((2*driftval) - warntime)) - { - if (dc >= ((4*driftval) - warntime)) - { - c = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); - rainbow = true; - } - else - { - c = SKINCOLOR_SAPPHIRE; - } - } - else - { - c = SKINCOLOR_KETCHUP; - } + rainbow = true; } if (c != SKINCOLOR_NONE) @@ -9754,57 +9785,44 @@ static void K_drawKartFirstPerson(void) if (stplyr->mo) { - INT32 dsone = K_GetKartDriftSparkValue(stplyr); - INT32 dstwo = dsone*2; - INT32 dsthree = dstwo*2; + UINT8 driftcolor = K_DriftSparkColor(stplyr, stplyr->kartstuff[k_driftcharge]); + const angle_t ang = R_PointToAngle2(0, 0, stplyr->rmomx, stplyr->rmomy) - stplyr->frameangle; + // yes, the following is correct. no, you do not need to swap the x and y. + fixed_t xoffs = -P_ReturnThrustY(stplyr->mo, ang, (BASEVIDWIDTH<<(FRACBITS-2))/2); + fixed_t yoffs = -(P_ReturnThrustX(stplyr->mo, ang, 4*FRACUNIT) - 4*FRACUNIT); -#ifndef DONTLIKETOASTERSFPTWEAKS + if (splitscreen) + xoffs = FixedMul(xoffs, scale); + + xoffs -= (tn)*scale; + xoffs -= (dr)*scale; + + if (stplyr->frameangle == stplyr->mo->angle) { - const angle_t ang = R_PointToAngle2(0, 0, stplyr->rmomx, stplyr->rmomy) - stplyr->frameangle; - // yes, the following is correct. no, you do not need to swap the x and y. - fixed_t xoffs = -P_ReturnThrustY(stplyr->mo, ang, (BASEVIDWIDTH<<(FRACBITS-2))/2); - fixed_t yoffs = -(P_ReturnThrustX(stplyr->mo, ang, 4*FRACUNIT) - 4*FRACUNIT); + const fixed_t mag = FixedDiv(stplyr->speed, 10*stplyr->mo->scale); - if (splitscreen) - xoffs = FixedMul(xoffs, scale); - - xoffs -= (tn)*scale; - xoffs -= (dr)*scale; - - if (stplyr->frameangle == stplyr->mo->angle) + if (mag < FRACUNIT) { - const fixed_t mag = FixedDiv(stplyr->speed, 10*stplyr->mo->scale); - - if (mag < FRACUNIT) - { - xoffs = FixedMul(xoffs, mag); - if (!splitscreen) - yoffs = FixedMul(yoffs, mag); - } + xoffs = FixedMul(xoffs, mag); + if (!splitscreen) + yoffs = FixedMul(yoffs, mag); } - - if (stplyr->mo->momz > 0) // TO-DO: Draw more of the kart so we can remove this if! - yoffs += stplyr->mo->momz/3; - - if (encoremode) - x -= xoffs; - else - x += xoffs; - if (!splitscreen) - y += yoffs; } - // drift sparks! - if ((leveltime & 1) && (stplyr->kartstuff[k_driftcharge] >= dsthree)) - colmap = R_GetTranslationColormap(TC_RAINBOW, (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))), GTC_CACHE); - else if ((leveltime & 1) && (stplyr->kartstuff[k_driftcharge] >= dstwo)) - colmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_KETCHUP, GTC_CACHE); - else if ((leveltime & 1) && (stplyr->kartstuff[k_driftcharge] >= dsone)) - colmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_SAPPHIRE, GTC_CACHE); + if (stplyr->mo->momz > 0) // TO-DO: Draw more of the kart so we can remove this if! + yoffs += stplyr->mo->momz/3; + + if (encoremode) + x -= xoffs; else -#endif - // invincibility/grow/shrink! - if (stplyr->mo->colorized && stplyr->mo->color) + x += xoffs; + if (!splitscreen) + y += yoffs; + + + if ((leveltime & 1) && (driftcolor != SKINCOLOR_NONE)) // drift sparks! + colmap = R_GetTranslationColormap(TC_RAINBOW, driftcolor, GTC_CACHE); + else if (stplyr->mo->colorized && stplyr->mo->color) // invincibility/grow/shrink! colmap = R_GetTranslationColormap(TC_RAINBOW, stplyr->mo->color, GTC_CACHE); } diff --git a/src/k_kart.h b/src/k_kart.h index b91e8c8a1..119b3f9a7 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -40,6 +40,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor); void K_StealBumper(player_t *player, player_t *victim, boolean force); void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit, mobj_t *source); void K_SpawnMineExplosion(mobj_t *source, UINT8 color); +UINT8 K_DriftSparkColor(player_t *player, INT32 charge); void K_SpawnBoostTrail(player_t *player); void K_SpawnSparkleTrail(mobj_t *mo); void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent); diff --git a/src/p_mobj.c b/src/p_mobj.c index 1ae299749..9f688e369 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8363,6 +8363,7 @@ void P_MobjThinker(mobj_t *mobj) } else { + UINT8 driftcolor = K_DriftSparkColor(mobj->target->player, mobj->target->player->kartstuff[k_driftcharge]); fixed_t newx, newy; angle_t travelangle; @@ -8375,14 +8376,8 @@ void P_MobjThinker(mobj_t *mobj) mobj->angle = travelangle - ((ANGLE_90/5)*mobj->target->player->kartstuff[k_drift]); P_SetScale(mobj, (mobj->destscale = mobj->target->scale)); - if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)*4) - mobj->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); - else if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)*2) - mobj->color = SKINCOLOR_SAPPHIRE; - else if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)) - mobj->color = SKINCOLOR_KETCHUP; - else if (mobj->target->player->kartstuff[k_driftcharge] < 0) - mobj->color = SKINCOLOR_GOLD; + if (driftcolor != SKINCOLOR_NONE) + mobj->color = driftcolor; else mobj->color = SKINCOLOR_SILVER; From 4026344ad3e79babbc974e1813e931d6b8e4101a Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 15 Mar 2020 23:21:46 -0400 Subject: [PATCH 13/16] Minor yellow-spark related cleanup Sound plays when you go to yellow sparks & back, and Red transition uses Tangerine instead of Raspberry --- src/k_kart.c | 33 ++++++++++++++++++++++++--------- src/sounds.c | 1 + src/sounds.h | 1 + 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index fb76fd947..ccace01f5 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3175,7 +3175,7 @@ UINT8 K_DriftSparkColor(player_t *player, INT32 charge) if (charge <= (ds)+(32*3)) { // transition - color = SKINCOLOR_RASPBERRY; + color = SKINCOLOR_TANGERINE; } else { @@ -3188,6 +3188,7 @@ UINT8 K_DriftSparkColor(player_t *player, INT32 charge) static void K_SpawnDriftSparks(player_t *player) { + INT32 ds = K_GetKartDriftSparkValue(player); fixed_t newx; fixed_t newy; mobj_t *spark; @@ -3205,14 +3206,13 @@ static void K_SpawnDriftSparks(player_t *player) return; if (!player->kartstuff[k_drift] - || (player->kartstuff[k_driftcharge] < K_GetKartDriftSparkValue(player) && !(player->kartstuff[k_driftcharge] < 0))) + || (player->kartstuff[k_driftcharge] < ds && !(player->kartstuff[k_driftcharge] < 0))) return; travelangle = player->mo->angle-(ANGLE_45/5)*player->kartstuff[k_drift]; for (i = 0; i < 2; i++) { - INT32 ds = K_GetKartDriftSparkValue(player); SINT8 size = 1; UINT8 trail = 0; @@ -5937,6 +5937,7 @@ static void K_KartDrift(player_t *player, boolean onground) { // Incease/decrease the drift value to continue drifting in that direction fixed_t driftadditive = 24; + boolean playsound = false; if (player->kartstuff[k_drift] >= 1) // Drifting to the left { @@ -5975,7 +5976,10 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_getsparks] = 1; if (player->kartstuff[k_driftcharge] <= -1) + { player->kartstuff[k_driftcharge] = dsone; // Back to red + playsound = true; + } } else if (player->speed <= minspeed) { @@ -5983,22 +5987,33 @@ static void K_KartDrift(player_t *player, boolean onground) driftadditive = 0; if (player->kartstuff[k_driftcharge] >= dsone) + { player->kartstuff[k_driftcharge] = -1; // Set yellow sparks + playsound = true; + } } // This spawns the drift sparks if ((player->kartstuff[k_driftcharge] + driftadditive >= dsone) || (player->kartstuff[k_driftcharge] < 0)) + { K_SpawnDriftSparks(player); + } + + if ((player->kartstuff[k_driftcharge] < dsone && player->kartstuff[k_driftcharge]+driftadditive >= dsone) + || (player->kartstuff[k_driftcharge] < dstwo && player->kartstuff[k_driftcharge]+driftadditive >= dstwo) + || (player->kartstuff[k_driftcharge] < dsthree && player->kartstuff[k_driftcharge]+driftadditive >= dsthree)) + { + playsound = true; + } // Sound whenever you get a different tier of sparks - if (P_IsDisplayPlayer(player) // UGHGHGH... - && ((player->kartstuff[k_driftcharge] < dsone && player->kartstuff[k_driftcharge]+driftadditive >= dsone) - || (player->kartstuff[k_driftcharge] < dstwo && player->kartstuff[k_driftcharge]+driftadditive >= dstwo) - || (player->kartstuff[k_driftcharge] < dsthree && player->kartstuff[k_driftcharge]+driftadditive >= dsthree))) + if (playsound && P_IsDisplayPlayer(player)) { - //S_StartSound(player->mo, sfx_s3ka2); - S_StartSoundAtVolume(player->mo, sfx_s3ka2, 192); // Ugh... + if (player->kartstuff[k_driftcharge] == -1) + S_StartSoundAtVolume(player->mo, sfx_sploss, 192); // Yellow spark sound + else + S_StartSoundAtVolume(player->mo, sfx_s3ka2, 192); } player->kartstuff[k_driftcharge] += driftadditive; diff --git a/src/sounds.c b/src/sounds.c index ef150d7a5..adae99df5 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -817,6 +817,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"toada", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Arid Sands Toad scream {"bhurry", false, 255, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // v1.0.2 Battle overtime {"bsnipe", false, 96, 8, -1, NULL, 0, -1, -1, LUMPERROR}, // Banana sniping + {"sploss", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Down to yellow sparks {"itfree", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // :shitsfree: {"dbgsal", false, 255, 8, -1, NULL, 0, -1, -1, LUMPERROR}, // Debug notification diff --git a/src/sounds.h b/src/sounds.h index 8b9ca609e..e3a8560ca 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -892,6 +892,7 @@ typedef enum sfx_toada, sfx_bhurry, sfx_bsnipe, + sfx_sploss, sfx_itfree, sfx_dbgsal, From 48e69f7c91aee324fef8946d091c5c641616f774 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Mon, 16 Mar 2020 00:53:33 -0400 Subject: [PATCH 14/16] Air sparks, start on drift boosts --- src/dehacked.c | 7 ++- src/info.c | 34 +++++++++++++- src/info.h | 9 +++- src/k_kart.c | 121 +++++++++++++++++++++++++++++-------------------- src/p_mobj.c | 31 +++++++++++++ 5 files changed, 149 insertions(+), 53 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 061eb9388..0c5324551 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6381,7 +6381,11 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_FASTDUST6", "S_FASTDUST7", - // Thunder Shield Burst + // Drift boost effect + "S_DRIFTEXPLODE1", + "S_DRIFTEXPLODE2", + "S_DRIFTEXPLODE3", + "S_DRIFTEXPLODE4", // Sneaker boost effect "S_BOOSTFLAME", @@ -7742,6 +7746,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_FASTLINE", "MT_FASTDUST", + "MT_DRIFTEXPLODE", "MT_BOOSTFLAME", "MT_BOOSTSMOKE", "MT_SNEAKERTRAIL", diff --git a/src/info.c b/src/info.c index df8f31061..ef878fe16 100644 --- a/src/info.c +++ b/src/info.c @@ -70,7 +70,7 @@ char sprnames[NUMSPRITES + 1][5] = "DUCK","GTRE","CHES","CHIM","DRGN","LZMN","PGSS","ZTCH","MKMA","MKMP", "RTCH","BOWL","BOWH","BRRL","BRRR","HRSE","TOAH","BFRT","OFRT","RFRT", "PFRT","ASPK","HBST","HBSO","HBSF","WBLZ","WBLN","FWRK","MXCL","RGSP", - "DRAF","GRES","OTFG","XMS4","XMS5","VIEW" + "DRAF","GRES","OTFG","DBOS","XMS4","XMS5","VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -2616,6 +2616,11 @@ state_t states[NUMSTATES] = {SPR_DSHR, FF_PAPERSPRITE|5, 1, {NULL}, 0, 0, S_FASTDUST7}, // S_FASTDUST6 {SPR_DSHR, FF_PAPERSPRITE|6, 1, {NULL}, 0, 0, S_NULL}, // S_FASTDUST7 + {SPR_DBOS, FF_FULLBRIGHT, 2, {NULL}, 6, 1, S_DRIFTEXPLODE2}, // S_DRIFTEXPLODE1 + {SPR_DBOS, FF_FULLBRIGHT|1, 2, {NULL}, 6, 1, S_DRIFTEXPLODE3}, // S_DRIFTEXPLODE2 + {SPR_DBOS, FF_FULLBRIGHT|2, 2, {NULL}, 6, 1, S_DRIFTEXPLODE4}, // S_DRIFTEXPLODE3 + {SPR_DBOS, FF_FULLBRIGHT|3, 2, {NULL}, 6, 1, S_DRIFTEXPLODE1}, // S_DRIFTEXPLODE4 + {SPR_BOST, FF_FULLBRIGHT|FF_ANIMATE, TICRATE, {NULL}, 6, 1, S_BOOSTSMOKESPAWNER}, // S_BOOSTFLAME {SPR_NULL, 0, TICRATE/2, {NULL}, 0, 0, S_NULL}, // S_BOOSTSMOKESPAWNER @@ -15218,6 +15223,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_DRIFTEXPLODE + -1, // doomednum + S_DRIFTEXPLODE1, // 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 + 32*FRACUNIT, // radius + 64*FRACUNIT, // height + 1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + { // MT_BOOSTFLAME -1, // doomednum S_BOOSTFLAME, // spawnstate diff --git a/src/info.h b/src/info.h index 78902d297..a20875c68 100644 --- a/src/info.h +++ b/src/info.h @@ -786,6 +786,8 @@ typedef enum sprite SPR_OTFG, + SPR_DBOS, // Drift boost flame + // Xmas-specific sprites that don't fit aboxe SPR_XMS4, SPR_XMS5, @@ -3271,7 +3273,11 @@ typedef enum state S_FASTDUST6, S_FASTDUST7, - // Magnet Burst + // Drift boost effect + S_DRIFTEXPLODE1, + S_DRIFTEXPLODE2, + S_DRIFTEXPLODE3, + S_DRIFTEXPLODE4, // Sneaker boost effect S_BOOSTFLAME, @@ -4664,6 +4670,7 @@ typedef enum mobj_type MT_FASTLINE, MT_FASTDUST, + MT_DRIFTEXPLODE, MT_BOOSTFLAME, MT_BOOSTSMOKE, MT_SNEAKERTRAIL, diff --git a/src/k_kart.c b/src/k_kart.c index ccace01f5..d32927c51 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3202,9 +3202,6 @@ static void K_SpawnDriftSparks(player_t *player) if (leveltime % 2 == 1) return; - if (!P_IsObjectOnGround(player->mo)) - return; - if (!player->kartstuff[k_drift] || (player->kartstuff[k_driftcharge] < ds && !(player->kartstuff[k_driftcharge] < 0))) return; @@ -5861,6 +5858,11 @@ static void K_KartDrift(player_t *player, boolean onground) { if (player->kartstuff[k_driftcharge] < 0 || player->kartstuff[k_driftcharge] >= dsone) { + //mobj_t *overlay = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_DRIFTEXPLODE); + //P_SetTarget(&overlay->target, player->mo); + //P_SetScale(overlay, (overlay->destscale = player->mo->scale)); + //K_FlipFromObject(overlay, player->mo); + S_StartSound(player->mo, sfx_s23c); //K_SpawnDashDustRelease(player); @@ -5869,24 +5871,36 @@ static void K_KartDrift(player_t *player, boolean onground) // Stage 0: Yellow sparks if (player->kartstuff[k_driftboost] < 15) player->kartstuff[k_driftboost] = 15; + + //overlay->color = SKINCOLOR_GOLD; + //overlay->fuse = 8; } else if (player->kartstuff[k_driftcharge] >= dsone && player->kartstuff[k_driftcharge] < dstwo) { // Stage 1: Red sparks if (player->kartstuff[k_driftboost] < 20) player->kartstuff[k_driftboost] = 20; + + //overlay->color = SKINCOLOR_KETCHUP; + //overlay->fuse = 16; } else if (player->kartstuff[k_driftcharge] < dsthree) { // Stage 2: Blue sparks if (player->kartstuff[k_driftboost] < 50) player->kartstuff[k_driftboost] = 50; + + //overlay->color = SKINCOLOR_SAPPHIRE; + //overlay->fuse = 32; } else if (player->kartstuff[k_driftcharge] >= dsthree) { // Stage 3: Rainbow sparks if (player->kartstuff[k_driftboost] < 125) player->kartstuff[k_driftboost] = 125; + + //overlay->color = SKINCOLOR_SILVER; + //overlay->fuse = 120; } } @@ -5933,64 +5947,71 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_aizdriftstrat] = player->kartstuff[k_brakedrift] = 0; player->kartstuff[k_getsparks] = 0; } - else if (player->kartstuff[k_jmp] == 1 && onground && player->kartstuff[k_drift] != 0) + else if (player->kartstuff[k_jmp] == 1 && player->kartstuff[k_drift] != 0) { // Incease/decrease the drift value to continue drifting in that direction fixed_t driftadditive = 24; boolean playsound = false; - if (player->kartstuff[k_drift] >= 1) // Drifting to the left + if (onground) { - player->kartstuff[k_drift]++; - if (player->kartstuff[k_drift] > 5) - player->kartstuff[k_drift] = 5; - - if (player->cmd.driftturn > 0) // Inward - driftadditive += abs(player->cmd.driftturn)/100; - if (player->cmd.driftturn < 0) // Outward - driftadditive -= abs(player->cmd.driftturn)/75; - } - else if (player->kartstuff[k_drift] <= -1) // Drifting to the right - { - player->kartstuff[k_drift]--; - if (player->kartstuff[k_drift] < -5) - player->kartstuff[k_drift] = -5; - - if (player->cmd.driftturn < 0) // Inward - driftadditive += abs(player->cmd.driftturn)/100; - if (player->cmd.driftturn > 0) // Outward - driftadditive -= abs(player->cmd.driftturn)/75; - } - - // Disable drift-sparks until you're going fast enough - if (player->kartstuff[k_getsparks] == 0 - || (player->kartstuff[k_offroad] - && !player->kartstuff[k_invincibilitytimer] - && !player->kartstuff[k_hyudorotimer] - && !EITHERSNEAKER(player))) - driftadditive = 0; - - // Inbetween minspeed and minspeed*2, it'll keep your previous drift-spark state. - if (player->speed > minspeed*2) - { - player->kartstuff[k_getsparks] = 1; - - if (player->kartstuff[k_driftcharge] <= -1) + if (player->kartstuff[k_drift] >= 1) // Drifting to the left { - player->kartstuff[k_driftcharge] = dsone; // Back to red - playsound = true; + player->kartstuff[k_drift]++; + if (player->kartstuff[k_drift] > 5) + player->kartstuff[k_drift] = 5; + + if (player->cmd.driftturn > 0) // Inward + driftadditive += abs(player->cmd.driftturn)/100; + if (player->cmd.driftturn < 0) // Outward + driftadditive -= abs(player->cmd.driftturn)/75; + } + else if (player->kartstuff[k_drift] <= -1) // Drifting to the right + { + player->kartstuff[k_drift]--; + if (player->kartstuff[k_drift] < -5) + player->kartstuff[k_drift] = -5; + + if (player->cmd.driftturn < 0) // Inward + driftadditive += abs(player->cmd.driftturn)/100; + if (player->cmd.driftturn > 0) // Outward + driftadditive -= abs(player->cmd.driftturn)/75; + } + + // Disable drift-sparks until you're going fast enough + if (player->kartstuff[k_getsparks] == 0 + || (player->kartstuff[k_offroad] + && !player->kartstuff[k_invincibilitytimer] + && !player->kartstuff[k_hyudorotimer] + && !EITHERSNEAKER(player))) + driftadditive = 0; + + // Inbetween minspeed and minspeed*2, it'll keep your previous drift-spark state. + if (player->speed > minspeed*2) + { + player->kartstuff[k_getsparks] = 1; + + if (player->kartstuff[k_driftcharge] <= -1) + { + player->kartstuff[k_driftcharge] = dsone; // Back to red + playsound = true; + } + } + else if (player->speed <= minspeed) + { + player->kartstuff[k_getsparks] = 0; + driftadditive = 0; + + if (player->kartstuff[k_driftcharge] >= dsone) + { + player->kartstuff[k_driftcharge] = -1; // Set yellow sparks + playsound = true; + } } } - else if (player->speed <= minspeed) + else { - player->kartstuff[k_getsparks] = 0; driftadditive = 0; - - if (player->kartstuff[k_driftcharge] >= dsone) - { - player->kartstuff[k_driftcharge] = -1; // Set yellow sparks - playsound = true; - } } // This spawns the drift sparks diff --git a/src/p_mobj.c b/src/p_mobj.c index 9f688e369..50bb4009a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8289,6 +8289,37 @@ void P_MobjThinker(mobj_t *mobj) S_StartSound(mobj, sfx_s3k4e); mobj->health--; break; + case MT_DRIFTEXPLODE: + if (!mobj->target || !mobj->target->health) + { + P_RemoveMobj(mobj); + return; + } + + mobj->angle = mobj->target->angle; + P_TeleportMove(mobj, mobj->target->x + P_ReturnThrustX(mobj, mobj->angle+ANGLE_180, mobj->target->radius), + mobj->target->y + P_ReturnThrustY(mobj, mobj->angle+ANGLE_180, mobj->target->radius), mobj->target->z); + P_SetScale(mobj, mobj->target->scale); + mobj->flags2 ^= MF2_DONTDRAW; +#ifdef HWRENDER + mobj->modeltilt = mobj->target->modeltilt; +#endif + + { + player_t *p = NULL; + if (mobj->target->target && mobj->target->target->player) + p = mobj->target->target->player; + else if (mobj->target->player) + p = mobj->target->player; + + if (p) + { + if (p->kartstuff[k_driftboost] > mobj->movecount) + ; // reset animation + mobj->movecount = p->kartstuff[k_driftboost]; + } + } + break; case MT_BOOSTFLAME: if (!mobj->target || !mobj->target->health) { From 46049dba408c003cdad5a6682dddafff3acb55db Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Thu, 19 Mar 2020 22:52:11 -0400 Subject: [PATCH 15/16] Fix drift spark weirdness in mobjscale maps --- src/k_kart.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index d32927c51..1346a09fd 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3573,7 +3573,7 @@ void K_SpawnDraftDust(mobj_t *mo) void K_DriftDustHandling(mobj_t *spawner) { angle_t anglediff; - const INT16 spawnrange = spawner->radius>>FRACBITS; + const INT16 spawnrange = spawner->radius >> FRACBITS; if (!P_IsObjectOnGround(spawner) || leveltime % 2 != 0) return; @@ -3612,8 +3612,8 @@ void K_DriftDustHandling(mobj_t *spawner) if (anglediff > ANG10*4) // Trying to turn further than 40 degrees { - fixed_t spawnx = P_RandomRange(-spawnrange, spawnrange) * spawner->scale; - fixed_t spawny = P_RandomRange(-spawnrange, spawnrange) * spawner->scale; + fixed_t spawnx = P_RandomRange(-spawnrange, spawnrange) << FRACBITS; + fixed_t spawny = P_RandomRange(-spawnrange, spawnrange) << FRACBITS; INT32 speedrange = 2; mobj_t *dust = P_SpawnMobj(spawner->x + spawnx, spawner->y + spawny, spawner->z, MT_DRIFTDUST); dust->momx = FixedMul(spawner->momx + (P_RandomRange(-speedrange, speedrange) * spawner->scale), 3*(spawner->scale)/4); From 668f80a8ea1a7aa7d3aabb3367fad91e51ef22ed Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 21 Mar 2020 18:47:44 -0400 Subject: [PATCH 16/16] Properly scale... --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 1346a09fd..6cdbfa547 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3616,8 +3616,8 @@ void K_DriftDustHandling(mobj_t *spawner) fixed_t spawny = P_RandomRange(-spawnrange, spawnrange) << FRACBITS; INT32 speedrange = 2; mobj_t *dust = P_SpawnMobj(spawner->x + spawnx, spawner->y + spawny, spawner->z, MT_DRIFTDUST); - dust->momx = FixedMul(spawner->momx + (P_RandomRange(-speedrange, speedrange) * spawner->scale), 3*(spawner->scale)/4); - dust->momy = FixedMul(spawner->momy + (P_RandomRange(-speedrange, speedrange) * spawner->scale), 3*(spawner->scale)/4); + dust->momx = FixedMul(spawner->momx + (P_RandomRange(-speedrange, speedrange) * spawner->scale), 3*FRACUNIT/4); + dust->momy = FixedMul(spawner->momy + (P_RandomRange(-speedrange, speedrange) * spawner->scale), 3*FRACUNIT/4); dust->momz = P_MobjFlip(spawner) * (P_RandomRange(1, 4) * (spawner->scale)); P_SetScale(dust, spawner->scale/2); dust->destscale = spawner->scale * 3;