Changeset - r22599:ccaa563db613
[Not reviewed]
master
0 1 0
peter1138 - 7 years ago 2017-03-20 17:44:37
peter1138@openttd.org
(svn r27810) -Change: Factor out reservation-handling code in station_cmd.cpp

Code dealing with freeing and restoring track reservations is
duplicated in CmdBuildRailStation and RemoveFromRailBaseStation;
make separate functions for it. (cirdan)
1 file changed with 28 insertions and 24 deletions:
0 comments (0 inline, 0 general)
src/station_cmd.cpp
Show inline comments
 
@@ -1140,12 +1140,36 @@ static CommandCost FindJoiningStation(St
 
CommandCost FindJoiningWaypoint(StationID existing_waypoint, StationID waypoint_to_join, bool adjacent, TileArea ta, Waypoint **wp)
 
{
 
	return FindJoiningBaseStation<Waypoint, STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST>(existing_waypoint, waypoint_to_join, adjacent, ta, wp);
 
}
 

	
 
/**
 
 * Clear platform reservation during station building/removing.
 
 * @param v vehicle which holds reservation
 
 */
 
static void FreeTrainReservation(Train *v)
 
{
 
	FreeTrainTrackReservation(v);
 
	if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), false);
 
	v = v->Last();
 
	if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), false);
 
}
 

	
 
/**
 
 * Restore platform reservation during station building/removing.
 
 * @param v vehicle which held reservation
 
 */
 
static void RestoreTrainReservation(Train *v)
 
{
 
	if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true);
 
	TryPathReserve(v, true, true);
 
	v = v->Last();
 
	if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), true);
 
}
 

	
 
/**
 
 * Build rail station
 
 * @param tile_org northern most position of station dragging/placement
 
 * @param flags operation to perform
 
 * @param p1 various bitstuffed elements
 
 * - p1 = (bit  0- 3) - railtype
 
 * - p1 = (bit  4)    - orientation (Axis)
 
@@ -1278,17 +1302,14 @@ CommandCost CmdBuildRailStation(TileInde
 
			do {
 
				byte layout = *layout_ptr++;
 
				if (IsRailStationTile(tile) && HasStationReservation(tile)) {
 
					/* Check for trains having a reservation for this tile. */
 
					Train *v = GetTrainForReservation(tile, AxisToTrack(GetRailStationAxis(tile)));
 
					if (v != NULL) {
 
						FreeTrainTrackReservation(v);
 
						*affected_vehicles.Append() = v;
 
						if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), false);
 
						for (; v->Next() != NULL; v = v->Next()) { }
 
						if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), false);
 
						FreeTrainReservation(v);
 
					}
 
				}
 

	
 
				/* Railtype can change when overbuilding. */
 
				if (IsRailStationTile(tile)) {
 
					if (!IsStationTileBlocked(tile)) c->infrastructure.rail[GetRailType(tile)]--;
 
@@ -1333,17 +1354,13 @@ CommandCost CmdBuildRailStation(TileInde
 
			YapfNotifyTrackLayoutChange(tile_track, track);
 
			tile_track += tile_delta ^ TileDiffXY(1, 1); // perpendicular to tile_delta
 
		} while (--numtracks);
 

	
 
		for (uint i = 0; i < affected_vehicles.Length(); ++i) {
 
			/* Restore reservations of trains. */
 
			Train *v = affected_vehicles[i];
 
			if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true);
 
			TryPathReserve(v, true, true);
 
			for (; v->Next() != NULL; v = v->Next()) { }
 
			if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), true);
 
			RestoreTrainReservation(affected_vehicles[i]);
 
		}
 

	
 
		/* Check whether we need to expand the reservation of trains already on the station. */
 
		TileArea update_reservation_area;
 
		if (axis == AXIS_X) {
 
			update_reservation_area = TileArea(tile_org, 1, numtracks_orig);
 
@@ -1501,20 +1518,13 @@ CommandCost RemoveFromRailBaseStation(Ti
 
			Owner owner = GetTileOwner(tile);
 
			RailType rt = GetRailType(tile);
 
			Train *v = NULL;
 

	
 
			if (HasStationReservation(tile)) {
 
				v = GetTrainForReservation(tile, track);
 
				if (v != NULL) {
 
					/* Free train reservation. */
 
					FreeTrainTrackReservation(v);
 
					if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), false);
 
					Vehicle *temp = v;
 
					for (; temp->Next() != NULL; temp = temp->Next()) { }
 
					if (IsRailStationTile(temp->tile)) SetRailStationPlatformReservation(temp->tile, TrackdirToExitdir(ReverseTrackdir(temp->GetVehicleTrackdir())), false);
 
				}
 
				if (v != NULL) FreeTrainReservation(v);
 
			}
 

	
 
			bool build_rail = keep_rail && !IsStationTileBlocked(tile);
 
			if (!build_rail && !IsStationTileBlocked(tile)) Company::Get(owner)->infrastructure.rail[rt]--;
 

	
 
			DoClearSquare(tile);
 
@@ -1528,19 +1538,13 @@ CommandCost RemoveFromRailBaseStation(Ti
 
			YapfNotifyTrackLayoutChange(tile, track);
 

	
 
			DeallocateSpecFromStation(st, specindex);
 

	
 
			affected_stations.Include(st);
 

	
 
			if (v != NULL) {
 
				/* Restore station reservation. */
 
				if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true);
 
				TryPathReserve(v, true, true);
 
				for (; v->Next() != NULL; v = v->Next()) { }
 
				if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), true);
 
			}
 
			if (v != NULL) RestoreTrainReservation(v);
 
		}
 
	}
 

	
 
	if (quantity == 0) return error.Failed() ? error : CommandCost(STR_ERROR_THERE_IS_NO_STATION);
 

	
 
	for (T **stp = affected_stations.Begin(); stp != affected_stations.End(); stp++) {
0 comments (0 inline, 0 general)