From 68abeed9b896bc0cf4f08cc0cc3bd4bc03d8fe28 Mon Sep 17 00:00:00 2001
From: maedhros <maedhros@openttd.org>
Date: Mon, 6 Aug 2007 12:46:49 +0000
Subject: [PATCH] (svn r10809) -Fix (r10097): When reversing, articulated parts
 of road vehicles should not attempt to do their own pathfinding.

---
 src/roadveh_cmd.cpp | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp
index 56d48a816d..0e4a5751da 100644
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -1376,9 +1376,9 @@ static bool RoadVehLeaveDepot(Vehicle *v, bool first)
 	return true;
 }
 
-static Trackdir FollowPreviousRoadVehicle(const Vehicle *v, const Vehicle *prev, TileIndex tile, DiagDirection entry_dir)
+static Trackdir FollowPreviousRoadVehicle(const Vehicle *v, const Vehicle *prev, TileIndex tile, DiagDirection entry_dir, bool already_reversed)
 {
-	if (prev->tile == v->tile) {
+	if (prev->tile == v->tile && !already_reversed) {
 		/* If the previous vehicle is on the same tile as this vehicle is
 		 * then it must have reversed. */
 		return _road_reverse_table[entry_dir];
@@ -1491,7 +1491,7 @@ static bool IndividualRoadVehicleController(Vehicle *v, const Vehicle *prev)
 			/* If this is the front engine, look for the right path. */
 			dir = RoadFindPathToDest(v, tile, (DiagDirection)(rd.x & 3));
 		} else {
-			dir = FollowPreviousRoadVehicle(v, prev, tile, (DiagDirection)(rd.x & 3));
+			dir = FollowPreviousRoadVehicle(v, prev, tile, (DiagDirection)(rd.x & 3), false);
 		}
 
 		if (dir == INVALID_TRACKDIR) {
@@ -1583,11 +1583,18 @@ again:
 
 	if (rd.x & RDE_TURNED) {
 		/* Vehicle has finished turning around, it will now head back onto the same tile */
-		Trackdir dir = RoadFindPathToDest(v, v->tile, (DiagDirection)(rd.x & 3));
+		Trackdir dir;
 		uint32 r;
 		Direction newdir;
 		const RoadDriveEntry *rdp;
 
+		if (IsRoadVehFront(v)) {
+			/* If this is the front engine, look for the right path. */
+			dir = RoadFindPathToDest(v, v->tile, (DiagDirection)(rd.x & 3));
+		} else {
+			dir = FollowPreviousRoadVehicle(v, prev, v->tile, (DiagDirection)(rd.x & 3), true);
+		}
+
 		if (dir == INVALID_TRACKDIR) {
 			v->cur_speed = 0;
 			return false;