diff options
-rw-r--r-- | yapf/follow_track.hpp | 35 | ||||
-rw-r--r-- | yapf/yapf_road.cpp | 8 |
2 files changed, 35 insertions, 8 deletions
diff --git a/yapf/follow_track.hpp b/yapf/follow_track.hpp index 394130932..8cc5f7451 100644 --- a/yapf/follow_track.hpp +++ b/yapf/follow_track.hpp @@ -45,10 +45,10 @@ struct CFollowTrackT : public FollowTrack_t m_old_td = old_td; assert((GetTileTrackStatus(m_old_tile, TT()) & TrackdirToTrackdirBits(m_old_td)) != 0); m_exitdir = TrackdirToExitdir(m_old_td); - if (EnteredRailDepot()) return true; + if (EnteredDepot()) return true; if (!CanExitOldTile()) return false; FollowTileExit(); - if (!QueryNewTileTrackStatus()) return false; + if (!QueryNewTileTrackStatus()) return TryReverse(); if (!CanEnterNewTile()) return false; m_new_td_bits &= DiagdirReachesTrackdirs(m_exitdir); if (!Allow90degTurns()) @@ -198,23 +198,44 @@ protected: return true; } - FORCEINLINE bool EnteredRailDepot() + /** return true if we entered depot and reversed inside */ + FORCEINLINE bool EnteredDepot() { - // rail depots cause reversing - if (IsRailTT() && IsTileDepotType(m_old_tile, TT())) { - DiagDirection exitdir = GetRailDepotDirection(m_old_tile); + // rail and road depots cause reversing + if (!IsWaterTT() && IsTileDepotType(m_old_tile, TT())) { + DiagDirection exitdir = IsRailTT() ? GetRailDepotDirection(m_old_tile) : GetRoadDepotDirection(m_old_tile); if (exitdir != m_exitdir) { // reverse m_new_tile = m_old_tile; m_new_td_bits = TrackdirToTrackdirBits(ReverseTrackdir(m_old_td)); m_exitdir = exitdir; m_tiles_skipped = 0; - m_is_tunnel = false; + m_is_tunnel = m_is_bridge = m_is_station = false; return true; } } return false; } + + /** return true if we successfully reversed at end of road/track */ + FORCEINLINE bool TryReverse() + { + if (IsRoadTT()) { + // if we reached the end of road, we can reverse the RV and continue moving + m_exitdir = ReverseDiagDir(m_exitdir); + // new tile will be the same as old one + m_new_tile = m_old_tile; + // set new trackdir bits to all reachable trackdirs + QueryNewTileTrackStatus(); + m_new_td_bits &= DiagdirReachesTrackdirs(m_exitdir); + if (m_new_td_bits != TRACKDIR_BIT_NONE) { + // we have some trackdirs reachable after reversal + return true; + } + } + return false; + } + public: /** Helper for pathfinders - get min/max speed on the m_old_tile/m_old_td */ int GetSpeedLimit(int *pmin_speed = NULL) diff --git a/yapf/yapf_road.cpp b/yapf/yapf_road.cpp index 6fbff3ecb..d0a06c0f4 100644 --- a/yapf/yapf_road.cpp +++ b/yapf/yapf_road.cpp @@ -76,7 +76,13 @@ public: // base tile cost depending on distance between edges segment_cost += Yapf().OneTileCost(tile, trackdir); - // if there are no reachable trackdirs n new tile, we have end of road + // stop if we have just entered the depot + if (IsTileDepotType(tile, TRANSPORT_ROAD) && trackdir == DiagdirToDiagTrackdir(ReverseDiagDir(GetRoadDepotDirection(tile)))) { + // next time we will reverse and leave the depot + break; + } + + // if there are no reachable trackdirs on new tile, we have end of road TrackFollower F; if (!F.Follow(tile, trackdir)) break; |