diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 1887d3a160..99184df9b3 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -3660,7 +3660,18 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse) } if (old_tile == gp.new_tile && IsTunnelBridgeWithSignalSimulation(v->tile) && v->IsFrontEngine()) { TileIndex next_tile = old_tile + TileOffsByDir(v->direction); - if (IsTileType(next_tile, MP_TUNNELBRIDGE) && ReverseDiagDir(GetTunnelBridgeDirection(next_tile)) == DirToDiagDir(v->direction)) { + bool is_exit = false; + if (IsTileType(next_tile, MP_TUNNELBRIDGE) && IsTunnelBridgeWithSignalSimulation(next_tile) && + ReverseDiagDir(GetTunnelBridgeDirection(next_tile)) == DirToDiagDir(v->direction)) { + if (IsBridge(next_tile) && IsBridge(v->tile)) { + // bridge ramp facing towards us + is_exit = true; + } else if (IsTunnel(next_tile) && IsTunnel(v->tile)) { + // tunnel exit at same height + is_exit = (GetTileZ(next_tile) == GetTileZ(v->tile)); + } + } + if (is_exit) { if (CheckTrainStayInWormHole(v, next_tile)) { TrainApproachingLineEnd(v, true, false); }