(svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
--- 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;