Changeset - r1103:42851444e1e3
[Not reviewed]
master
0 1 0
dominik - 20 years ago 2005-01-23 10:40:54
dominik@openttd.org
(svn r1604) Fix: [ 1105112 ] Destroyed train locks crossings
1 file changed with 22 insertions and 12 deletions:
0 comments (0 inline, 0 general)
train_cmd.c
Show inline comments
 
@@ -968,6 +968,21 @@ static void *TestTrainOnCrossing(Vehicle
 
	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 @@ static void ReverseTrainDirection(Vehicl
 
		}
 
		/* 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 @@ static void DeleteLastWagon(Vehicle *v)
 
		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 @@ static void HandleCrashedTrain(Vehicle *
 
		ChangeTrainDirRandomly(v);
 
	}
 

	
 
	if (state >= 4440 && !(v->tick_counter&0x1F))
 
	if (state >= 4440 && !(v->tick_counter&0x1F))		
 
		DeleteLastWagon(v);
 
}
 

	
0 comments (0 inline, 0 general)