(svn r14019) -Fix [FS#2205]: game crash after order skip while waiting for free path (michi_cc).

This commit is contained in:
rubidium
2008-08-08 09:31:50 +00:00
parent 2c92a979ad
commit 9f239cca37
3 changed files with 33 additions and 6 deletions

View File

@@ -14,6 +14,8 @@
template <TransportType Ttr_type_, bool T90deg_turns_allowed_ = true, bool Tmask_reserved_tracks = false>
struct CFollowTrackT
{
typedef CFollowTrackT<Ttr_type_, T90deg_turns_allowed_, false> 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);