changeset 15570:8aa97022946d draft

(svn r20230) -Fix [FS#3961]: road vehicles could be dead locked with one way roads. This allows one wayness to be removed if there are vehicles on a tile; it does not allow you to add one wayness to roads that have vehicles on them as it makes turning vehicles jump
author rubidium <rubidium@openttd.org>
date Tue, 27 Jul 2010 22:00:43 +0000
parents 919e5dbec304
children a2d9a59e847b
files src/road_cmd.cpp
diffstat 1 files changed, 12 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/road_cmd.cpp
+++ b/src/road_cmd.cpp
@@ -499,12 +499,21 @@
 								if (ret.Failed()) return ret;
 							}
 
-							CommandCost ret = EnsureNoVehicleOnGround(tile);
-							if (ret.Failed()) return ret;
+							DisallowedRoadDirections dis_existing = GetDisallowedRoadDirections(tile);
+							DisallowedRoadDirections dis_new      = dis_existing ^ toggle_drd;
+
+							/* We allow removing disallowed directions to break up
+							 * deadlocks, but adding them can break articulated
+							 * vehicles. As such, only when less is disallowed,
+							 * i.e. bits are removed, we skip the vehicle check. */
+							if (CountBits(dis_existing) <= CountBits(dis_new)) {
+								CommandCost ret = EnsureNoVehicleOnGround(tile);
+								if (ret.Failed()) return ret;
+							}
 
 							/* Ignore half built tiles */
 							if ((flags & DC_EXEC) && rt != ROADTYPE_TRAM && IsStraightRoad(existing)) {
-								SetDisallowedRoadDirections(tile, GetDisallowedRoadDirections(tile) ^ toggle_drd);
+								SetDisallowedRoadDirections(tile, dis_new);
 								MarkTileDirtyByTile(tile);
 							}
 							return CommandCost();