Changeset - r19187:bb7bca831c30
[Not reviewed]
master
0 2 0
michi_cc - 12 years ago 2012-03-29 12:27:34
michi_cc@openttd.org
(svn r24078) -Fix [FS#5093,FS#5130] (r24071): A fix that breaks all other cases isn't really a fix. Redo it to make sure that reservations of trains entering or exiting depots are properly made and freed.
2 files changed with 12 insertions and 4 deletions:
0 comments (0 inline, 0 general)
src/pbs.cpp
Show inline comments
 
@@ -369,8 +369,7 @@ Train *GetTrainForReservation(TileIndex 
 
 */
 
bool IsSafeWaitingPosition(const Train *v, TileIndex tile, Trackdir trackdir, bool include_line_end, bool forbid_90deg)
 
{
 
	/* A depot is safe if we enter it, but not when we exit. */
 
	if (IsRailDepotTile(tile) && TrackdirToExitdir(trackdir) != GetRailDepotDirection(tile)) return true;
 
	if (IsRailDepotTile(tile)) return true;
 

	
 
	if (IsTileType(tile, MP_RAILWAY)) {
 
		/* For non-pbs signals, stop on the signal tile. */
src/train_cmd.cpp
Show inline comments
 
@@ -1827,6 +1827,9 @@ void ReverseTrainDirection(Train *v)
 
			HasSignalOnTrackdir(v->tile, v->GetVehicleTrackdir()) &&
 
			!IsPbsSignal(GetSignalType(v->tile, FindFirstTrack(v->track))));
 

	
 
		/* If we are on a depot tile facing outwards, do not treat the current tile as safe. */
 
		if (IsRailDepotTile(v->tile) && TrackdirToExitdir(v->GetVehicleTrackdir()) == GetRailDepotDirection(v->tile)) first_tile_okay = false;
 

	
 
		if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true);
 
		if (TryPathReserve(v, false, first_tile_okay)) {
 
			/* Do a look-ahead now in case our current tile was already a safe tile. */
 
@@ -2200,8 +2203,14 @@ void FreeTrainTrackReservation(const Tra
 
	bool      free_tile = tile != v->tile || !(IsRailStationTile(v->tile) || IsTileType(v->tile, MP_TUNNELBRIDGE));
 
	StationID station_id = IsRailStationTile(v->tile) ? GetStationIndex(v->tile) : INVALID_STATION;
 

	
 
	/* A train inside a depot can't have a reservation. */
 
	if (v->track == TRACK_BIT_DEPOT) return;
 
	/* Can't be holding a reservation if we enter a depot. */
 
	if (IsRailDepotTile(tile) && TrackdirToExitdir(td) != GetRailDepotDirection(tile)) return;
 
	if (v->track == TRACK_BIT_DEPOT) {
 
		/* Front engine is in a depot. We enter if some part is not in the depot. */
 
		for (const Train *u = v; u != NULL; u = u->Next()) {
 
			if (u->track != TRACK_BIT_DEPOT || u->tile != v->tile) return;
 
		}
 
	}
 
	/* Don't free reservation if it's not ours. */
 
	if (TracksOverlap(GetReservedTrackbits(tile) | TrackToTrackBits(TrackdirToTrack(td)))) return;
 

	
0 comments (0 inline, 0 general)