From 8846f347f25833fb8f2a897c2ee0a1725c3ac91d Mon Sep 17 00:00:00 2001 From: frosch Date: Fri, 4 Apr 2025 11:49:10 +0200 Subject: [PATCH] Fix: MayHaveRoad claimed rail station tiles had road, so the custom stationspec index would be read as roadtype. (#13949) --- src/bridge_map.h | 4 ++-- src/newgrf_roadtype.cpp | 2 +- src/road_map.cpp | 25 +++++++++++++++++++++++-- src/road_map.h | 18 +----------------- src/saveload/afterload.cpp | 9 --------- src/tunnel_map.h | 1 - 6 files changed, 27 insertions(+), 32 deletions(-) diff --git a/src/bridge_map.h b/src/bridge_map.h index ea14d41039..5ced7b5d2f 100644 --- a/src/bridge_map.h +++ b/src/bridge_map.h @@ -132,11 +132,11 @@ inline void MakeBridgeRamp(Tile t, Owner o, BridgeType bridgetype, DiagDirection SetDockingTile(t, false); t.m2() = 0; t.m3() = 0; - t.m4() = INVALID_ROADTYPE; + t.m4() = 0; t.m5() = 1 << 7 | tt << 2 | d; SB(t.m6(), 2, 4, bridgetype); t.m7() = 0; - t.m8() = INVALID_ROADTYPE << 6; + t.m8() = 0; } /** diff --git a/src/newgrf_roadtype.cpp b/src/newgrf_roadtype.cpp index 1b91571444..a4ffa8f948 100644 --- a/src/newgrf_roadtype.cpp +++ b/src/newgrf_roadtype.cpp @@ -200,7 +200,7 @@ void ConvertRoadTypes() break; case MP_STATION: - if (IsStationRoadStop(t) || IsRoadWaypoint(t)) { + if (IsAnyRoadStop(t)) { if (RoadType rt = GetRoadTypeRoad(t); rt != INVALID_ROADTYPE) SetRoadTypeRoad(t, roadtype_conversion_map[rt]); if (RoadType rt = GetRoadTypeTram(t); rt != INVALID_ROADTYPE) SetRoadTypeTram(t, roadtype_conversion_map[rt]); } diff --git a/src/road_map.cpp b/src/road_map.cpp index cc822a2c5f..ec6b14d32a 100644 --- a/src/road_map.cpp +++ b/src/road_map.cpp @@ -13,6 +13,27 @@ #include "safeguards.h" +/** + * Test whether a tile can have road/tram types. + * @param t Tile to query. + * @return true if tile can be queried about road/tram types. + */ +bool MayHaveRoad(Tile t) +{ + switch (GetTileType(t)) { + case MP_ROAD: + return true; + + case MP_STATION: + return IsAnyRoadStop(t); + + case MP_TUNNELBRIDGE: + return GetTunnelBridgeTransportType(t) == TRANSPORT_ROAD; + + default: + return false; + } +} /** * Returns the RoadBits on an arbitrary tile @@ -44,12 +65,12 @@ RoadBits GetAnyRoadBits(Tile tile, RoadTramType rtt, bool straight_tunnel_bridge } case MP_STATION: - if (!IsAnyRoadStopTile(tile)) return ROAD_NONE; + assert(IsAnyRoadStopTile(tile)); // ensured by MayHaveRoad if (IsDriveThroughStopTile(tile)) return AxisToRoadBits(GetDriveThroughStopAxis(tile)); return DiagDirToRoadBits(GetBayRoadStopDir(tile)); case MP_TUNNELBRIDGE: - if (GetTunnelBridgeTransportType(tile) != TRANSPORT_ROAD) return ROAD_NONE; + assert(GetTunnelBridgeTransportType(tile) == TRANSPORT_ROAD); // ensured by MayHaveRoad return straight_tunnel_bridge_entrance ? AxisToRoadBits(DiagDirToAxis(GetTunnelBridgeDirection(tile))) : DiagDirToRoadBits(ReverseDiagDir(GetTunnelBridgeDirection(tile))); diff --git a/src/road_map.h b/src/road_map.h index a2f882306a..4d53bfdbe5 100644 --- a/src/road_map.h +++ b/src/road_map.h @@ -25,23 +25,7 @@ enum RoadTileType : uint8_t { ROAD_TILE_DEPOT, ///< Depot (one entrance) }; -/** - * Test whether a tile can have road/tram types. - * @param t Tile to query. - * @return true if tile can be queried about road/tram types. - */ -inline bool MayHaveRoad(Tile t) -{ - switch (GetTileType(t)) { - case MP_ROAD: - case MP_STATION: - case MP_TUNNELBRIDGE: - return true; - - default: - return false; - } -} +bool MayHaveRoad(Tile t); /** * Get the type of the road tile. diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 8d8359f2c0..a61b41d476 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -3190,15 +3190,6 @@ bool AfterLoadGame() } } - if (IsSavegameVersionBeforeOrAt(SLV_ENDING_YEAR)) { - /* Reset roadtype/streetcartype info for non-road bridges. */ - for (const auto t : Map::Iterate()) { - if (IsTileType(t, MP_TUNNELBRIDGE) && GetTunnelBridgeTransportType(t) != TRANSPORT_ROAD) { - SetRoadTypes(t, INVALID_ROADTYPE, INVALID_ROADTYPE); - } - } - } - /* Make sure all industries exclusive supplier/consumer set correctly. */ if (IsSavegameVersionBefore(SLV_GS_INDUSTRY_CONTROL)) { for (Industry *i : Industry::Iterate()) { diff --git a/src/tunnel_map.h b/src/tunnel_map.h index cecdfcd2c1..61965c067c 100644 --- a/src/tunnel_map.h +++ b/src/tunnel_map.h @@ -82,7 +82,6 @@ inline void MakeRailTunnel(Tile t, Owner o, DiagDirection d, RailType r) t.m7() = 0; t.m8() = 0; SetRailType(t, r); - SetRoadTypes(t, INVALID_ROADTYPE, INVALID_ROADTYPE); } #endif /* TUNNEL_MAP_H */