tunnelbridge_cmd.c
changeset 3900 4984308f9125
parent 3881 b2a66893f250
child 3933 a5f08e17f4a0
--- a/tunnelbridge_cmd.c	Thu May 25 20:58:23 2006 +0000
+++ b/tunnelbridge_cmd.c	Sat May 27 16:12:16 2006 +0000
@@ -26,6 +26,7 @@
 #include "bridge.h"
 #include "train.h"
 #include "water_map.h"
+#include "yapf/yapf.h"
 
 #include "table/bridge_land.h"
 
@@ -402,6 +403,7 @@
 	}
 
 	SetSignalsOnBothDir(tile_start, direction == AXIS_X ? TRACK_X : TRACK_Y);
+	YapfNotifyTrackLayoutChange(tile_start, direction == AXIS_X ? TRACK_X : TRACK_Y);
 
 	/*	for human player that builds the bridge he gets a selection to choose from bridges (DC_QUERY_COST)
 			It's unnecessary to execute this command every time for every bridge. So it is done only
@@ -491,12 +493,13 @@
 		if (GB(p1, 9, 1) == TRANSPORT_RAIL) {
 			MakeRailTunnel(start_tile, _current_player, direction,                 GB(p1, 0, 4));
 			MakeRailTunnel(end_tile,   _current_player, ReverseDiagDir(direction), GB(p1, 0, 4));
+			UpdateSignalsOnSegment(start_tile, direction);
+			YapfNotifyTrackLayoutChange(start_tile, DiagDirToAxis(direction) == AXIS_X ? TRACK_X : TRACK_Y);
 		} else {
 			MakeRoadTunnel(start_tile, _current_player, direction);
 			MakeRoadTunnel(end_tile,   _current_player, ReverseDiagDir(direction));
 		}
 
-		if (GB(p1, 9, 1) == 0) UpdateSignalsOnSegment(start_tile, direction);
 	}
 
 	return cost;
@@ -573,6 +576,8 @@
 		DoClearSquare(endtile);
 		UpdateSignalsOnSegment(tile, ReverseDiagDir(dir));
 		UpdateSignalsOnSegment(endtile, dir);
+		YapfNotifyTrackLayoutChange(tile, DiagDirToAxis(dir) == AXIS_X ? TRACK_X : TRACK_Y);
+		YapfNotifyTrackLayoutChange(endtile, DiagDirToAxis(dir) == AXIS_X ? TRACK_X : TRACK_Y);
 	}
 	return _price.clear_tunnel * (length + 1);
 }
@@ -700,6 +705,8 @@
 
 		UpdateSignalsOnSegment(tile, ReverseDiagDir(direction));
 		UpdateSignalsOnSegment(endtile, direction);
+		YapfNotifyTrackLayoutChange(tile, DiagDirToAxis(direction) == AXIS_X ? TRACK_X : TRACK_Y);
+		YapfNotifyTrackLayoutChange(endtile, DiagDirToAxis(direction) == AXIS_X ? TRACK_X : TRACK_Y);
 	}
 
 	return (DistanceManhattan(tile, endtile) + 1) * _price.clear_bridge;
@@ -733,10 +740,17 @@
 		if (endtile == INVALID_TILE) return CMD_ERROR;
 
 		if (exec) {
+			Track track, endtrack;
 			SetRailType(tile, totype);
 			SetRailType(endtile, totype);
 			MarkTileDirtyByTile(tile);
 			MarkTileDirtyByTile(endtile);
+
+			// notify YAPF about the track layout change
+			track = TrackdirToTrack(DiagdirToDiagTrackdir(GetTunnelDirection(tile)));
+			endtrack = TrackdirToTrack(DiagdirToDiagTrackdir(GetTunnelDirection(endtile)));
+			YapfNotifyTrackLayoutChange(tile, track);
+			YapfNotifyTrackLayoutChange(endtile, endtrack);
 		}
 		return (length + 1) * (_price.build_rail >> 1);
 	} else if (IsBridge(tile) &&
@@ -750,8 +764,13 @@
 		if (GetRailType(tile) == totype) return CMD_ERROR;
 
 		if (exec) {
+			TrackBits tracks;
 			SetRailType(tile, totype);
 			MarkTileDirtyByTile(tile);
+
+			// notify YAPF about the track layout change
+			for (tracks = GetRailBitsUnderBridge(tile); tracks != TRACK_BIT_NONE; tracks = KILL_FIRST_BIT(tracks))
+				YapfNotifyTrackLayoutChange(tile, FIND_FIRST_BIT(tracks));
 		}
 		return _price.build_rail >> 1;
 	} else if (IsBridge(tile) && IsBridgeRamp(tile) && GetBridgeTransportType(tile) == TRANSPORT_RAIL) {
@@ -777,10 +796,17 @@
 		if (GetRailType(tile) == totype) return CMD_ERROR;
 
 		if (exec) {
+			Track track, endtrack;
 			SetRailType(tile, totype);
 			SetRailType(endtile, totype);
 			MarkTileDirtyByTile(tile);
 			MarkTileDirtyByTile(endtile);
+
+			// notify YAPF about the track layout change
+			track = TrackdirToTrack(DiagdirToDiagTrackdir(GetBridgeRampDirection(tile)));
+			endtrack = TrackdirToTrack(DiagdirToDiagTrackdir(GetBridgeRampDirection(endtile)));
+			YapfNotifyTrackLayoutChange(tile, track);
+			YapfNotifyTrackLayoutChange(endtile, endtrack);
 		}
 		cost = 2 * (_price.build_rail >> 1);
 		delta = TileOffsByDir(GetBridgeRampDirection(tile));