diff --git a/src/pbs.cpp b/src/pbs.cpp index 14e681b8fb..6b52f10dae 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -419,7 +419,7 @@ static PBSTileInfo FollowReservation(Owner o, RailTypes rts, TileIndex tile, Tra /* Do not disallow 90 deg turns as the setting might have changed between reserving and now. */ CFollowTrackRail ft(o, rts); auto check_tunnel_bridge = [&]() -> bool { - if (IsTileType(tile, MP_TUNNELBRIDGE) && GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL && IsTunnelBridgeWithSignalSimulation(tile) && TrackdirEntersTunnelBridge(tile, trackdir)) { + if (IsTunnelBridgeWithSignalSimulation(tile) && TrackdirEntersTunnelBridge(tile, trackdir)) { if (_settings_game.vehicle.train_braking_model == TBM_REALISTIC && IsTunnelBridgeSignalSimulationEntrance(tile)) { TileIndex end = GetOtherTunnelBridgeEnd(tile); if (HasAcrossTunnelBridgeReservation(end) && GetTunnelBridgeExitSignalState(end) == SIGNAL_STATE_GREEN && @@ -683,7 +683,7 @@ bool ValidateLookAhead(const Train *v) Trackdir trackdir = v->lookahead->reservation_end_trackdir; if (HasBit(v->lookahead->flags, TRLF_TB_EXIT_FREE)) { - if (!likely(IsTileType(tile, MP_TUNNELBRIDGE) && GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL && TrackdirEntersTunnelBridge(tile, trackdir))) { + if (!likely(IsRailTunnelBridgeTile(tile) && TrackdirEntersTunnelBridge(tile, trackdir))) { return false; } } @@ -943,7 +943,7 @@ void FillTrainReservationLookAhead(Train *v) } else { tile = v->lookahead->reservation_end_tile; trackdir = v->lookahead->reservation_end_trackdir; - if (IsTileType(tile, MP_TUNNELBRIDGE) && GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL && IsTunnelBridgeSignalSimulationEntrance(tile) && TrackdirEntersTunnelBridge(tile, trackdir)) { + if (IsTunnelBridgeSignalSimulationEntranceTile(tile) && TrackdirEntersTunnelBridge(tile, trackdir)) { TileIndex end = GetOtherTunnelBridgeEnd(tile); int raw_free_tiles; if (HasBit(v->lookahead->flags, TRLF_TB_EXIT_FREE)) { @@ -1157,7 +1157,7 @@ bool IsSafeWaitingPosition(const Train *v, TileIndex tile, Trackdir trackdir, bo if (HasSignalOnTrackdir(tile, trackdir) && !IsPbsSignal(GetSignalType(tile, TrackdirToTrack(trackdir)))) return true; } - if (IsTileType(tile, MP_TUNNELBRIDGE) && GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL && IsTrackAcrossTunnelBridge(tile, TrackdirToTrack(trackdir))) { + if (IsRailTunnelBridgeTile(tile) && IsTrackAcrossTunnelBridge(tile, TrackdirToTrack(trackdir))) { if (IsTunnelBridgeSignalSimulationEntrance(tile)) { return true; } @@ -1199,7 +1199,7 @@ bool IsSafeWaitingPosition(const Train *v, TileIndex tile, Trackdir trackdir, bo GetSignalType(ft.m_new_tile, TrackdirToTrack(td)) == SIGTYPE_PBS_ONEWAY) { return include_line_end; } - if (IsTileType(ft.m_new_tile, MP_TUNNELBRIDGE) && GetTunnelBridgeTransportType(ft.m_new_tile) == TRANSPORT_RAIL && + if (IsRailTunnelBridgeTile(ft.m_new_tile) && IsTrackAcrossTunnelBridge(ft.m_new_tile, TrackdirToTrack(td)) && IsTunnelBridgeSignalSimulationExitOnly(ft.m_new_tile) && IsTunnelBridgeEffectivelyPBS(ft.m_new_tile)) { return include_line_end; @@ -1253,8 +1253,7 @@ bool IsWaitingPositionFree(const Train *v, TileIndex tile, Trackdir trackdir, bo return pbs_res_end_wait_test(tile, trackdir); } - if (IsTileType(tile, MP_TUNNELBRIDGE) && GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL && IsTunnelBridgeSignalSimulationEntrance(tile) - && IsTrackAcrossTunnelBridge(tile, TrackdirToTrack(trackdir))) { + if (IsTunnelBridgeSignalSimulationEntranceTile(tile) && IsTrackAcrossTunnelBridge(tile, TrackdirToTrack(trackdir))) { if (IsTunnelBridgeSignalSimulationBidirectional(tile)) { TileIndex other_end = GetOtherTunnelBridgeEnd(tile); if (HasAcrossTunnelBridgeReservation(other_end) && GetTunnelBridgeExitSignalState(other_end) == SIGNAL_STATE_RED) return false; diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 06ba7adf00..7fff20ca4e 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -4003,8 +4003,7 @@ static bool HasLongReservePbsSignalOnTrackdir(Train* v, TileIndex tile, Trackdir static TileIndex CheckLongReservePbsTunnelBridgeOnTrackdir(Train* v, TileIndex tile, Trackdir trackdir) { - if (_settings_game.vehicle.train_braking_model == TBM_REALISTIC && IsTileType(tile, MP_TUNNELBRIDGE) && - GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL && IsTunnelBridgeSignalSimulationEntrance(tile) && TrackdirEntersTunnelBridge(tile, trackdir)) { + if (_settings_game.vehicle.train_braking_model == TBM_REALISTIC && IsTunnelBridgeSignalSimulationEntranceTile(tile) && TrackdirEntersTunnelBridge(tile, trackdir)) { TileIndex end = GetOtherTunnelBridgeEnd(tile); int raw_free_tiles; @@ -6148,8 +6147,7 @@ static bool TrainCheckIfLineEnds(Train *v, bool reverse) /* approaching a rail/road crossing? then make it red */ if (IsLevelCrossingTile(tile)) MaybeBarCrossingWithSound(tile); - if (IsTileType(tile, MP_TUNNELBRIDGE) && GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL && - IsTunnelBridgeSignalSimulationEntrance(tile) && GetTunnelBridgeEntranceSignalState(tile) == SIGNAL_STATE_RED) { + if (IsTunnelBridgeSignalSimulationEntranceTile(tile) && GetTunnelBridgeEntranceSignalState(tile) == SIGNAL_STATE_RED) { return TrainApproachingLineEnd(v, true, reverse); } diff --git a/src/tunnelbridge_map.h b/src/tunnelbridge_map.h index 6e73e05f2b..1214032c1a 100644 --- a/src/tunnelbridge_map.h +++ b/src/tunnelbridge_map.h @@ -74,9 +74,7 @@ static inline bool HasTunnelBridgeSnowOrDesert(TileIndex t) */ static inline bool IsRailTunnelBridgeTile(TileIndex t) { - TransportType tt = Extract(_m[t].m5); - - return IsTileType(t, MP_TUNNELBRIDGE) && (tt == TRANSPORT_RAIL); + return IsTileType(t, MP_TUNNELBRIDGE) && (Extract(_m[t].m5) == TRANSPORT_RAIL); } static inline void SetTunnelBridgeGroundBits(TileIndex t, uint8 bits) @@ -381,6 +379,17 @@ static inline bool IsTunnelBridgeSignalSimulationEntrance(TileIndex t) return HasBit(_m[t].m5, 5); } +/** + * Is this a tunnel/bridge entrance tile with signal? + * Tunnel bridge signal simulation has allways bit 5 on at entrance. + * @param t the tile that might be a tunnel/bridge. + * @return true if and only if this tile is a tunnel/bridge entrance. + */ +static inline bool IsTunnelBridgeSignalSimulationEntranceTile(TileIndex t) +{ + return IsTileType(t, MP_TUNNELBRIDGE) && HasBit(_m[t].m5, 5); +} + /** * Is this a tunnel/bridge entrance tile with signal only? * @param t the tile that might be a tunnel/bridge. @@ -405,6 +414,16 @@ static inline bool IsTunnelBridgeSignalSimulationExit(TileIndex t) return HasBit(_m[t].m5, 6); } +/** + * Is this a tunnel/bridge exit? + * @param t the tile that might be a tunnel/bridge. + * @return true if and only if this tile is a tunnel/bridge exit. + */ +static inline bool IsTunnelBridgeSignalSimulationExitTile(TileIndex t) +{ + return IsTileType(t, MP_TUNNELBRIDGE) && HasBit(_m[t].m5, 6); +} + /** * Is this a tunnel/bridge exit only? * @param t the tile that might be a tunnel/bridge.