(svn r1604) Fix: [ 1105112 ] Destroyed train locks crossings
authordominik
Sun, 23 Jan 2005 10:40:54 +0000
changeset 1103 d3b5e10c6a7e
parent 1102 316643e34104
child 1104 33de58d78c02
(svn r1604) Fix: [ 1105112 ] Destroyed train locks crossings
train_cmd.c
--- a/train_cmd.c	Sun Jan 23 10:34:39 2005 +0000
+++ b/train_cmd.c	Sun Jan 23 10:40:54 2005 +0000
@@ -968,6 +968,21 @@
 	return v;
 }
 
+static void DisableTrainCrossing(TileIndex tile)
+{
+	/* Test if we have a rail/road-crossing */
+	if (IsTileType(tile, MP_STREET) && (_map5[tile] & 0xF0) == 0x10) {
+		/* Check if there is a train on the tile itself */
+		if (VehicleFromPos(tile, &tile, TestTrainOnCrossing) == NULL) {
+			/* If light is on, switch light off */
+			if (_map5[tile] & 4) {
+				_map5[tile] &= ~4;
+				MarkTileDirtyByTile(tile);
+			}
+		}
+	}
+}
+
 static void ReverseTrainDirection(Vehicle *v)
 {
 	int l = 0, r = -1;
@@ -987,17 +1002,9 @@
 		}
 		/* Calculate next tile */
 		tile += TileOffsByDir(t);
-		/* Test if we have a rail/road-crossing */
-		if (IsTileType(tile, MP_STREET) && (_map5[tile] & 0xF0) == 0x10) {
-			/* Check if there is a train on the tile itself */
-			if (VehicleFromPos(tile, &tile, TestTrainOnCrossing) == NULL) {
-				/* If light is on, switch light off */
-				if (_map5[tile] & 4) {
-					_map5[tile] &= ~4;
-					MarkTileDirtyByTile(tile);
-				}
-			}
-		}
+
+		/* Check if the train left a rail/road-crossing */
+		DisableTrainCrossing(tile);
 	}
 
 	// count number of vehicles
@@ -2328,6 +2335,9 @@
 		SetSignalsOnBothDir(v->tile, FIND_FIRST_BIT(t));
 	}
 
+	/* Check if the wagon was on a road/rail-crossing and disable it if no others are on it */
+	DisableTrainCrossing(v->tile);
+
 	if (v->u.rail.track == 0x40) {
 		int length;
 		TileIndex endtile = CheckTunnelBusy(v->tile, &length);
@@ -2389,7 +2399,7 @@
 		ChangeTrainDirRandomly(v);
 	}
 
-	if (state >= 4440 && !(v->tick_counter&0x1F))
+	if (state >= 4440 && !(v->tick_counter&0x1F))		
 		DeleteLastWagon(v);
 }