From 10e81af663dcffd38090e0ddddf2c69faca6829b Mon Sep 17 00:00:00 2001 From: Kuhnovic <68320206+Kuhnovic@users.noreply.github.com> Date: Thu, 28 Aug 2025 21:09:00 +0200 Subject: [PATCH] Codechange: Deduplicate YAPF estimate calculation. (#14527) --- src/pathfinder/yapf/yapf_common.hpp | 26 +++++++++++++++++++++++++- src/pathfinder/yapf/yapf_destrail.hpp | 15 +-------------- src/pathfinder/yapf/yapf_road.cpp | 15 +-------------- src/pathfinder/yapf/yapf_ship.cpp | 15 +-------------- 4 files changed, 28 insertions(+), 43 deletions(-) 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; }