changeset 14031:c603550031d4 draft

(svn r18574) -Fix [FS#3392] (r18481): manually sending trains and RVs to depots didn't quite work
author rubidium <rubidium@openttd.org>
date Sun, 20 Dec 2009 16:19:47 +0000
parents 827c5497bff0
children 0a874c3b0514
files src/roadveh_cmd.cpp src/ship_cmd.cpp src/train_cmd.cpp
diffstat 3 files changed, 14 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -361,8 +361,8 @@
 	if (IsRoadDepotTile(v->tile)) return FindDepotData(v->tile, 0);
 
 	switch (_settings_game.pf.pathfinder_for_roadvehs) {
-		case VPF_NPF: return NPFRoadVehicleFindNearestDepot(v, _settings_game.pf.npf.maximum_go_to_depot_penalty);
-		case VPF_YAPF: return YapfRoadVehicleFindNearestDepot(v, _settings_game.pf.yapf.maximum_go_to_depot_penalty);
+		case VPF_NPF: return NPFRoadVehicleFindNearestDepot(v, max_distance);
+		case VPF_YAPF: return YapfRoadVehicleFindNearestDepot(v, max_distance);
 
 		default: NOT_REACHED();
 	}
--- a/src/ship_cmd.cpp
+++ b/src/ship_cmd.cpp
@@ -97,12 +97,17 @@
 	return _ship_sprites[spritenum] + direction;
 }
 
-static const Depot *FindClosestShipDepot(const Vehicle *v)
+static const Depot *FindClosestShipDepot(const Vehicle *v, uint max_distance)
 {
 	/* Find the closest depot */
 	const Depot *depot;
 	const Depot *best_depot = NULL;
-	uint best_dist = UINT_MAX;
+	/* If we don't have a maximum distance, i.e. distance = 0,
+	 * we want to find any depot so the best distance of no
+	 * depot must be more than any correct distance. On the
+	 * other hand if we have set a maximum distance, any depot
+	 * further away than max_distance can safely be ignored. */
+	uint best_dist = max_distance == 0 ? UINT_MAX : max_distance + 1;
 
 	FOR_ALL_DEPOTS(depot) {
 		TileIndex tile = depot->xy;
@@ -134,9 +139,9 @@
 		default: NOT_REACHED();
 	}
 
-	const Depot *depot = FindClosestShipDepot(v);
+	const Depot *depot = FindClosestShipDepot(v, max_distance);
 
-	if (depot == NULL || DistanceManhattan(v->tile, depot->xy) > max_distance) {
+	if (depot == NULL) {
 		if (v->current_order.IsType(OT_GOTO_DEPOT)) {
 			v->current_order.MakeDummy();
 			SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
@@ -724,7 +729,7 @@
 
 bool Ship::FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse)
 {
-	const Depot *depot = FindClosestShipDepot(this);
+	const Depot *depot = FindClosestShipDepot(this, 0);
 
 	if (depot == NULL) return false;
 
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -2107,8 +2107,8 @@
 	if (IsRailDepotTile(origin.tile)) return FindDepotData(origin.tile, 0);
 
 	switch (_settings_game.pf.pathfinder_for_trains) {
-		case VPF_NPF: return NPFTrainFindNearestDepot(v, _settings_game.pf.npf.maximum_go_to_depot_penalty);
-		case VPF_YAPF: return YapfTrainFindNearestDepot(v, _settings_game.pf.yapf.maximum_go_to_depot_penalty);
+		case VPF_NPF: return NPFTrainFindNearestDepot(v, max_distance);
+		case VPF_YAPF: return YapfTrainFindNearestDepot(v, max_distance);
 
 		default: NOT_REACHED();
 	}