From 44612d5b5969f3b0c0fa16c6e9b79cf89d33c0db Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 26 Jan 2026 18:46:55 +0000 Subject: [PATCH] Fix: Articulated road vehicle following with immediately sequential u-turns (#15170) --- src/roadveh_cmd.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index b22e5ec3ae..5201b53b53 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -1076,7 +1076,7 @@ static Trackdir FollowPreviousRoadVehicle(const RoadVehicle *v, const RoadVehicl if (diag_dir == INVALID_DIAGDIR) return INVALID_TRACKDIR; dir = DiagDirToDiagTrackdir(diag_dir); } else { - if (already_reversed && prev->tile != tile) { + if (already_reversed && (prev->tile != tile || (prev_state < TRACKDIR_END && IsReversingRoadTrackdir(static_cast(prev_state))))) { /* * The vehicle has reversed, but did not go straight back. * It immediately turn onto another tile. This means that @@ -1092,10 +1092,16 @@ static Trackdir FollowPreviousRoadVehicle(const RoadVehicle *v, const RoadVehicl * going over the trackdirs used for turning 90 degrees, i.e. * TRACKDIR_{UPPER,RIGHT,LOWER,LEFT}_{N,E,S,W}. */ + bool north; + if (prev->tile != tile) { + north = prev->tile < tile; + } else { + north = (prev_state == TRACKDIR_RVREV_NW || prev_state == TRACKDIR_RVREV_NE); + } static const Trackdir reversed_turn_lookup[2][DIAGDIR_END] = { { TRACKDIR_UPPER_W, TRACKDIR_RIGHT_N, TRACKDIR_LEFT_N, TRACKDIR_UPPER_E }, { TRACKDIR_RIGHT_S, TRACKDIR_LOWER_W, TRACKDIR_LOWER_E, TRACKDIR_LEFT_S }}; - dir = reversed_turn_lookup[prev->tile < tile ? 0 : 1][ReverseDiagDir(entry_dir)]; + dir = reversed_turn_lookup[north ? 0 : 1][ReverseDiagDir(entry_dir)]; } else if (HasBit(prev_state, RVS_IN_DT_ROAD_STOP)) { dir = (Trackdir)(prev_state & RVSB_ROAD_STOP_TRACKDIR_MASK); } else if (prev_state < TRACKDIR_END) {