Fix assertion failure when upgrading dual road/tram bridge
In case where the other road/tram type does not extend across the bridge, but is present on the upgrade tile.
This commit is contained in:
@@ -148,20 +148,13 @@ static inline void MakeBridgeRamp(TileIndex t, Owner o, BridgeType bridgetype, D
|
|||||||
* @param d the direction this ramp must be facing
|
* @param d the direction this ramp must be facing
|
||||||
* @param road_rt the road type of the bridge
|
* @param road_rt the road type of the bridge
|
||||||
* @param tram_rt the tram type of the bridge
|
* @param tram_rt the tram type of the bridge
|
||||||
* @param upgrade whether the bridge is an upgrade instead of a totally new bridge
|
|
||||||
*/
|
*/
|
||||||
static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, Owner owner_road, Owner owner_tram, BridgeType bridgetype, DiagDirection d, RoadType road_rt, RoadType tram_rt, bool upgrade)
|
static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, Owner owner_road, Owner owner_tram, BridgeType bridgetype, DiagDirection d, RoadType road_rt, RoadType tram_rt)
|
||||||
{
|
{
|
||||||
// Backup custom bridgehead data.
|
|
||||||
uint custom_bridge_head_backup = GB(_m[t].m2, 0, 8);
|
|
||||||
|
|
||||||
MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_ROAD);
|
MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_ROAD);
|
||||||
SetRoadOwner(t, RTT_ROAD, owner_road);
|
SetRoadOwner(t, RTT_ROAD, owner_road);
|
||||||
if (owner_tram != OWNER_TOWN) SetRoadOwner(t, RTT_TRAM, owner_tram);
|
if (owner_tram != OWNER_TOWN) SetRoadOwner(t, RTT_TRAM, owner_tram);
|
||||||
SetRoadTypes(t, road_rt, tram_rt);
|
SetRoadTypes(t, road_rt, tram_rt);
|
||||||
|
|
||||||
// Restore custom bridgehead data if we're upgrading an existing bridge.
|
|
||||||
if (upgrade) SB(_m[t].m2, 0, 8, custom_bridge_head_backup);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -639,10 +639,17 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u
|
|||||||
|
|
||||||
Owner owner_road = hasroad ? GetRoadOwner(t, RTT_ROAD) : company;
|
Owner owner_road = hasroad ? GetRoadOwner(t, RTT_ROAD) : company;
|
||||||
Owner owner_tram = hastram ? GetRoadOwner(t, RTT_TRAM) : company;
|
Owner owner_tram = hastram ? GetRoadOwner(t, RTT_TRAM) : company;
|
||||||
MakeRoadBridgeRamp(t, owner, owner_road, owner_tram, bridge_type, d, road_rt, tram_rt, is_upgrade);
|
|
||||||
if (is_upgrade) {
|
if (is_upgrade) {
|
||||||
if (road_rt != INVALID_ROADTYPE) SetCustomBridgeHeadRoadBits(t, RTT_ROAD, GetCustomBridgeHeadRoadBits(t, RTT_ROAD) | DiagDirToRoadBits(d));
|
RoadBits road_bits = GetCustomBridgeHeadRoadBits(t, RTT_ROAD);
|
||||||
if (tram_rt != INVALID_ROADTYPE) SetCustomBridgeHeadRoadBits(t, RTT_TRAM, GetCustomBridgeHeadRoadBits(t, RTT_TRAM) | DiagDirToRoadBits(d));
|
RoadBits tram_bits = GetCustomBridgeHeadRoadBits(t, RTT_TRAM);
|
||||||
|
if (RoadTypeIsRoad(roadtype)) road_bits |= DiagDirToRoadBits(d);
|
||||||
|
if (RoadTypeIsTram(roadtype)) tram_bits |= DiagDirToRoadBits(d);
|
||||||
|
MakeRoadBridgeRamp(t, owner, owner_road, owner_tram, bridge_type, d, road_rt, tram_rt);
|
||||||
|
if (road_rt != INVALID_ROADTYPE) SetCustomBridgeHeadRoadBits(t, RTT_ROAD, road_bits);
|
||||||
|
if (tram_rt != INVALID_ROADTYPE) SetCustomBridgeHeadRoadBits(t, RTT_TRAM, tram_bits);
|
||||||
|
} else {
|
||||||
|
MakeRoadBridgeRamp(t, owner, owner_road, owner_tram, bridge_type, d, road_rt, tram_rt);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
make_bridge_ramp(tile_start, dir);
|
make_bridge_ramp(tile_start, dir);
|
||||||
|
Reference in New Issue
Block a user