summaryrefslogtreecommitdiff
path: root/src/pathfinder
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2017-04-03 22:02:28 +0000
committerpeter1138 <peter1138@openttd.org>2017-04-03 22:02:28 +0000
commit1eef97674cfa4d9e55bacee5241e804a1827dfe9 (patch)
tree8957f1504d27286da8e9355637d003f0a3b0a51a /src/pathfinder
parent9bc27c9a72f2af5c9526f086884526e8ae8e8f79 (diff)
downloadopenttd-1eef97674cfa4d9e55bacee5241e804a1827dfe9.tar.xz
(svn r27845) -Change: (Yapf) Use FindDepotData struct to simplify depot finding code and remove need to return fake path distance. (juanjo)
Diffstat (limited to 'src/pathfinder')
-rw-r--r--src/pathfinder/yapf/yapf_rail.cpp35
1 files changed, 13 insertions, 22 deletions
diff --git a/src/pathfinder/yapf/yapf_rail.cpp b/src/pathfinder/yapf/yapf_rail.cpp
index 5324e4fc8..dccee3686 100644
--- a/src/pathfinder/yapf/yapf_rail.cpp
+++ b/src/pathfinder/yapf/yapf_rail.cpp
@@ -223,7 +223,7 @@ public:
return 't';
}
- static bool stFindNearestDepotTwoWay(const Train *v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int max_penalty, int reverse_penalty, TileIndex *depot_tile, bool *reversed)
+ static FindDepotData stFindNearestDepotTwoWay(const Train *v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int max_penalty, int reverse_penalty)
{
Tpf pf1;
/*
@@ -236,16 +236,16 @@ public:
* depot orders and you do not disable automatic servicing.
*/
if (max_penalty != 0) pf1.DisableCache(true);
- bool result1 = pf1.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_penalty, reverse_penalty, depot_tile, reversed);
+ FindDepotData result1 = pf1.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_penalty, reverse_penalty);
if (_debug_desync_level >= 2) {
Tpf pf2;
- TileIndex depot_tile2 = INVALID_TILE;
- bool reversed2 = false;
pf2.DisableCache(true);
- bool result2 = pf2.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_penalty, reverse_penalty, &depot_tile2, &reversed2);
- if (result1 != result2 || (result1 && (*depot_tile != depot_tile2 || *reversed != reversed2))) {
- DEBUG(desync, 2, "CACHE ERROR: FindNearestDepotTwoWay() = [%s, %s]", result1 ? "T" : "F", result2 ? "T" : "F");
+ FindDepotData result2 = pf2.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_penalty, reverse_penalty);
+ if (result1.tile != result2.tile || (result1.reverse != result2.reverse)) {
+ DEBUG(desync, 2, "CACHE ERROR: FindNearestDepotTwoWay() = [%s, %s]",
+ result1.tile != INVALID_TILE ? "T" : "F",
+ result2.tile != INVALID_TILE ? "T" : "F");
DumpState(pf1, pf2);
}
}
@@ -253,7 +253,7 @@ public:
return result1;
}
- inline bool FindNearestDepotTwoWay(const Train *v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int max_penalty, int reverse_penalty, TileIndex *depot_tile, bool *reversed)
+ inline FindDepotData FindNearestDepotTwoWay(const Train *v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int max_penalty, int reverse_penalty)
{
/* set origin and destination nodes */
Yapf().SetOrigin(t1, td1, t2, td2, reverse_penalty, true);
@@ -261,13 +261,10 @@ public:
Yapf().SetMaxCost(max_penalty);
/* find the best path */
- bool bFound = Yapf().FindPath(v);
- if (!bFound) return false;
+ if (!Yapf().FindPath(v)) return FindDepotData();
- /* some path found
- * get found depot tile */
+ /* Some path found. */
Node *n = Yapf().GetBestNode();
- *depot_tile = n->GetLastTile();
/* walk through the path back to the origin */
Node *pNode = n;
@@ -277,9 +274,7 @@ public:
/* if the origin node is our front vehicle tile/Trackdir then we didn't reverse
* but we can also look at the cost (== 0 -> not reversed, == reverse_penalty -> reversed) */
- *reversed = (pNode->m_cost != 0);
-
- return true;
+ return FindDepotData(n->GetLastTile(), n->m_cost, pNode->m_cost != 0);
}
};
@@ -611,15 +606,13 @@ bool YapfTrainCheckReverse(const Train *v)
FindDepotData YapfTrainFindNearestDepot(const Train *v, int max_penalty)
{
- FindDepotData fdd;
-
const Train *last_veh = v->Last();
PBSTileInfo origin = FollowTrainReservation(v);
TileIndex last_tile = last_veh->tile;
Trackdir td_rev = ReverseTrackdir(last_veh->GetVehicleTrackdir());
- typedef bool (*PfnFindNearestDepotTwoWay)(const Train*, TileIndex, Trackdir, TileIndex, Trackdir, int, int, TileIndex*, bool*);
+ typedef FindDepotData (*PfnFindNearestDepotTwoWay)(const Train*, TileIndex, Trackdir, TileIndex, Trackdir, int, int);
PfnFindNearestDepotTwoWay pfnFindNearestDepotTwoWay = &CYapfAnyDepotRail1::stFindNearestDepotTwoWay;
/* check if non-default YAPF type needed */
@@ -627,9 +620,7 @@ FindDepotData YapfTrainFindNearestDepot(const Train *v, int max_penalty)
pfnFindNearestDepotTwoWay = &CYapfAnyDepotRail2::stFindNearestDepotTwoWay; // Trackdir, forbid 90-deg
}
- bool ret = pfnFindNearestDepotTwoWay(v, origin.tile, origin.trackdir, last_tile, td_rev, max_penalty, YAPF_INFINITE_PENALTY, &fdd.tile, &fdd.reverse);
- fdd.best_length = ret ? max_penalty / 2 : UINT_MAX; // some fake distance or NOT_FOUND
- return fdd;
+ return pfnFindNearestDepotTwoWay(v, origin.tile, origin.trackdir, last_tile, td_rev, max_penalty, YAPF_INFINITE_PENALTY);
}
bool YapfTrainFindNearestSafeTile(const Train *v, TileIndex tile, Trackdir td, bool override_railtype)