(svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
authorpeter1138
Tue, 21 Mar 2006 21:11:41 +0000
changeset 3284 fafe2ef7b809
parent 3283 651846bbcc78
child 3285 c162cb0b57c1
(svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
rail_cmd.c
--- a/rail_cmd.c	Tue Mar 21 21:07:50 2006 +0000
+++ b/rail_cmd.c	Tue Mar 21 21:11:41 2006 +0000
@@ -363,6 +363,7 @@
 	TrackBits trackbit;
 	TileIndex tile;
 	int32 cost = _price.remove_rail;
+	bool crossing = false;
 
 	if (!ValParamTrackOrientation(p2)) return CMD_ERROR;
 	trackbit = TrackToTrackBits(track);
@@ -411,6 +412,7 @@
 
 			present = GetTrackBits(tile);
 			if ((present & trackbit) == 0) return CMD_ERROR;
+			if (present == (TRACK_BIT_X | TRACK_BIT_Y)) crossing = true;
 
 			/* Charge extra to remove signals on the track, if they are there */
 			if (HasSignalOnTrack(tile, track))
@@ -432,7 +434,16 @@
 
 	if (flags & DC_EXEC) {
 		MarkTileDirtyByTile(tile);
-		SetSignalsOnBothDir(tile, track);
+		if (crossing) {
+			/* crossing is set when only TRACK_BIT_X and TRACK_BIT_Y are set. As we
+			 * are removing one of these pieces, we'll need to update signals for
+			 * both directions explicitly, as after the track is removed it won't
+			 * 'connect' with the other piece. */
+			SetSignalsOnBothDir(tile, TRACK_X);
+			SetSignalsOnBothDir(tile, TRACK_Y);
+		} else {
+			SetSignalsOnBothDir(tile, track);
+		}
 	}
 
 	return cost;