# HG changeset patch # User rubidium # Date 1206183368 0 # Node ID 3503ffa351b60509fc97c80983d833319271dede # Parent 6ee04ee57ab50acd87d931f5cc76edb5b7435330 (svn r12390) -Fix [FS#1851]: trams failing to turn on bridge heads/tunnel entrances. diff -r 6ee04ee57ab5 -r 3503ffa351b6 src/road_func.h --- a/src/road_func.h Sat Mar 22 10:50:50 2008 +0000 +++ b/src/road_func.h Sat Mar 22 10:56:08 2008 +0000 @@ -115,6 +115,20 @@ } /** + * Create the road-part which belongs to the given Axis + * + * This function returns a RoadBits value which belongs to + * the given Axis. + * + * @param a The Axis + * @return The result RoadBits which the selected road-part set + */ +static inline RoadBits AxisToRoadBits(Axis a) +{ + return a == AXIS_X ? ROAD_X : ROAD_Y; +} + +/** * Finds out, whether given player has all given RoadTypes available * @param PlayerID ID of player * @param rts RoadTypes to test diff -r 6ee04ee57ab5 -r 3503ffa351b6 src/road_map.cpp --- a/src/road_map.cpp Sat Mar 22 10:50:50 2008 +0000 +++ b/src/road_map.cpp Sat Mar 22 10:56:08 2008 +0000 @@ -14,7 +14,7 @@ #include "tunnelbridge_map.h" -RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt) +RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt, bool straight_tunnel_bridge_entrance) { if (!HasTileRoadType(tile, rt)) return ROAD_NONE; @@ -34,7 +34,9 @@ case MP_TUNNELBRIDGE: if (GetTunnelBridgeTransportType(tile) != TRANSPORT_ROAD) return ROAD_NONE; - return DiagDirToRoadBits(ReverseDiagDir(GetTunnelBridgeDirection(tile))); + return straight_tunnel_bridge_entrance ? + AxisToRoadBits(DiagDirToAxis(GetTunnelBridgeDirection(tile))) : + DiagDirToRoadBits(ReverseDiagDir(GetTunnelBridgeDirection(tile))); default: return ROAD_NONE; } diff -r 6ee04ee57ab5 -r 3503ffa351b6 src/road_map.h --- a/src/road_map.h Sat Mar 22 10:50:50 2008 +0000 +++ b/src/road_map.h Sat Mar 22 10:56:08 2008 +0000 @@ -328,11 +328,16 @@ * - road tunnels: entrance is treated as road piece * - bridge ramps: start of the ramp is treated as road piece * - bridge middle parts: bridge itself is ignored + * + * If straight_tunnel_bridge_entrance is set a ROAD_X or ROAD_Y + * for bridge ramps and tunnel entrances is returned depending + * on the orientation of the tunnel or bridge. * @param tile the tile to get the road bits for * @param rt the road type to get the road bits form + * @param stbe whether to return straight road bits for tunnels/bridges. * @return the road bits of the given tile */ -RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt); +RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt, bool straight_tunnel_bridge_entrance = false); /** * Get the accessible track bits for the given tile. diff -r 6ee04ee57ab5 -r 3503ffa351b6 src/roadveh_cmd.cpp --- a/src/roadveh_cmd.cpp Sat Mar 22 10:50:50 2008 +0000 +++ b/src/roadveh_cmd.cpp Sat Mar 22 10:56:08 2008 +0000 @@ -1461,7 +1461,7 @@ }; RoadBits required = required_roadbits[dir & 0x07]; - if ((required & GetAnyRoadBits(tile, v->u.road.roadtype)) == ROAD_NONE) { + if ((required & GetAnyRoadBits(tile, v->u.road.roadtype, true)) == ROAD_NONE) { dir = INVALID_TRACKDIR; } @@ -1698,7 +1698,7 @@ uint turn_around_start_frame = RVC_TURN_AROUND_START_FRAME; RoadBits tram; - if (v->u.road.roadtype == ROADTYPE_TRAM && CountBits(tram = GetAnyRoadBits(v->tile, ROADTYPE_TRAM)) == 1) { + if (v->u.road.roadtype == ROADTYPE_TRAM && CountBits(tram = GetAnyRoadBits(v->tile, ROADTYPE_TRAM, true)) == 1) { /* * The tram is turning around with one tram 'roadbit'. This means that * it is using the 'big' corner 'drive data'. However, to support the