diff --git a/src/pathfinder/yapf/yapf_common.hpp b/src/pathfinder/yapf/yapf_common.hpp
index 5e0765c5c0..7f358dcd33 100644
--- a/src/pathfinder/yapf/yapf_common.hpp
+++ b/src/pathfinder/yapf/yapf_common.hpp
@@ -5,7 +5,7 @@
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see .
*/
-/** @file yapf_common.hpp Commonly used classes for YAPF. */
+/** @file yapf_common.hpp Commonly used classes and utilities for YAPF. */
#ifndef YAPF_COMMON_HPP
#define YAPF_COMMON_HPP
@@ -119,6 +119,30 @@ class CYapfT
{
};
+/**
+ * Calculates the octile distance cost between a starting tile / trackdir and a destination tile.
+ * @param start_tile Starting tile.
+ * @param start_td Starting trackdir.
+ * @param destination_tile Destination tile.
+ * @return Octile distance cost between starting tile / trackdir and destination tile.
+ */
+inline int OctileDistanceCost(TileIndex start_tile, Trackdir start_td, TileIndex destination_tile)
+{
+ static constexpr int dg_dir_to_x_offs[] = {-1, 0, 1, 0};
+ static constexpr int dg_dir_to_y_offs[] = {0, 1, 0, -1};
+ const DiagDirection exitdir = TrackdirToExitdir(start_td);
+
+ const int x1 = 2 * TileX(start_tile) + dg_dir_to_x_offs[static_cast(exitdir)];
+ const int y1 = 2 * TileY(start_tile) + dg_dir_to_y_offs[static_cast(exitdir)];
+ const int x2 = 2 * TileX(destination_tile);
+ const int y2 = 2 * TileY(destination_tile);
+ const int dx = abs(x1 - x2);
+ const int dy = abs(y1 - y2);
+ const int dmin = std::min(dx, dy);
+ const int dxy = abs(dx - dy);
+
+ return dmin * YAPF_TILE_CORNER_LENGTH + (dxy - 1) * (YAPF_TILE_LENGTH / 2);
+}
#endif /* YAPF_COMMON_HPP */
diff --git a/src/pathfinder/yapf/yapf_destrail.hpp b/src/pathfinder/yapf/yapf_destrail.hpp
index 1133a66eec..1c312c11e2 100644
--- a/src/pathfinder/yapf/yapf_destrail.hpp
+++ b/src/pathfinder/yapf/yapf_destrail.hpp
@@ -194,25 +194,12 @@ public:
*/
inline bool PfCalcEstimate(Node &n)
{
- static const int dg_dir_to_x_offs[] = {-1, 0, 1, 0};
- static const int dg_dir_to_y_offs[] = {0, 1, 0, -1};
if (this->PfDetectDestination(n)) {
n.estimate = n.cost;
return true;
}
- TileIndex tile = n.GetLastTile();
- DiagDirection exitdir = TrackdirToExitdir(n.GetLastTrackdir());
- int x1 = 2 * TileX(tile) + dg_dir_to_x_offs[(int)exitdir];
- int y1 = 2 * TileY(tile) + dg_dir_to_y_offs[(int)exitdir];
- int x2 = 2 * TileX(this->dest_tile);
- int y2 = 2 * TileY(this->dest_tile);
- int dx = abs(x1 - x2);
- int dy = abs(y1 - y2);
- int dmin = std::min(dx, dy);
- int dxy = abs(dx - dy);
- int d = dmin * YAPF_TILE_CORNER_LENGTH + (dxy - 1) * (YAPF_TILE_LENGTH / 2);
- n.estimate = n.cost + d;
+ n.estimate = n.cost + OctileDistanceCost(n.GetLastTile(), n.GetLastTrackdir(), this->dest_tile);
assert(n.estimate >= n.parent->estimate);
return true;
}
diff --git a/src/pathfinder/yapf/yapf_road.cpp b/src/pathfinder/yapf/yapf_road.cpp
index 87506e8652..f43ec4204b 100644
--- a/src/pathfinder/yapf/yapf_road.cpp
+++ b/src/pathfinder/yapf/yapf_road.cpp
@@ -293,25 +293,12 @@ public:
*/
inline bool PfCalcEstimate(Node &n)
{
- static const int dg_dir_to_x_offs[] = {-1, 0, 1, 0};
- static const int dg_dir_to_y_offs[] = {0, 1, 0, -1};
if (this->PfDetectDestination(n)) {
n.estimate = n.cost;
return true;
}
- TileIndex tile = n.segment_last_tile;
- DiagDirection exitdir = TrackdirToExitdir(n.segment_last_td);
- int x1 = 2 * TileX(tile) + dg_dir_to_x_offs[(int)exitdir];
- int y1 = 2 * TileY(tile) + dg_dir_to_y_offs[(int)exitdir];
- int x2 = 2 * TileX(this->dest_tile);
- int y2 = 2 * TileY(this->dest_tile);
- int dx = abs(x1 - x2);
- int dy = abs(y1 - y2);
- int dmin = std::min(dx, dy);
- int dxy = abs(dx - dy);
- int d = dmin * YAPF_TILE_CORNER_LENGTH + (dxy - 1) * (YAPF_TILE_LENGTH / 2);
- n.estimate = n.cost + d;
+ n.estimate = n.cost + OctileDistanceCost(n.segment_last_tile, n.segment_last_td, this->dest_tile);
assert(n.estimate >= n.parent->estimate);
return true;
}
diff --git a/src/pathfinder/yapf/yapf_ship.cpp b/src/pathfinder/yapf/yapf_ship.cpp
index 3596b2126f..2c3b26d39d 100644
--- a/src/pathfinder/yapf/yapf_ship.cpp
+++ b/src/pathfinder/yapf/yapf_ship.cpp
@@ -96,25 +96,12 @@ public:
{
const TileIndex destination_tile = this->has_intermediate_dest ? this->intermediate_dest_tile : this->dest_tile;
- static const int dg_dir_to_x_offs[] = { -1, 0, 1, 0 };
- static const int dg_dir_to_y_offs[] = { 0, 1, 0, -1 };
if (this->PfDetectDestination(n)) {
n.estimate = n.cost;
return true;
}
- TileIndex tile = n.segment_last_tile;
- DiagDirection exitdir = TrackdirToExitdir(n.segment_last_td);
- int x1 = 2 * TileX(tile) + dg_dir_to_x_offs[(int)exitdir];
- int y1 = 2 * TileY(tile) + dg_dir_to_y_offs[(int)exitdir];
- int x2 = 2 * TileX(destination_tile);
- int y2 = 2 * TileY(destination_tile);
- int dx = abs(x1 - x2);
- int dy = abs(y1 - y2);
- int dmin = std::min(dx, dy);
- int dxy = abs(dx - dy);
- int d = dmin * YAPF_TILE_CORNER_LENGTH + (dxy - 1) * (YAPF_TILE_LENGTH / 2);
- n.estimate = n.cost + d;
+ n.estimate = n.cost + OctileDistanceCost(n.segment_last_tile, n.segment_last_td, destination_tile);
assert(n.estimate >= n.parent->estimate);
return true;
}