|
@@ -1208,26 +1208,40 @@ Track NPFShipChooseTrack(const Ship *v,
|
|
|
* we did not find our target, but ftd.best_trackdir contains the direction leading
|
|
|
* to the tile closest to our target. */
|
|
|
path_found = (ftd.best_bird_dist == 0);
|
|
|
return TrackdirToTrack(ftd.best_trackdir);
|
|
|
}
|
|
|
|
|
|
bool NPFShipCheckReverse(const Ship *v)
|
|
|
bool NPFShipCheckReverse(const Ship *v, Trackdir *best_td)
|
|
|
{
|
|
|
NPFFindStationOrTileData fstd;
|
|
|
NPFFoundTargetData ftd;
|
|
|
|
|
|
NPFFillWithOrderData(&fstd, v);
|
|
|
|
|
|
Trackdir trackdir = v->GetVehicleTrackdir();
|
|
|
Trackdir trackdir_rev = ReverseTrackdir(trackdir);
|
|
|
assert(trackdir != INVALID_TRACKDIR);
|
|
|
assert(trackdir_rev != INVALID_TRACKDIR);
|
|
|
|
|
|
AyStarUserData user = { v->owner, TRANSPORT_WATER, RAILTYPES_NONE, ROADTYPES_NONE, 0 };
|
|
|
ftd = NPFRouteToStationOrTileTwoWay(v->tile, trackdir, false, v->tile, trackdir_rev, false, &fstd, &user);
|
|
|
if (best_td != nullptr) {
|
|
|
TrackdirBits rtds = DiagdirReachesTrackdirs(ReverseDiagDir(VehicleExitDir(v->direction, v->state)));
|
|
|
Trackdir best = (Trackdir)FindFirstBit2x64(rtds);
|
|
|
for (rtds = KillFirstBit(rtds); rtds != TRACKDIR_BIT_NONE; rtds = KillFirstBit(rtds)) {
|
|
|
Trackdir td = (Trackdir)FindFirstBit2x64(rtds);
|
|
|
ftd = NPFRouteToStationOrTileTwoWay(v->tile, best, false, v->tile, td, false, &fstd, &user);
|
|
|
if (ftd.best_bird_dist == 0 && NPFGetFlag(&ftd.node, NPF_FLAG_REVERSE)) best = td;
|
|
|
}
|
|
|
if (ftd.best_bird_dist == 0) {
|
|
|
*best_td = best;
|
|
|
return true;
|
|
|
}
|
|
|
} else {
|
|
|
ftd = NPFRouteToStationOrTileTwoWay(v->tile, trackdir, false, v->tile, trackdir_rev, false, &fstd, &user);
|
|
|
}
|
|
|
/* If we didn't find anything, just keep on going straight ahead, otherwise take the reverse flag */
|
|
|
return ftd.best_bird_dist == 0 && NPFGetFlag(&ftd.node, NPF_FLAG_REVERSE);
|
|
|
}
|
|
|
|
|
|
/*** Trains ***/
|
|
|
|