|
@@ -55,25 +55,25 @@ struct CFollowTrackT : public FollowTrac
|
|
|
}
|
|
|
}
|
|
|
return INVALID_DIAGDIR;
|
|
|
}
|
|
|
|
|
|
/** 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)
|
|
|
{
|
|
|
m_old_tile = old_tile;
|
|
|
m_old_td = old_td;
|
|
|
m_err = EC_NONE;
|
|
|
assert(((GetTileTrackStatus(m_old_tile, TT(), m_veh->u.road.compatible_roadtypes) & TrackdirToTrackdirBits(m_old_td)) != 0) ||
|
|
|
assert(((TrackStatusToTrackdirBits(GetTileTrackStatus(m_old_tile, TT(), m_veh->u.road.compatible_roadtypes)) & TrackdirToTrackdirBits(m_old_td)) != 0) ||
|
|
|
(GetSingleTramBit(m_old_tile) != INVALID_DIAGDIR)); // Disable the assertion for single tram bits
|
|
|
m_exitdir = TrackdirToExitdir(m_old_td);
|
|
|
if (ForcedReverse()) return true;
|
|
|
if (!CanExitOldTile()) return false;
|
|
|
FollowTileExit();
|
|
|
if (!QueryNewTileTrackStatus()) return TryReverse();
|
|
|
if (!CanEnterNewTile()) return false;
|
|
|
m_new_td_bits &= DiagdirReachesTrackdirs(m_exitdir);
|
|
|
if (m_new_td_bits == TRACKDIR_BIT_NONE) {
|
|
|
m_err = EC_NO_WAY;
|
|
|
return false;
|
|
|
}
|
|
@@ -124,26 +124,25 @@ protected:
|
|
|
} else {
|
|
|
m_is_station = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/** stores track status (available trackdirs) for the new tile into m_new_td_bits */
|
|
|
FORCEINLINE bool QueryNewTileTrackStatus()
|
|
|
{
|
|
|
CPerfStart perf(*m_pPerf);
|
|
|
if (IsRailTT() && GetTileType(m_new_tile) == MP_RAILWAY && IsPlainRailTile(m_new_tile)) {
|
|
|
m_new_td_bits = (TrackdirBits)(GetTrackBits(m_new_tile) * 0x101);
|
|
|
} else {
|
|
|
uint32 ts = GetTileTrackStatus(m_new_tile, TT(), m_veh->u.road.compatible_roadtypes);
|
|
|
m_new_td_bits = (TrackdirBits)(ts & TRACKDIR_BIT_MASK);
|
|
|
m_new_td_bits = TrackStatusToTrackdirBits(GetTileTrackStatus(m_new_tile, TT(), m_veh->u.road.compatible_roadtypes));
|
|
|
|
|
|
if (m_new_td_bits == 0) {
|
|
|
/* GetTileTrackStatus() returns 0 for single tram bits.
|
|
|
* As we cannot change it there (easily) without breaking something, change it here */
|
|
|
switch (GetSingleTramBit(m_new_tile)) {
|
|
|
case DIAGDIR_NE:
|
|
|
case DIAGDIR_SW:
|
|
|
m_new_td_bits = TRACKDIR_BIT_X_NE | TRACKDIR_BIT_X_SW;
|
|
|
break;
|
|
|
|
|
|
case DIAGDIR_NW:
|
|
|
case DIAGDIR_SE:
|