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 * |