Changeset - r15560:1ce751e5c273
[Not reviewed]
master
0 1 0
rubidium - 14 years ago 2010-07-27 22:00:43
rubidium@openttd.org
(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
1 file changed with 12 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/road_cmd.cpp
Show inline comments
 
@@ -496,18 +496,27 @@ CommandCost CmdBuildRoad(TileIndex tile,
 
							Owner owner = GetRoadOwner(tile, ROADTYPE_ROAD);
 
							if (owner != OWNER_NONE) {
 
								CommandCost ret = CheckOwnership(owner, tile);
 
								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();
 
						}
 
						return_cmd_error(STR_ERROR_ALREADY_BUILT);
 
					}
0 comments (0 inline, 0 general)