From 44b642ffa38bdc851a3d805e8751deb9f7e2eb55 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Mon, 10 Apr 2023 22:39:17 -0700 Subject: [PATCH 1/5] WIP: improved countersteering --- src/k_kart.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index c06b15bd7..5fcaa2ca1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8854,10 +8854,17 @@ INT16 K_UpdateSteeringValue(INT16 inputSteering, INT16 destSteering) // player->steering is the turning value, but with easing applied. // Keeps micro-turning from old easing, but isn't controller dependent. - const INT16 amount = KART_FULLTURN/3; + INT16 amount = KART_FULLTURN/3; INT16 diff = destSteering - inputSteering; INT16 outputSteering = inputSteering; + + if ((inputSteering > 0 && destSteering < inputSteering) || (inputSteering < 0 && destSteering > inputSteering)) + { + amount = KART_FULLTURN; + } + + if (abs(diff) <= amount) { // Reached the intended value, set instantly. From 94cf9fc47bc0c15bcdadf1e0f99a83d1e6e5070e Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Mon, 10 Apr 2023 23:15:23 -0700 Subject: [PATCH 2/5] WIP: don't oversteer when crossing 0 boundary --- 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 5fcaa2ca1..cdce66665 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8859,9 +8859,9 @@ INT16 K_UpdateSteeringValue(INT16 inputSteering, INT16 destSteering) INT16 outputSteering = inputSteering; - if ((inputSteering > 0 && destSteering < inputSteering) || (inputSteering < 0 && destSteering > inputSteering)) + if ((inputSteering > 0 && destSteering < 0) || (inputSteering < 0 && destSteering > 0)) { - amount = KART_FULLTURN; + amount = max(min(KART_FULLTURN, abs(inputSteering)), amount); } From b4ffc33fcb56034b339cb65603ad30c43203fda2 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Tue, 11 Apr 2023 00:15:44 -0700 Subject: [PATCH 3/5] Sliptide-aware camera steering, fix countersteer easing --- src/k_kart.c | 6 +++++- src/p_user.c | 22 ++++++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index cdce66665..43ebdea3a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8859,9 +8859,13 @@ INT16 K_UpdateSteeringValue(INT16 inputSteering, INT16 destSteering) INT16 outputSteering = inputSteering; + // We switched steering directions, lighten up on easing for a more responsive countersteer. + // (Don't do this for steering 0, let digital inputs tap-adjust!) if ((inputSteering > 0 && destSteering < 0) || (inputSteering < 0 && destSteering > 0)) { - amount = max(min(KART_FULLTURN, abs(inputSteering)), amount); + // Don't let small turns in direction X allow instant turns in direction Y. + INT16 countersteer = min(KART_FULLTURN, abs(inputSteering)); // The farthest we should go is to 0 -- neutral. + amount = max(countersteer, amount); // But don't reduce turning strength from baseline either. } diff --git a/src/p_user.c b/src/p_user.c index e05d1a0f7..b48dc206d 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2235,16 +2235,30 @@ static void P_UpdatePlayerAngle(player_t *player) angle_t leniency = (4*ANG1/3) * min(player->cmd.latency, 6); // Don't force another turning tic, just give them the desired angle! - if (targetDelta == angleChange || K_Sliptiding(player) || (maxTurnRight == 0 && maxTurnLeft == 0)) + if (targetDelta == angleChange || (maxTurnRight == 0 && maxTurnLeft == 0)) { - // Either we're dead on, we can't steer, or we're in a special handling state. - // Stuff like sliptiding requires some blind-faith steering: - // if a camera correction stops our turn input, the sliptide randomly fails! + // Either we're dead on or we can't steer at all. player->steering = targetsteering; } else { // We're off. Try to legally steer the player towards their camera. + + if (K_Sliptiding(player) && P_IsObjectOnGround(player->mo) && (player->cmd.turning != 0) && ((player->cmd.turning > 0) == (player->aizdriftstrat > 0))) + { + // Don't change handling direction if someone's inputs are sliptiding, you'll break the sliptide! + if (player->cmd.turning > 0) + { + steeringRight = max(steeringRight, max(steeringLeft, 1)); + steeringLeft = max(steeringLeft, 1); + } + else + { + steeringLeft = min(steeringLeft, max(steeringRight, -1)); + steeringRight = min(steeringLeft, -1); + } + } + player->steering = P_FindClosestTurningForAngle(player, targetDelta, steeringLeft, steeringRight); angleChange = K_GetKartTurnValue(player, player->steering) << TICCMD_REDUCE; From d870bf0416602e650ed824922358bcbbab4fa2ab Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Wed, 12 Apr 2023 00:47:00 -0700 Subject: [PATCH 4/5] Fix min/max allowing for theoretical handling breakage in camera-sliptide logic --- src/p_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index b48dc206d..d58ac8c26 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2254,7 +2254,7 @@ static void P_UpdatePlayerAngle(player_t *player) } else { - steeringLeft = min(steeringLeft, max(steeringRight, -1)); + steeringLeft = min(steeringLeft, min(steeringRight, -1)); steeringRight = min(steeringLeft, -1); } } From e3ea9df6833f3c7be0f66007a26d29c6aa351a48 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Wed, 12 Apr 2023 01:26:33 -0700 Subject: [PATCH 5/5] Fix sliptide death-spirals on input boundary cross --- src/p_user.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index d58ac8c26..631df9583 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2249,13 +2249,13 @@ static void P_UpdatePlayerAngle(player_t *player) // Don't change handling direction if someone's inputs are sliptiding, you'll break the sliptide! if (player->cmd.turning > 0) { - steeringRight = max(steeringRight, max(steeringLeft, 1)); steeringLeft = max(steeringLeft, 1); + steeringRight = max(steeringRight, steeringLeft); } else { - steeringLeft = min(steeringLeft, min(steeringRight, -1)); - steeringRight = min(steeringLeft, -1); + steeringRight = min(steeringRight, -1); + steeringLeft = min(steeringLeft, steeringRight); } }