Skip to content

Commit

Permalink
Codechange: Keep tileindex in path cache to be able to detect invalid…
Browse files Browse the repository at this point in the history
…ated paths.
  • Loading branch information
PeterN committed Mar 1, 2019
1 parent 1bb8fb8 commit 7d4df70
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 13 deletions.
11 changes: 7 additions & 4 deletions src/pathfinder/yapf/yapf_road.cpp
Expand Up @@ -390,9 +390,10 @@ class CYapfFollowRoadT
while (pNode->m_parent != NULL) {
steps--;
if (pNode->GetIsChoice() && steps < YAPF_ROADVEH_PATH_CACHE_SEGMENTS) {
TrackdirByte td;
td = pNode->GetTrackdir();
path_cache.push_front(td);
TrackdirTile tdt;
tdt.SetTile(pNode->GetTile());
tdt.SetTrackdir(pNode->GetTrackdir());
path_cache.push_front(tdt);
}
pNode = pNode->m_parent;
}
Expand All @@ -401,7 +402,9 @@ class CYapfFollowRoadT
assert(best_next_node.GetTile() == tile);
next_trackdir = best_next_node.GetTrackdir();
/* remove last element for the special case when tile == dest_tile */
if (path_found && !path_cache.empty()) path_cache.pop_back();
if (path_found && !path_cache.empty() && tile == v->dest_tile) {
path_cache.pop_back();
}
}
return next_trackdir;
}
Expand Down
14 changes: 13 additions & 1 deletion src/roadveh.h
Expand Up @@ -83,7 +83,19 @@ static const byte RV_OVERTAKE_TIMEOUT = 35;
void RoadVehUpdateCache(RoadVehicle *v, bool same_length = false);
void GetRoadVehSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type);

typedef std::deque<TrackdirByte> RoadVehPathCache;
struct TrackdirTile {
uint32 data;

inline void SetTile(TileIndex tile) { SB(data, 0, 24, tile); }

inline void SetTrackdir(Trackdir trackdir) { SB(data, 24, 8, trackdir); }

inline TileIndex GetTile() const { return (TileIndex)GB(data, 0, 24); }

inline Trackdir GetTrackdir() const { return (Trackdir)GB(data, 24, 8); }
};

typedef std::deque<TrackdirTile> RoadVehPathCache;

/**
* Buses, trucks and trams belong to this class.
Expand Down
23 changes: 16 additions & 7 deletions src/roadveh_cmd.cpp
Expand Up @@ -956,20 +956,29 @@ 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.front().GetTile() == 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()) {
Trackdir trackdir = v->path.front();
if (v->path.front().GetTile() != tile) {
/* Vehicle didn't expect a choice here, invalidate its path. */
v->path.clear();
} else {
Trackdir trackdir = v->path.front().GetTrackdir();

if (HasBit(trackdirs, trackdir)) {
v->path.pop_front();
return_track(trackdir);
}
if (HasBit(trackdirs, trackdir)) {
v->path.pop_front();
return_track(trackdir);
}

/* Cached path is invalid so continue with pathfinder. */
v->path.clear();
/* Vehicle expected a choice which is no longer available. */
v->path.clear();
}
}

switch (_settings_game.pf.pathfinder_for_roadvehs) {
Expand Down
2 changes: 1 addition & 1 deletion src/saveload/vehicle_sl.cpp
Expand Up @@ -759,7 +759,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt)
SLE_VAR(RoadVehicle, overtaking_ctr, SLE_UINT8),
SLE_VAR(RoadVehicle, crashed_ctr, SLE_UINT16),
SLE_VAR(RoadVehicle, reverse_ctr, SLE_UINT8),
SLE_CONDDEQUE(RoadVehicle, path, SLE_UINT8, SLV_ROADVEH_PATH_CACHE, SL_MAX_VERSION),
SLE_CONDDEQUE(RoadVehicle, path, SLE_UINT32, SLV_ROADVEH_PATH_CACHE, SL_MAX_VERSION),

SLE_CONDNULL(2, SLV_6, SLV_69),
SLE_CONDVAR(RoadVehicle, gv_flags, SLE_UINT16, SLV_139, SL_MAX_VERSION),
Expand Down

0 comments on commit 7d4df70

Please sign in to comment.