From 9f239cca37b3815d113afcb57acaf9e94425e941 Mon Sep 17 00:00:00 2001 From: rubidium Date: Fri, 8 Aug 2008 09:31:50 +0000 Subject: (svn r14019) -Fix [FS#2205]: game crash after order skip while waiting for free path (michi_cc). --- src/yapf/follow_track.hpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'src/yapf/follow_track.hpp') diff --git a/src/yapf/follow_track.hpp b/src/yapf/follow_track.hpp index c642b20f9..677bbcdd1 100644 --- a/src/yapf/follow_track.hpp +++ b/src/yapf/follow_track.hpp @@ -14,6 +14,8 @@ template struct CFollowTrackT { + typedef CFollowTrackT BaseNoMask; + enum ErrorCode { EC_NONE, EC_OWNER, @@ -77,7 +79,7 @@ struct CFollowTrackT FORCEINLINE bool IsTram() {return IsRoadTT() && HasBit(m_veh->u.road.compatible_roadtypes, ROADTYPE_TRAM);} FORCEINLINE static bool IsRoadTT() {return TT() == TRANSPORT_ROAD;} FORCEINLINE static bool Allow90degTurns() {return T90deg_turns_allowed_;} - FORCEINLINE static bool MaskReservedTracks() {return Tmask_reserved_tracks;} + FORCEINLINE static bool MaskReservedTracks() {return IsRailTT() && Tmask_reserved_tracks;} /** Tests if a tile is a road tile with a single tramtrack (tram can reverse) */ FORCEINLINE DiagDirection GetSingleTramBit(TileIndex tile) @@ -123,6 +125,18 @@ struct CFollowTrackT } } if (MaskReservedTracks()) { + if (m_is_station) { + /* Check skipped station tiles as well. */ + TileIndexDiff diff = TileOffsByDiagDir(m_exitdir); + for (TileIndex tile = m_new_tile - diff * m_tiles_skipped; tile != m_new_tile; tile += diff) { + if (GetRailwayStationReservation(tile)) { + m_new_td_bits = TRACKDIR_BIT_NONE; + m_err = EC_RESERVED; + return false; + } + } + } + TrackBits reserved = GetReservedTrackbits(m_new_tile); /* Mask already reserved trackdirs. */ m_new_td_bits &= ~TrackBitsToTrackdirBits(reserved); -- cgit v1.2.3-54-g00ecf