summaryrefslogtreecommitdiff
path: root/src/roadveh_cmd.cpp
diff options
context:
space:
mode:
authorPeterN <peter@fuzzle.org>2019-03-08 23:52:45 +0000
committerGitHub <noreply@github.com>2019-03-08 23:52:45 +0000
commit6c6971fb43514c4e4923c2ec3b1fdd9fe852617d (patch)
tree8dcb2138ea406a01392437dbb6312954484dba34 /src/roadveh_cmd.cpp
parentdae35188abdfd070ea833bb50ced79d92481a284 (diff)
downloadopenttd-6c6971fb43514c4e4923c2ec3b1fdd9fe852617d.tar.xz
Add: Road vehicle path cache. (#7261)
Diffstat (limited to 'src/roadveh_cmd.cpp')
-rw-r--r--src/roadveh_cmd.cpp34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp
index 970477001..559b87547 100644
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -924,6 +924,8 @@ static Trackdir RoadFindPathToDest(RoadVehicle *v, TileIndex tile, DiagDirection
/* Remove tracks unreachable from the enter dir */
trackdirs &= DiagdirReachesTrackdirs(enterdir);
if (trackdirs == TRACKDIR_BIT_NONE) {
+ /* If vehicle expected a path, it no longer exists, so invalidate it. */
+ if (!v->path.empty()) v->path.clear();
/* No reachable tracks, so we'll reverse */
return_track(_road_reverse_table[enterdir]);
}
@@ -954,12 +956,35 @@ static Trackdir RoadFindPathToDest(RoadVehicle *v, TileIndex tile, DiagDirection
/* Only one track to choose between? */
if (KillFirstBit(trackdirs) == TRACKDIR_BIT_NONE) {
+ if (!v->path.empty() && v->path.tile.front() == tile) {
+ /* Vehicle expected a choice here, invalidate its path. */
+ v->path.clear();
+ }
return_track(FindFirstBit2x64(trackdirs));
}
+ /* Attempt to follow cached path. */
+ if (!v->path.empty()) {
+ if (v->path.tile.front() != tile) {
+ /* Vehicle didn't expect a choice here, invalidate its path. */
+ v->path.clear();
+ } else {
+ Trackdir trackdir = v->path.td.front();
+
+ if (HasBit(trackdirs, trackdir)) {
+ v->path.td.pop_front();
+ v->path.tile.pop_front();
+ return_track(trackdir);
+ }
+
+ /* Vehicle expected a choice which is no longer available. */
+ v->path.clear();
+ }
+ }
+
switch (_settings_game.pf.pathfinder_for_roadvehs) {
case VPF_NPF: best_track = NPFRoadVehicleChooseTrack(v, tile, enterdir, path_found); break;
- case VPF_YAPF: best_track = YapfRoadVehicleChooseTrack(v, tile, enterdir, trackdirs, path_found); break;
+ case VPF_YAPF: best_track = YapfRoadVehicleChooseTrack(v, tile, enterdir, trackdirs, path_found, v->path); break;
default: NOT_REACHED();
}
@@ -1600,6 +1625,13 @@ bool RoadVehicle::Tick()
return true;
}
+void RoadVehicle::SetDestTile(TileIndex tile)
+{
+ if (tile == this->dest_tile) return;
+ this->path.clear();
+ this->dest_tile = tile;
+}
+
static void CheckIfRoadVehNeedsService(RoadVehicle *v)
{
/* If we already got a slot at a stop, use that FIRST, and go to a depot later */