From bbec083d4e8f56f3d3509f6b8948ced7cadd2e2f Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 25 Sep 2022 12:04:08 -0400 Subject: [PATCH] Polish backwards behavior --- src/k_kart.c | 21 ++++++++++++++------- src/objects/jawz.c | 29 ++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 04752dcb7..b644350ff 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4698,7 +4698,7 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I speed, FixedMul( FixedDiv(source->player->speed, topspeed), // Multiply speed to be proportional to your own, boosted maxspeed. - FixedDiv((ANGLE_180 - delta), ANGLE_180) // multiply speed based on angle diff... i.e: don't do this for firing backward :V + FixedDiv(AngleFixed(ANGLE_180 - delta), 180 * FRACUNIT) // multiply speed based on angle diff... i.e: don't do this for firing backward :V ) )); } @@ -5608,15 +5608,15 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, if (missile) // Shootables { - if (dir == -1 && mapthing != MT_SPB) + if (dir < 0 && mapthing != MT_SPB) { // Shoot backward - mo = K_SpawnKartMissile(player->mo, mapthing, (player->mo->angle + ANGLE_180) + angleOffset, 0, PROJSPEED, -1); + mo = K_SpawnKartMissile(player->mo, mapthing, (player->mo->angle + ANGLE_180) + angleOffset, 0, PROJSPEED, dir); } else { // Shoot forward - mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + angleOffset, 0, PROJSPEED, 1); + mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + angleOffset, 0, PROJSPEED, dir); } if (mapthing == MT_DROPTARGET && mo) @@ -8273,13 +8273,20 @@ void K_KartPlayerAfterThink(player_t *player) player_t *targ; mobj_t *ret; - if (player->jawztargetdelay && playeringame[lasttarg] && !players[lasttarg].spectator) + if (player->throwdir == -1) + { + targ = player; + player->jawztargetdelay = 0; + } + else if (player->jawztargetdelay && playeringame[lasttarg] && !players[lasttarg].spectator) { targ = &players[lasttarg]; player->jawztargetdelay--; } else + { targ = K_FindJawzTarget(player->mo, player, ANGLE_45); + } if (!targ || !targ->mo || P_MobjWasRemoved(targ->mo)) { @@ -8297,14 +8304,14 @@ void K_KartPlayerAfterThink(player_t *player) ret->tics = 1; ret->color = player->skincolor; - if (targ-players != lasttarg) + if (targ - players != lasttarg) { if (P_IsDisplayPlayer(player) || P_IsDisplayPlayer(targ)) S_StartSound(NULL, sfx_s3k89); else S_StartSound(targ->mo, sfx_s3k89); - player->lastjawztarget = targ-players; + player->lastjawztarget = targ - players; player->jawztargetdelay = 5; } } diff --git a/src/objects/jawz.c b/src/objects/jawz.c index 0ab8b6c67..b5bc71058 100644 --- a/src/objects/jawz.c +++ b/src/objects/jawz.c @@ -33,12 +33,11 @@ #define jawz_droptime(o) ((o)->movecount) #define jawz_retcolor(o) ((o)->cvmem) +#define jawz_stillturn(o) ((o)->cusval) #define jawz_owner(o) ((o)->target) #define jawz_chase(o) ((o)->tracer) -#define jawz_shield_dist(o) ((o)->extravalue1) - static void JawzChase(mobj_t *th, boolean grounded) { fixed_t thrustamount = 0; @@ -131,6 +130,7 @@ static void JawzChase(mobj_t *th, boolean grounded) P_SetTarget(&ret->target, jawz_chase(th)); ret->frame |= ((leveltime % 10) / 2) + 5; ret->color = jawz_retcolor(th); + ret->renderflags = (ret->renderflags & ~RF_DONTDRAW) | (th->renderflags & RF_DONTDRAW); } else { @@ -154,6 +154,13 @@ static void JawzChase(mobj_t *th, boolean grounded) } } + if (jawz_stillturn(th) > 0) + { + // When beginning to chase your own owner, + // we should turn but not thrust quite yet. + return; + } + if (grounded == true) { const fixed_t currentspeed = R_PointToDist2(0, 0, th->momx, th->momy); @@ -222,6 +229,11 @@ void Obj_JawzThink(mobj_t *th) jawz_selfdelay(th)--; } + if (jawz_stillturn(th) > 0) + { + jawz_stillturn(th)--; + } + if (leveltime % TICRATE == 0) { S_StartSound(th, th->info->activesound); @@ -247,8 +259,19 @@ void Obj_JawzThrown(mobj_t *th, fixed_t finalSpeed, SINT8 dir) { // Thrown backwards, init self-chase P_SetTarget(&jawz_chase(th), jawz_owner(th)); - th->fuse = RR_PROJECTILE_FUSE; + + // Stop it here. + th->momx = 0; + th->momy = 0; + + // Slow down the top speed. finalSpeed = FixedMul(finalSpeed, 4*FRACUNIT/5); + + // Set a fuse. + th->fuse = RR_PROJECTILE_FUSE; + + // Stay still while you turn towards the player + jawz_stillturn(th) = ANGLE_180 / MAX_JAWZ_TURN; } else {