(svn r13939) -Add [YAPP]: Extend YAPF with the possibility to override the railtype info of the vehicle. (michi_cc)
authorrubidium
Sat, 02 Aug 2008 22:50:38 +0000
changeset 9797 3b2e6f55e7d0
parent 9796 4d1358696a92
child 9798 4b8cdc1adf4b
(svn r13939) -Add [YAPP]: Extend YAPF with the possibility to override the railtype info of the vehicle. (michi_cc)
src/yapf/follow_track.hpp
src/yapf/yapf_costrail.hpp
src/yapf/yapf_destrail.hpp
--- a/src/yapf/follow_track.hpp	Sat Aug 02 22:50:22 2008 +0000
+++ b/src/yapf/follow_track.hpp	Sat Aug 02 22:50:38 2008 +0000
@@ -34,13 +34,14 @@
 	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 @@
 		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 @@
 
 	/** 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 @@
 		// 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;
--- a/src/yapf/yapf_costrail.hpp	Sat Aug 02 22:50:22 2008 +0000
+++ b/src/yapf/yapf_costrail.hpp	Sat Aug 02 22:50:38 2008 +0000
@@ -271,7 +271,7 @@
 
 		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 @@
 
 			/* 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);
--- a/src/yapf/yapf_destrail.hpp	Sat Aug 02 22:50:22 2008 +0000
+++ b/src/yapf/yapf_destrail.hpp	Sat Aug 02 22:50:38 2008 +0000
@@ -11,15 +11,21 @@
 	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>