From d71d48434dee0c4f9435a25d15aefe4ee1e41b91 Mon Sep 17 00:00:00 2001 From: KUDr Date: Sun, 15 Jul 2007 11:45:38 +0000 Subject: [PATCH] (svn r10578) -Fix [YAPF, ships]: Ships received curve penalty for non-diagonal straight move. (JazzyJaffa) -The fix in cost calculation uncovered bug in estimate calculation. Ships now use the same estimate algorithm as trains. --- src/yapf/yapf_common.hpp | 25 +++++++++++++++++++------ src/yapf/yapf_ship.cpp | 5 ++++- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/yapf/yapf_common.hpp b/src/yapf/yapf_common.hpp index ed6b8782ad..8c5257e943 100644 --- a/src/yapf/yapf_common.hpp +++ b/src/yapf/yapf_common.hpp @@ -134,13 +134,26 @@ public: * adds it to the actual cost from origin and stores the sum to the Node::m_estimate */ inline bool PfCalcEstimate(Node& n) { - int dx = delta(TileX(n.GetTile()), TileX(m_destTile)); - int dy = delta(TileY(n.GetTile()), TileY(m_destTile)); - assert(dx >= 0 && dy >= 0); - int dd = min(dx, dy); + static int dg_dir_to_x_offs[] = {-1, 0, 1, 0}; + static int dg_dir_to_y_offs[] = {0, 1, 0, -1}; + if (PfDetectDestination(n)) { + n.m_estimate = n.m_cost; + return true; + } + + TileIndex tile = n.GetTile(); + DiagDirection exitdir = TrackdirToExitdir(n.GetTrackdir()); + 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(m_destTile); + int y2 = 2 * TileY(m_destTile); + int dx = abs(x1 - x2); + int dy = abs(y1 - y2); + int dmin = min(dx, dy); int dxy = abs(dx - dy); - int d = 14 * dd + 10 * dxy; - n.m_estimate = n.m_cost + d /*+ d / 8*/; + int d = dmin * 7 + (dxy - 1) * (10 / 2); + n.m_estimate = n.m_cost + d; + assert(n.m_estimate >= n.m_parent->m_estimate); return true; } }; diff --git a/src/yapf/yapf_ship.cpp b/src/yapf/yapf_ship.cpp index b3cee7aa66..f1c456dcd5 100644 --- a/src/yapf/yapf_ship.cpp +++ b/src/yapf/yapf_ship.cpp @@ -105,7 +105,10 @@ public: // base tile cost depending on distance int c = IsDiagonalTrackdir(n.GetTrackdir()) ? 10 : 7; // additional penalty for curves - if (n.m_parent != NULL && n.GetTrackdir() != n.m_parent->GetTrackdir()) c += 3; + if (n.m_parent != NULL && n.GetTrackdir() != NextTrackdir(n.m_parent->GetTrackdir())) { + /* new trackdir does not match the next one when going straight */ + c += 10; + } // apply it n.m_cost = n.m_parent->m_cost + c; return true;