(svn r13687) [0.6] -Backport from trunk: 0.6
authorrubidium
Wed, 09 Jul 2008 19:15:43 +0000
branch0.6
changeset 11129 72b8e47f86d8
parent 11128 b62a7b45babf
child 11130 488ecb9d3296
(svn r13687) [0.6] -Backport from trunk:
- Fix: Signals were not updated correctly when a player removed a non-existing track piece (r13626)
- Fix: Signal states could be propagated through waypoints built in orthogonal axis (r13589)
- Fix: Track was not removed on company bankrupcy when there was a ship on lower halftile (r13488)
- Fix: Let ships also navigate on half-tile sloped watery rail tiles (r13485)
src/rail_cmd.cpp
src/signal.cpp
--- a/src/rail_cmd.cpp	Wed Jul 09 19:13:21 2008 +0000
+++ b/src/rail_cmd.cpp	Wed Jul 09 19:15:43 2008 +0000
@@ -1107,6 +1107,7 @@
 
 	if (!ValParamTrackOrientation(track) ||
 			!IsTileType(tile, MP_RAILWAY) ||
+			!HasTrack(tile, track) ||
 			!EnsureNoTrainOnTrack(tile, track) ||
 			!HasSignalOnTrack(tile, track)) {
 		return CMD_ERROR;
@@ -1376,7 +1377,10 @@
 				cost.AddCost(ret);
 			}
 
-			if (water_ground) {
+			/* when bankrupting, don't make water dirty, there could be a ship on lower halftile */
+			if (water_ground && !(flags & DC_BANKRUPT)) {
+				if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
+
 				/* The track was removed, and left a coast tile. Now also clear the water. */
 				if (flags & DC_EXEC) DoClearSquare(tile);
 				cost.AddCost(_price.clear_water);
@@ -2098,6 +2102,19 @@
 
 static TrackStatus GetTileTrackStatus_Track(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
 {
+	/* Case of half tile slope with water. */
+	if (mode == TRANSPORT_WATER && IsPlainRailTile(tile) && GetRailGroundType(tile) == RAIL_GROUND_WATER) {
+		TrackBits tb = GetTrackBits(tile);
+		switch (tb) {
+			default: NOT_REACHED();
+			case TRACK_BIT_UPPER: tb = TRACK_BIT_LOWER; break;
+			case TRACK_BIT_LOWER: tb = TRACK_BIT_UPPER; break;
+			case TRACK_BIT_LEFT:  tb = TRACK_BIT_RIGHT; break;
+			case TRACK_BIT_RIGHT: tb = TRACK_BIT_LEFT;  break;
+		}
+		return CombineTrackStatus(TrackBitsToTrackdirBits(tb), TRACKDIR_BIT_NONE);
+	}
+
 	if (mode != TRANSPORT_RAIL) return 0;
 
 	TrackBits trackbits = TRACK_BIT_NONE;
--- a/src/signal.cpp	Wed Jul 09 19:13:21 2008 +0000
+++ b/src/signal.cpp	Wed Jul 09 19:15:43 2008 +0000
@@ -298,6 +298,7 @@
 				}
 
 				if (GetRailTileType(tile) == RAIL_TILE_WAYPOINT) {
+					if (GetWaypointAxis(tile) != DiagDirToAxis(enterdir)) continue;
 					if (!(flags & SF_TRAIN) && VehicleFromPos(tile, NULL, &TrainOnTileEnum)) flags |= SF_TRAIN;
 					tile += TileOffsByDiagDir(exitdir);
 					/* enterdir and exitdir stay the same */