Fix #7592: Do not cache road vehicle path within 8 tiles of destination with multiple entrances

Ported from jgrpp commit 79d5be7e265df3be8b73d484f0c7261b3c23229d
This commit is contained in:
Jonathan G Rennison 2020-02-06 21:23:42 +01:00 committed by Niels Martin Hansen
parent 9e632355f1
commit 1a88fb5c91
2 changed files with 24 additions and 0 deletions

View File

@ -44,6 +44,9 @@ static const int YAPF_SHIP_PATH_CACHE_LENGTH = 32;
/** Maximum segments of road vehicle path cache */
static const int YAPF_ROADVEH_PATH_CACHE_SEGMENTS = 8;
/** Distance from destination road stops to not cache any further */
static const int YAPF_ROADVEH_PATH_CACHE_DESTINATION_LIMIT = 8;
/**
* Helper container to find a depot
*/

View File

@ -251,6 +251,11 @@ public:
}
}
const Station *GetDestinationStation() const
{
return m_dest_station != INVALID_STATION ? Station::GetIfValid(m_dest_station) : nullptr;
}
protected:
/** to access inherited path finder */
Tpf& Yapf()
@ -402,6 +407,22 @@ public:
path_cache.td.pop_back();
path_cache.tile.pop_back();
}
/* Check if target is a station, and cached path ends within 8 tiles of the dest tile */
const Station *st = Yapf().GetDestinationStation();
if (st) {
const RoadStop *stop = st->GetPrimaryRoadStop(v);
if (stop != nullptr && (IsDriveThroughStopTile(stop->xy) || stop->GetNextRoadStop(v) != nullptr)) {
/* Destination station has at least 2 usable road stops, or first is a drive-through stop,
* trim end of path cache within a number of tiles of road stop tile area */
TileArea non_cached_area = v->IsBus() ? st->bus_station : st->truck_station;
non_cached_area.Expand(YAPF_ROADVEH_PATH_CACHE_DESTINATION_LIMIT);
while (!path_cache.empty() && non_cached_area.Contains(path_cache.tile.back())) {
path_cache.td.pop_back();
path_cache.tile.pop_back();
}
}
}
}
return next_trackdir;
}