Merge branch 'save_ext' into tracerestrict-sx
# Conflicts: # src/vehiclelist.cpp
This commit is contained in:
@@ -536,6 +536,8 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th
|
||||
/* Penalty for reversing in a depot. */
|
||||
assert(IsRailDepot(cur.tile));
|
||||
segment_cost += Yapf().PfGetSettings().rail_depot_reverse_penalty;
|
||||
|
||||
} else if (IsRailDepotTile(cur.tile)) {
|
||||
/* We will end in this pass (depot is possible target) */
|
||||
end_segment_reason |= ESRB_DEPOT;
|
||||
|
||||
@@ -549,9 +551,16 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th
|
||||
CFollowTrackRail ft(v);
|
||||
TileIndex t = cur.tile;
|
||||
Trackdir td = cur.td;
|
||||
/* Arbitrary maximum tiles to follow to avoid infinite loops. */
|
||||
uint max_tiles = 20;
|
||||
while (ft.Follow(t, td)) {
|
||||
assert(t != ft.m_new_tile);
|
||||
t = ft.m_new_tile;
|
||||
if (t == cur.tile || --max_tiles == 0) {
|
||||
/* We looped back on ourself or found another loop, bail out. */
|
||||
td = INVALID_TRACKDIR;
|
||||
break;
|
||||
}
|
||||
if (KillFirstBit(ft.m_new_td_bits) != TRACKDIR_BIT_NONE) {
|
||||
/* We encountered a junction; it's going to be too complex to
|
||||
* handle this perfectly, so just bail out. There is no simple
|
||||
@@ -686,6 +695,9 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th
|
||||
|
||||
} // for (;;)
|
||||
|
||||
/* Don't consider path any further it if exceeded max_cost. */
|
||||
if (end_segment_reason & ESRB_PATH_TOO_LONG) return false;
|
||||
|
||||
bool target_seen = false;
|
||||
if ((end_segment_reason & ESRB_POSSIBLE_TARGET) != ESRB_NONE) {
|
||||
/* Depot, station or waypoint. */
|
||||
|
@@ -140,7 +140,8 @@ public:
|
||||
* waypoint. */
|
||||
Yapf().DisableCache(true);
|
||||
}
|
||||
/* FALL THROUGH */
|
||||
FALLTHROUGH;
|
||||
|
||||
case OT_GOTO_STATION:
|
||||
m_destTile = CalcClosestStationTile(v->current_order.GetDestination(), v->tile, v->current_order.IsType(OT_GOTO_STATION) ? STATION_RAIL : STATION_WAYPOINT);
|
||||
m_dest_station_id = v->current_order.GetDestination();
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user