summaryrefslogtreecommitdiff
path: root/yapf/follow_track.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'yapf/follow_track.hpp')
-rw-r--r--yapf/follow_track.hpp41
1 files changed, 33 insertions, 8 deletions
diff --git a/yapf/follow_track.hpp b/yapf/follow_track.hpp
index e566a8e5e..7a191f311 100644
--- a/yapf/follow_track.hpp
+++ b/yapf/follow_track.hpp
@@ -27,8 +27,8 @@ struct CFollowTrackT : public FollowTrack_t
m_new_tile = INVALID_TILE;
m_new_td_bits = TRACKDIR_BIT_NONE;
m_exitdir = INVALID_DIAGDIR;
- m_is_tunnel = false;
- m_tunnel_tiles_skipped = 0;
+ m_is_station = m_is_tunnel = false;
+ m_tiles_skipped = 0;
}
FORCEINLINE static TransportType TT() {return Ttr_type_;}
@@ -57,7 +57,7 @@ struct CFollowTrackT : public FollowTrack_t
}
protected:
- /** Follow the m_exitdir from m_old_tile and fill m_new_tile and m_tunnel_tiles_skipped */
+ /** Follow the m_exitdir from m_old_tile and fill m_new_tile and m_tiles_skipped */
FORCEINLINE void FollowTileExit()
{
// extra handling for tunnels in our direction
@@ -68,17 +68,27 @@ protected:
FindLengthOfTunnelResult flotr = FindLengthOfTunnel(m_old_tile, m_exitdir);
m_new_tile = flotr.tile;
m_is_tunnel = true;
- m_tunnel_tiles_skipped = flotr.length - 1;
+ m_tiles_skipped = flotr.length - 1;
return;
}
assert(ReverseDiagDir(tunnel_enterdir) == m_exitdir);
}
- // not a tunnel
+ // not a tunnel or station
m_is_tunnel = false;
- m_tunnel_tiles_skipped = 0;
- // normal tile
+ m_tiles_skipped = 0;
+
+ // normal or station tile
TileIndexDiff diff = TileOffsByDir(m_exitdir);
m_new_tile = TILE_ADD(m_old_tile, diff);
+
+ // special handling for stations
+ if (IsRailTT() && IsRailwayStationTile(m_new_tile)) {
+ m_is_station = true;
+ } else if (IsRoadTT() && IsRoadStopTile(m_new_tile)) {
+ m_is_station = true;
+ } else {
+ m_is_station = false;
+ }
}
/** stores track status (available trackdirs) for the new tile into m_new_td_bits */
@@ -171,6 +181,21 @@ protected:
if (tunnel_enterdir != m_exitdir)
return false;
}
+
+ // special handling for rail stations - get to the end of platform
+ if (IsRailTT() && m_is_station) {
+ // entered railway station
+ // get platform length
+ uint length = GetPlatformLength(m_new_tile, TrackdirToExitdir(m_old_td));
+ // how big step we must do to get to the last platform tile;
+ m_tiles_skipped = length - 1;
+ // move to the platform end
+ TileIndexDiff diff = TileOffsByDir(m_exitdir);
+ diff *= m_tiles_skipped;
+ m_new_tile = TILE_ADD(m_new_tile, diff);
+ return true;
+ }
+
return true;
}
@@ -184,7 +209,7 @@ protected:
m_new_tile = m_old_tile;
m_new_td_bits = TrackdirToTrackdirBits(ReverseTrackdir(m_old_td));
m_exitdir = exitdir;
- m_tunnel_tiles_skipped = 0;
+ m_tiles_skipped = 0;
m_is_tunnel = false;
return true;
}