Changeset - r26051:22a30523f651
[Not reviewed]
master
0 2 0
Loïc Guilloux - 3 years ago 2021-11-06 16:32:37
glx22@users.noreply.github.com
Fix #9669, cbe00ec: Only try valid reverse directions (#9672)
2 files changed with 12 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/pathfinder/npf/npf.cpp
Show inline comments
 
@@ -1216,27 +1216,30 @@ bool NPFShipCheckReverse(const Ship *v, 
 
	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 };
 
	if (best_td != nullptr) {
 
		TrackdirBits rtds = DiagdirReachesTrackdirs(ReverseDiagDir(VehicleExitDir(v->direction, v->state)));
 
		DiagDirection entry = ReverseDiagDir(VehicleExitDir(v->direction, v->state));
 
		TrackdirBits rtds = DiagdirReachesTrackdirs(entry) & TrackStatusToTrackdirBits(GetTileTrackStatus(v->tile, TRANSPORT_WATER, 0, entry));
 
		Trackdir best = (Trackdir)FindFirstBit2x64(rtds);
 
		for (rtds = KillFirstBit(rtds); rtds != TRACKDIR_BIT_NONE; rtds = KillFirstBit(rtds)) {
 
		rtds = KillFirstBit(rtds);
 
		if (rtds == TRACKDIR_BIT_NONE) return false; /* At most one choice. */
 
		for (; 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 */
src/pathfinder/yapf/yapf_ship.cpp
Show inline comments
 
@@ -203,25 +203,31 @@ public:
 
	 * @param v Ship
 
	 * @param tile Current position
 
	 * @param td1 Forward direction
 
	 * @param td2 Reverse direction
 
	 * @param trackdir [out] the best of all possible reversed trackdirs
 
	 * @return true if the reverse direction is better
 
	 */
 
	static bool CheckShipReverse(const Ship *v, TileIndex tile, Trackdir td1, Trackdir td2, Trackdir *trackdir)
 
	{
 
		/* create pathfinder instance */
 
		Tpf pf;
 
		/* set origin and destination nodes */
 
		pf.SetOrigin(tile, trackdir == nullptr ? TrackdirToTrackdirBits(td1) | TrackdirToTrackdirBits(td2) : DiagdirReachesTrackdirs(ReverseDiagDir(VehicleExitDir(v->direction, v->state))));
 
		if (trackdir == nullptr) {
 
			pf.SetOrigin(tile, TrackdirToTrackdirBits(td1) | TrackdirToTrackdirBits(td2));
 
		} else {
 
			DiagDirection entry = ReverseDiagDir(VehicleExitDir(v->direction, v->state));
 
			TrackdirBits rtds = DiagdirReachesTrackdirs(entry) & TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0, entry));
 
			pf.SetOrigin(tile, rtds);
 
		}
 
		pf.SetDestination(v);
 
		/* find best path */
 
		if (!pf.FindPath(v)) return false;
 

	
 
		Node *pNode = pf.GetBestNode();
 
		if (pNode == nullptr) return false;
 

	
 
		/* path was found
 
		 * walk through the path back to the origin */
 
		while (pNode->m_parent != nullptr) {
 
			pNode = pNode->m_parent;
 
		}
0 comments (0 inline, 0 general)