diff --git a/src/bridge_map.h b/src/bridge_map.h index a75355da84..a260af4419 100644 --- a/src/bridge_map.h +++ b/src/bridge_map.h @@ -176,10 +176,24 @@ static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, Owner owner_road, Ow * @param bridgetype the type of bridge this bridge ramp belongs to * @param d the direction this ramp must be facing * @param r the rail type of the bridge + * @param upgrade whether the bridge is an upgrade instead of a totally new bridge */ -static inline void MakeRailBridgeRamp(TileIndex t, Owner o, BridgeType bridgetype, DiagDirection d, RailType r) +static inline void MakeRailBridgeRamp(TileIndex t, Owner o, BridgeType bridgetype, DiagDirection d, RailType r, bool upgrade) { + // Backup bridge signal data. + auto m2_backup = _m[t].m2; + auto m5_backup = _m[t].m5; + auto m6_backup = _me[t].m6; + MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_RAIL, r); + + // Restore bridge signal data if we're upgrading an existing bridge. + if (upgrade) { + _m[t].m2 = m2_backup; + SB(_m[t].m5, 4, 3, GB(m5_backup, 4, 3)); + SB(_me[t].m6, 0, 2, GB(m6_backup, 0, 2)); + SB(_me[t].m6, 6, 1, GB(m6_backup, 6, 1)); + } } /** diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 967bb9270f..bc4f869c09 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -346,7 +346,6 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u int z_end; Slope tileh_start = GetTileSlope(tile_start, &z_start); Slope tileh_end = GetTileSlope(tile_end, &z_end); - bool pbs_reservation = false; CommandCost terraform_cost_north = CheckBridgeSlopeNorth(direction, &tileh_start, &z_start); CommandCost terraform_cost_south = CheckBridgeSlopeSouth(direction, &tileh_end, &z_end); @@ -401,11 +400,6 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u if (is_new_owner) owner = company; switch (transport_type) { - case TRANSPORT_RAIL: - /* Keep the reservation, the path stays valid. */ - pbs_reservation = HasTunnelBridgeReservation(tile_start); - break; - case TRANSPORT_ROAD: /* Do not remove road types when upgrading a bridge */ roadtypes |= GetRoadTypes(tile_start); @@ -528,10 +522,8 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u case TRANSPORT_RAIL: /* Add to company infrastructure count if required. */ if (is_new_owner && c != NULL) c->infrastructure.rail[railtype] += (bridge_len + 2) * TUNNELBRIDGE_TRACKBIT_FACTOR; - MakeRailBridgeRamp(tile_start, owner, bridge_type, dir, railtype); - MakeRailBridgeRamp(tile_end, owner, bridge_type, ReverseDiagDir(dir), railtype); - SetTunnelBridgeReservation(tile_start, pbs_reservation); - SetTunnelBridgeReservation(tile_end, pbs_reservation); + MakeRailBridgeRamp(tile_start, owner, bridge_type, dir, railtype, is_upgrade); + MakeRailBridgeRamp(tile_end, owner, bridge_type, ReverseDiagDir(dir), railtype, is_upgrade); break; case TRANSPORT_ROAD: {