summaryrefslogtreecommitdiff
path: root/npf.c
diff options
context:
space:
mode:
Diffstat (limited to 'npf.c')
-rw-r--r--npf.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/npf.c b/npf.c
index d13c36007..346405ef0 100644
--- a/npf.c
+++ b/npf.c
@@ -479,17 +479,7 @@ static bool VehicleMayEnterTile(Owner owner, TileIndex tile, DiagDirection enter
case MP_TUNNELBRIDGE:
if ((IsTunnel(tile) && GetTunnelTransportType(tile) == TRANSPORT_RAIL) ||
- (IsBridge(tile) && (
- (
- IsBridgeRamp(tile) &&
- GetBridgeTransportType(tile) == TRANSPORT_RAIL
- ) || (
- IsBridgeMiddle(tile) &&
- IsTransportUnderBridge(tile) &&
- GetTransportTypeUnderBridge(tile) == TRANSPORT_RAIL &&
- GetBridgeAxis(tile) != DiagDirToAxis(enterdir)
- )
- ))) {
+ (IsBridge(tile) && GetBridgeTransportType(tile) == TRANSPORT_RAIL)) {
return IsTileOwner(tile, owner);
}
break;
@@ -516,6 +506,7 @@ static void NPFFollowTrack(AyStar* aystar, OpenListNode* current)
int i;
TrackdirBits trackdirbits, ts;
TransportType type = aystar->user_data[NPF_TYPE];
+ bool override_dst_check = false;
/* Initialize to 0, so we can jump out (return) somewhere an have no neighbours */
aystar->num_neighbours = 0;
DEBUG(npf, 4)("Expanding: (%d, %d, %d) [%d]", TileX(src_tile), TileY(src_tile), src_trackdir, src_tile);
@@ -526,6 +517,10 @@ static void NPFFollowTrack(AyStar* aystar, OpenListNode* current)
* otherwise we wouldn't have got here. It is also facing us,
* so we should skip it's body */
dst_tile = GetOtherTunnelEnd(src_tile);
+ override_dst_check = true;
+ } else if (IsBridgeTile(src_tile) && GetBridgeRampDirection(src_tile) == src_exitdir) {
+ dst_tile = GetOtherBridgeEnd(src_tile);
+ override_dst_check = true;
} else if (type != TRANSPORT_WATER && (IsRoadStopTile(src_tile) || IsTileDepotType(src_tile, type))) {
/* This is a road station or a train or road depot. We can enter and exit
* those from one side only. Trackdirs don't support that (yet), so we'll
@@ -573,8 +568,14 @@ static void NPFFollowTrack(AyStar* aystar, OpenListNode* current)
/* I can't enter a tunnel entry/exit tile from a tile above the tunnel. Note
* that I can enter the tunnel from a tile below the tunnel entrance. This
* solves the problem of vehicles wanting to drive off a tunnel entrance */
- if (IsTunnelTile(dst_tile) && GetTileZ(dst_tile) < GetTileZ(src_tile)) {
- return;
+ if (!override_dst_check) {
+ if (IsTileType(dst_tile, MP_TUNNELBRIDGE)) {
+ if (IsTunnel(dst_tile)) {
+ if (GetTunnelDirection(dst_tile) != src_exitdir) return;
+ } else {
+ if (GetBridgeRampDirection(dst_tile) != src_exitdir) return;
+ }
+ }
}
/* check correct rail type (mono, maglev, etc) */