From 3ae94d857c3db1eb288b456384f8effa97e5a4b1 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 28 Apr 2016 21:47:57 +0100 Subject: [PATCH 1/2] Fix FindTrainOnTrackEnum finding trains inside signalled bridge/tunnels. Now only find trains on the given entrance/exit tile. This fixes trains not leaving stations by PBS into non-empty signalled bridge/tunnels. --- src/pbs.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/pbs.cpp b/src/pbs.cpp index f0511a73b3..2ba7bbf9d1 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -275,6 +275,14 @@ static Vehicle *FindTrainOnTrackEnum(Vehicle *v, void *data) if (v->type != VEH_TRAIN || (v->vehstatus & VS_CRASHED)) return NULL; Train *t = Train::From(v); + if (t->track == TRACK_BIT_WORMHOLE) { + /* Do not find trains inside signalled bridge/tunnels. + * Trains on the ramp/entrance itself are found though. + */ + if (IsTileType(info->res.tile, MP_TUNNELBRIDGE) && HasWormholeSignals(info->res.tile) && info->res.tile != TileVirtXY(t->x_pos, t->y_pos)) { + return NULL; + } + } if (t->track == TRACK_BIT_WORMHOLE || HasBit((TrackBits)t->track, TrackdirToTrack(info->res.trackdir))) { t = t->First(); From 17f74e4c51bd87ee07f266d28ca70b7e00c7b19e Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 28 Apr 2016 22:19:35 +0100 Subject: [PATCH 2/2] Fix signalled bridge/tunnel not always being redrawn on (un)reservation. --- src/pbs.cpp | 2 ++ src/train_cmd.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/src/pbs.cpp b/src/pbs.cpp index 2ba7bbf9d1..c0962557fb 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -126,6 +126,7 @@ bool TryReserveRailTrack(TileIndex tile, Track t, bool trigger_stations) if (GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL && !GetTunnelBridgeReservationTrackBits(tile)) { SetTunnelBridgeReservation(tile, true); if (IsTunnelBridgeExit(tile) && IsTunnelBridgePBS(tile)) SetTunnelBridgeExitGreen(tile, true); + MarkTileDirtyByTile(tile); return true; } break; @@ -181,6 +182,7 @@ void UnreserveRailTrack(TileIndex tile, Track t) if (GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL) { SetTunnelBridgeReservation(tile, false); if (IsTunnelBridgeExit(tile) && IsTunnelBridgePBS(tile)) SetTunnelBridgeExitGreen(tile, false); + MarkTileDirtyByTile(tile); } break; diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index a96e52597b..adb8968a4f 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -3231,6 +3231,7 @@ static bool CheckTrainStayInWormHolePathReserve(Train *t, TileIndex tile) if (reserved == TRACKDIR_BIT_NONE) { /* next tile is not reserved, so reserve the exit tile */ SetTunnelBridgeReservation(tile, true); + MarkTileDirtyByTile(tile); } } bool ok = TryPathReserve(t);