src/pbs.cpp
changeset 9831 b233da1b1723
parent 9824 4db1a1b0ab09
child 9952 e003ab3361ad
equal deleted inserted replaced
9830:566cbd04836f 9831:b233da1b1723
   202 	}
   202 	}
   203 
   203 
   204 	return PBSTileInfo(tile, trackdir, false);
   204 	return PBSTileInfo(tile, trackdir, false);
   205 }
   205 }
   206 
   206 
       
   207 /** Callback for VehicleFromPos to find a train on a specific track. */
       
   208 static Vehicle *FindTrainOnTrackEnum(Vehicle *v, void *data)
       
   209 {
       
   210 	PBSTileInfo info = *(PBSTileInfo *)data;
       
   211 
       
   212 	if (v->type == VEH_TRAIN && !(v->vehstatus & VS_CRASHED) && HasBit((TrackBits)v->u.rail.track, TrackdirToTrack(info.trackdir))) return v;
       
   213 
       
   214 	return NULL;
       
   215 }
       
   216 
   207 /**
   217 /**
   208  * Follow a train reservation to the last tile.
   218  * Follow a train reservation to the last tile.
   209  *
   219  *
   210  * @param v the vehicle
   220  * @param v the vehicle
       
   221  * @param train_on_res Is set to a train we might encounter
   211  * @returns The last tile of the reservation or the current train tile if no reservation present.
   222  * @returns The last tile of the reservation or the current train tile if no reservation present.
   212  */
   223  */
   213 PBSTileInfo FollowTrainReservation(const Vehicle *v)
   224 PBSTileInfo FollowTrainReservation(const Vehicle *v, Vehicle **train_on_res)
   214 {
   225 {
   215 	assert(v->type == VEH_TRAIN);
   226 	assert(v->type == VEH_TRAIN);
   216 
   227 
   217 	TileIndex tile = v->tile;
   228 	TileIndex tile = v->tile;
   218 	Trackdir  trackdir = GetVehicleTrackdir(v);
   229 	Trackdir  trackdir = GetVehicleTrackdir(v);
   219 
   230 
   220 	if (IsRailDepotTile(tile) && !GetRailDepotReservation(tile)) return PBSTileInfo(tile, trackdir, false);
   231 	if (IsRailDepotTile(tile) && !GetRailDepotReservation(tile)) return PBSTileInfo(tile, trackdir, false);
   221 
   232 
   222 	PBSTileInfo res = FollowReservation(v->owner, GetRailTypeInfo(v->u.rail.railtype)->compatible_railtypes, tile, trackdir);
   233 	PBSTileInfo res = FollowReservation(v->owner, GetRailTypeInfo(v->u.rail.railtype)->compatible_railtypes, tile, trackdir);
   223 	res.okay = IsSafeWaitingPosition(v, res.tile, res.trackdir, true, _settings_game.pf.forbid_90_deg);
   234 	res.okay = IsSafeWaitingPosition(v, res.tile, res.trackdir, true, _settings_game.pf.forbid_90_deg);
       
   235 	if (train_on_res != NULL) *train_on_res = VehicleFromPos(res.tile, &res, FindTrainOnTrackEnum);
   224 	return res;
   236 	return res;
   225 }
       
   226 
       
   227 /** Callback for VehicleFromPos to find a train on a specific track. */
       
   228 static Vehicle *FindTrainOnTrackEnum(Vehicle *v, void *data)
       
   229 {
       
   230 	PBSTileInfo info = *(PBSTileInfo *)data;
       
   231 
       
   232 	if (v->type == VEH_TRAIN && !(v->vehstatus & VS_CRASHED) && HasBit((TrackBits)v->u.rail.track, TrackdirToTrack(info.trackdir))) return v;
       
   233 
       
   234 	return NULL;
       
   235 }
   237 }
   236 
   238 
   237 /**
   239 /**
   238  * Find the train which has reserved a specific path.
   240  * Find the train which has reserved a specific path.
   239  *
   241  *