From a46093fe9d149a94c72e47e363fb04da522ab5c2 Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Sun, 22 Oct 2017 22:08:07 +0100 Subject: [PATCH] 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: