From cda0441abb315cc57b479a98a96a4222aa2ea2e1 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 23 May 2022 00:36:03 -0400 Subject: [PATCH] Follower angle lag + lookback - ANGLELAG lets you set how fast the followers swivel around. Default is 8*FRACUNIT, old behavior can be returned with FRACUNIT. - Followers reverse their angle when you hold the lookback button. - All lag values can't go below FRACUNIT instead of 1. --- src/deh_soc.c | 10 ++++++++-- src/k_follower.c | 24 +++++++++++++++++++++++- src/k_follower.h | 2 ++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/deh_soc.c b/src/deh_soc.c index 6fe6ca36b..ba2845901 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -3827,6 +3827,7 @@ void readfollower(MYFILE *f) followers[numfollowers].zoffs = 32*FRACUNIT; followers[numfollowers].horzlag = 2*FRACUNIT; followers[numfollowers].vertlag = 6*FRACUNIT; + followers[numfollowers].anglelag = 8*FRACUNIT; followers[numfollowers].bobspeed = TICRATE*2; followers[numfollowers].bobamp = 4*FRACUNIT; followers[numfollowers].hitconfirmtime = TICRATE; @@ -3888,6 +3889,10 @@ void readfollower(MYFILE *f) { followers[numfollowers].vertlag = (fixed_t)get_number(word2); } + else if (fastcmp(word, "ANGLELAG")) + { + followers[numfollowers].vertlag = (fixed_t)get_number(word2); + } else if (fastcmp(word, "BOBSPEED")) { followers[numfollowers].bobspeed = (tic_t)get_number(word2); @@ -4002,8 +4007,9 @@ if ((signed)followers[numfollowers].field < threshold) \ FALLBACK(dist, "DIST", 0, 0); FALLBACK(height, "HEIGHT", 1, 1); FALLBACK(zoffs, "ZOFFS", 0, 0); - FALLBACK(horzlag, "HORZLAG", 1, 1); - FALLBACK(vertlag, "VERTLAG", 1, 1); + FALLBACK(horzlag, "HORZLAG", FRACUNIT, FRACUNIT); + FALLBACK(vertlag, "VERTLAG", FRACUNIT, FRACUNIT); + FALLBACK(anglelag, "ANGLELAG", FRACUNIT, FRACUNIT); FALLBACK(bobamp, "BOBAMP", 0, 0); FALLBACK(bobspeed, "BOBSPEED", 0, 0); FALLBACK(hitconfirmtime, "HITCONFIRMTIME", 1, 1); diff --git a/src/k_follower.c b/src/k_follower.c index 42b956e9a..6973e0fcd 100644 --- a/src/k_follower.c +++ b/src/k_follower.c @@ -191,6 +191,8 @@ void K_HandleFollower(player_t *player) fixed_t bubble; // bubble scale (0 if no bubble) mobj_t *bmobj; // temp bubble mobj + angle_t destAngle, angleDiff; + if (player->followerready == false) { // we aren't ready to perform anything follower related yet. @@ -346,7 +348,27 @@ void K_HandleFollower(player_t *player) } // if we're moving let's make the angle the direction we're moving towards. This is to avoid drifting / reverse looking awkward. - player->follower->angle = K_MomentumAngle(player->follower); + destAngle = K_MomentumAngle(player->follower); + + // Sal: Turn the follower around when looking backwards. + if ( player->cmd.buttons & BT_LOOKBACK ) + { + destAngle += ANGLE_180; + } + + // Sal: Smoothly rotate angle to the destination value. + angleDiff = destAngle - player->follower->angle; + + if (angleDiff > ANGLE_180) + { + angleDiff = InvAngle(FixedDiv(InvAngle(angleDiff), fl.anglelag)); + } + else + { + angleDiff = FixedDiv(angleDiff, fl.anglelag); + } + + player->follower->angle += angleDiff; // Finally, if the follower has bubbles, move them, set their scale, etc.... // This is what I meant earlier by it being easier, now we can just use this weird lil loop to get the job done! diff --git a/src/k_follower.h b/src/k_follower.h index 807d9ac57..b5c740a22 100644 --- a/src/k_follower.h +++ b/src/k_follower.h @@ -45,6 +45,8 @@ typedef struct follower_s fixed_t horzlag; // Lag for X/Y displacement. Default is 2. Must be > 0 because we divide by this number. fixed_t vertlag; // Z displacement lag. Default is 6. Must be > 0 because we divide by this number. + fixed_t anglelag; // Angle rotation lag. Default is 8. Must be > 0 because we divide by this number. + fixed_t bobamp; // Bob amplitude. Default is 4. tic_t bobspeed; // Arbitrary modifier for bobbing speed. Default is TICRATE*2 (70)