diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/yapf/follow_track.hpp | 12 | ||||
-rw-r--r-- | src/yapf/yapf_costrail.hpp | 4 | ||||
-rw-r--r-- | src/yapf/yapf_destrail.hpp | 8 |
3 files changed, 16 insertions, 8 deletions
diff --git a/src/yapf/follow_track.hpp b/src/yapf/follow_track.hpp index d3c9c4515..035bc2460 100644 --- a/src/yapf/follow_track.hpp +++ b/src/yapf/follow_track.hpp @@ -34,13 +34,14 @@ struct CFollowTrackT int m_tiles_skipped; ///< number of skipped tunnel or station tiles ErrorCode m_err; CPerformanceTimer *m_pPerf; + RailTypes m_railtypes; - FORCEINLINE CFollowTrackT(const Vehicle *v = NULL, CPerformanceTimer* pPerf = NULL) + FORCEINLINE CFollowTrackT(const Vehicle *v = NULL, RailTypes railtype_override = INVALID_RAILTYPES, CPerformanceTimer *pPerf = NULL) { - Init(v, pPerf); + Init(v, railtype_override, pPerf); } - FORCEINLINE void Init(const Vehicle *v, CPerformanceTimer* pPerf) + FORCEINLINE void Init(const Vehicle *v, RailTypes railtype_override, CPerformanceTimer *pPerf) { assert(!IsRailTT() || (v != NULL && v->type == VEH_TRAIN)); m_veh = v; @@ -52,6 +53,7 @@ struct CFollowTrackT m_is_station = m_is_bridge = m_is_tunnel = false; m_tiles_skipped = 0; m_err = EC_NONE; + if (IsRailTT()) m_railtypes = railtype_override == INVALID_RAILTYPES ? v->u.rail.compatible_railtypes : railtype_override; } FORCEINLINE static TransportType TT() {return Ttr_type_;} @@ -79,7 +81,7 @@ struct CFollowTrackT /** main follower routine. Fills all members and return true on success. * Otherwise returns false if track can't be followed. */ - FORCEINLINE bool Follow(TileIndex old_tile, Trackdir old_td) + inline bool Follow(TileIndex old_tile, Trackdir old_td) { m_old_tile = old_tile; m_old_td = old_td; @@ -256,7 +258,7 @@ protected: // rail transport is possible only on compatible rail types if (IsRailTT()) { RailType rail_type = GetTileRailType(m_new_tile); - if (!HasBit(m_veh->u.rail.compatible_railtypes, rail_type)) { + if (!HasBit(m_railtypes, rail_type)) { // incompatible rail type m_err = EC_RAIL_TYPE; return false; diff --git a/src/yapf/yapf_costrail.hpp b/src/yapf/yapf_costrail.hpp index ddfdca644..509cba5d7 100644 --- a/src/yapf/yapf_costrail.hpp +++ b/src/yapf/yapf_costrail.hpp @@ -271,7 +271,7 @@ public: EndSegmentReasonBits end_segment_reason = ESRB_NONE; - TrackFollower tf_local(v, &Yapf().m_perf_ts_cost); + TrackFollower tf_local(v, Yapf().GetCompatibleRailTypes(), &Yapf().m_perf_ts_cost); if (!has_parent) { /* We will jump to the middle of the cost calculator assuming that segment cache is not used. */ @@ -373,7 +373,7 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th /* Move to the next tile/trackdir. */ tf = &tf_local; - tf_local.Init(v, &Yapf().m_perf_ts_cost); + tf_local.Init(v, Yapf().GetCompatibleRailTypes(), &Yapf().m_perf_ts_cost); if (!tf_local.Follow(cur.tile, cur.td)) { assert(tf_local.m_err != TrackFollower::EC_NONE); diff --git a/src/yapf/yapf_destrail.hpp b/src/yapf/yapf_destrail.hpp index aba409419..7ea73889e 100644 --- a/src/yapf/yapf_destrail.hpp +++ b/src/yapf/yapf_destrail.hpp @@ -11,15 +11,21 @@ protected: RailTypes m_compatible_railtypes; public: - void SetDestination(const Vehicle* v) + void SetDestination(const Vehicle *v, bool override_rail_type = false) { m_compatible_railtypes = v->u.rail.compatible_railtypes; + if (override_rail_type) m_compatible_railtypes |= GetRailTypeInfo(v->u.rail.railtype)->compatible_railtypes; } bool IsCompatibleRailType(RailType rt) { return HasBit(m_compatible_railtypes, rt); } + + RailTypes GetCompatibleRailTypes() const + { + return m_compatible_railtypes; + } }; template <class Types> |