Fix: Try all possible reverse directions when a ship reaches a dead end

This commit is contained in:
glx22
2021-10-05 17:58:19 +02:00
committed by Loïc Guilloux
parent 207cf7bbdd
commit cbe00ec651
5 changed files with 49 additions and 15 deletions

View File

@@ -1211,7 +1211,7 @@ Track NPFShipChooseTrack(const Ship *v, bool &path_found)
return TrackdirToTrack(ftd.best_trackdir);
}
bool NPFShipCheckReverse(const Ship *v)
bool NPFShipCheckReverse(const Ship *v, Trackdir *best_td)
{
NPFFindStationOrTileData fstd;
NPFFoundTargetData ftd;
@@ -1224,7 +1224,21 @@ bool NPFShipCheckReverse(const Ship *v)
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);
}

View File

@@ -46,9 +46,10 @@ Track NPFShipChooseTrack(const Ship *v, bool &path_found);
/**
* Returns true if it is better to reverse the ship before leaving depot using NPF.
* @param v the ship leaving the depot
* @param trackdir [out] the best of all possible reversed trackdirs
* @return true if reversing is better
*/
bool NPFShipCheckReverse(const Ship *v);
bool NPFShipCheckReverse(const Ship *v, Trackdir *trackdir);
/**
* Used when user sends train to the nearest depot or if train needs servicing using NPF