File diff r26014:71f8ae89abb6 → r26015:62da647d3454
src/pathfinder/npf/npf.cpp
Show inline comments
 
@@ -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 ***/