From a7e767d766317186d79c54f3ab847894b0ae3efd Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 13 Jul 2018 03:01:08 +0100 Subject: [PATCH 1/2] =?UTF-8?q?Fix=2090=C2=B0=20turns=20being=20wrongly=20?= =?UTF-8?q?detected=20across=20bridges=20of=20non-zero=20length?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This prevented reservations --- src/pbs.cpp | 2 +- src/train_cmd.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pbs.cpp b/src/pbs.cpp index 07de814d3c..e82804133a 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -412,7 +412,7 @@ bool IsSafeWaitingPosition(const Train *v, TileIndex tile, Trackdir trackdir, bo /* Check for reachable tracks. */ ft.m_new_td_bits &= DiagdirReachesTrackdirs(ft.m_exitdir); - if (forbid_90deg) ft.m_new_td_bits &= ~TrackdirCrossesTrackdirs(trackdir); + if (forbid_90deg && ft.m_tiles_skipped == 0) ft.m_new_td_bits &= ~TrackdirCrossesTrackdirs(trackdir); if (ft.m_new_td_bits == TRACKDIR_BIT_NONE) return include_line_end; if (ft.m_new_td_bits != TRACKDIR_BIT_NONE && KillFirstBit(ft.m_new_td_bits) == TRACKDIR_BIT_NONE) { diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index c612d733f0..fabb813174 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2120,7 +2120,7 @@ static void CheckNextTrainTile(Train *v) if (HasPbsSignalOnTrackdir(ft.m_new_tile, FindFirstTrackdir(ft.m_new_td_bits))) { /* If the next tile is a PBS signal, try to make a reservation. */ TrackBits tracks = TrackdirBitsToTrackBits(ft.m_new_td_bits); - if (_settings_game.pf.forbid_90_deg) { + if (_settings_game.pf.forbid_90_deg && ft.m_tiles_skipped == 0) { tracks &= ~TrackCrossesTracks(TrackdirToTrack(ft.m_old_td)); } ChooseTrainTrack(v, ft.m_new_tile, ft.m_exitdir, tracks, false, NULL, false); @@ -2364,7 +2364,7 @@ static PBSTileInfo ExtendTrainReservation(const Train *v, TrackBits *new_tracks, if (HasOnewaySignalBlockingTrackdir(ft.m_new_tile, FindFirstTrackdir(ft.m_new_td_bits))) break; } - if (_settings_game.pf.forbid_90_deg) { + if (_settings_game.pf.forbid_90_deg && ft.m_tiles_skipped == 0) { ft.m_new_td_bits &= ~TrackdirCrossesTrackdirs(ft.m_old_td); if (ft.m_new_td_bits == TRACKDIR_BIT_NONE) break; } @@ -2416,7 +2416,7 @@ static PBSTileInfo ExtendTrainReservation(const Train *v, TrackBits *new_tracks, while (tile != stopped || cur_td != stopped_td) { if (!ft.Follow(tile, cur_td)) break; - if (_settings_game.pf.forbid_90_deg) { + if (_settings_game.pf.forbid_90_deg && ft.m_tiles_skipped == 0) { ft.m_new_td_bits &= ~TrackdirCrossesTrackdirs(ft.m_old_td); assert(ft.m_new_td_bits != TRACKDIR_BIT_NONE); } From 6ca0fcbae270d731a42555c30bc4dcb869ebbf4e Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 13 Jul 2018 03:13:50 +0100 Subject: [PATCH 2/2] Use head tile track pieces in Train::GetVehicleTrackdir for trains in wormhole --- src/train_cmd.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index fabb813174..1af52c7aab 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -4092,8 +4092,15 @@ Trackdir Train::GetVehicleTrackdir() const } if (this->track == TRACK_BIT_WORMHOLE) { - /* train in tunnel or on bridge, so just use his direction and assume a diagonal track */ - return DiagDirToDiagTrackdir(DirToDiagDir(this->direction)); + /* Train in tunnel or on bridge, so just use his direction and make an educated guess + * given the track bits on the tunnel/bridge head tile. + * If a reachable track piece is reserved, use that, otherwise use the first reachable track piece. + */ + TrackBits tracks = GetAcrossTunnelBridgeReservationTrackBits(this->tile); + if (!tracks) tracks = GetAcrossTunnelBridgeTrackBits(this->tile); + Trackdir td = TrackExitdirToTrackdir(FindFirstTrack(tracks), GetTunnelBridgeDirection(this->tile)); + if (GetTunnelBridgeDirection(this->tile) != DirToDiagDir(this->direction)) td = ReverseTrackdir(td); + return td; } else if (this->track & TRACK_BIT_WORMHOLE) { return TrackDirectionToTrackdir(FindFirstTrack(this->track & TRACK_BIT_MASK), this->direction); }