From a46093fe9d149a94c72e47e363fb04da522ab5c2 Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Sun, 22 Oct 2017 22:08:07 +0100 Subject: [PATCH 1/2] Red shell rework, they always instathrust to their top speed in their current movement direction. When they get close their top speed starts to decrease to the player's current speed. Movement direction ends up being adjusted in A_RedShellChase where it Thrusts towards the player at its acceleration speed. --- src/p_mobj.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index d14ee865..77e3cfd2 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -35,6 +35,8 @@ #include "p_slopes.h" #endif +#include "k_kart.h" + // protos. static CV_PossibleValue_t viewheight_cons_t[] = {{16, "MIN"}, {56, "MAX"}, {0, NULL}}; consvar_t cv_viewheight = {"viewheight", VIEWHEIGHTS, 0, viewheight_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -7505,19 +7507,39 @@ void P_MobjThinker(mobj_t *mobj) break; case MT_REDITEM: { - fixed_t magnitude; + fixed_t topspeed = 64*FRACUNIT; + fixed_t distbarrier = 512*FRACUNIT; + fixed_t distaway; if (mobj->threshold > 0) mobj->threshold--; if (leveltime % 7 == 0) S_StartSound(mobj, mobj->info->activesound); - // Do a similar thing to what is done to the player to keep the red shell at a speed cap - magnitude = P_AproxDistance(mobj->momx, mobj->momy); - if (magnitude > 64*FRACUNIT) + if (cv_kartcc.value == 50) { - mobj->momx = FixedMul(FixedDiv(mobj->momx, magnitude), 64*FRACUNIT); - mobj->momy = FixedMul(FixedDiv(mobj->momy, magnitude), 64*FRACUNIT); + topspeed = FixedMul(topspeed, FRACUNIT-FRACUNIT/4); + distbarrier = FixedMul(distbarrier, FRACUNIT-FRACUNIT/4); } + else if (cv_kartcc.value == 150) + { + topspeed = FixedMul(topspeed, FRACUNIT+FRACUNIT/4); + distbarrier = FixedMul(distbarrier, FRACUNIT+FRACUNIT/4); + } + + if (mobj->tracer) + { + distaway = P_AproxDistance(mobj->tracer->x - mobj->x, mobj->tracer->y - mobj->y); + if (distaway < distbarrier) + { + if (mobj->tracer->player) + { + fixed_t speeddifference = abs(topspeed - min(mobj->tracer->player->speed, K_GetKartSpeed(mobj->tracer->player, false))); + topspeed = topspeed - FixedMul(speeddifference, FRACUNIT-FixedDiv(distaway, distbarrier)); + } + } + } + + P_InstaThrust(mobj, R_PointToAngle2(0, 0, mobj->momx, mobj->momy), topspeed); break; } case MT_REDITEMDUD: From a9c6670ee125b89a01eef2a4248f033f030ae2f5 Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Sun, 22 Oct 2017 22:29:39 +0100 Subject: [PATCH 2/2] Green shells are faster/slower in 150cc/50cc. Green shells now get slower as they bounce more. --- src/p_mobj.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 77e3cfd2..52c52fbc 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7498,13 +7498,38 @@ void P_MobjThinker(mobj_t *mobj) } break; case MT_GREENITEM: + { + fixed_t finalspeed = mobj->info->speed; + + if (cv_kartcc.value == 50) + { + finalspeed = FixedMul(finalspeed, FRACUNIT-FRACUNIT/4); + } + else if (cv_kartcc.value == 150) + { + finalspeed = FixedMul(finalspeed, FRACUNIT+FRACUNIT/4); + } + mobj->angle = R_PointToAngle2(mobj->x, mobj->y, mobj->x+mobj->momx, mobj->y+mobj->momy); - P_InstaThrust(mobj, mobj->angle, mobj->info->speed); + if (mobj->health <= 5) + { + INT32 i; + for (i = 5; i >= mobj->health; i--) + { + finalspeed = FixedMul(finalspeed, FRACUNIT-FRACUNIT/4); + } + P_InstaThrust(mobj, mobj->angle, finalspeed); + } + else + { + P_InstaThrust(mobj, mobj->angle, finalspeed); + } if (mobj->threshold > 0) mobj->threshold--; if (leveltime % 6 == 0) S_StartSound(mobj, mobj->info->activesound); break; + } case MT_REDITEM: { fixed_t topspeed = 64*FRACUNIT;