Changeset - r14784:4ff091d20873
[Not reviewed]
master
0 1 0
frosch - 14 years ago 2010-03-10 20:44:04
frosch@openttd.org
(svn r19383) -Fix [FS#3680]: Overbuilding bridges cleared PBS reservation.
1 file changed with 16 insertions and 2 deletions:
0 comments (0 inline, 0 general)
src/tunnelbridge_cmd.cpp
Show inline comments
 
@@ -247,24 +247,25 @@ CommandCost CmdBuildBridge(TileIndex end
 
		if (bridge_len > (_settings_game.construction.longbridges ? 100U : 16U)) return_cmd_error(STR_ERROR_CAN_T_BUILD_BRIDGE_HERE);
 
	}
 

	
 
	/* retrieve landscape height and ensure it's on land */
 
	if (IsWaterTile(tile_start) || IsWaterTile(tile_end)) {
 
		return_cmd_error(STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH);
 
	}
 

	
 
	uint z_start;
 
	uint 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);
 

	
 
	if (z_start != z_end) return_cmd_error(STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT);
 

	
 
	if (IsBridgeTile(tile_start) && IsBridgeTile(tile_end) &&
 
			GetOtherBridgeEnd(tile_start) == tile_end &&
 
			GetTunnelBridgeTransportType(tile_start) == transport_type) {
 
		/* Replace a current bridge. */
 

	
 
		/* If this is a railway bridge, make sure the railtypes match. */
 
@@ -289,26 +290,37 @@ CommandCost CmdBuildBridge(TileIndex end
 
		if (!(flags & DC_QUERY_COST) && bridge_type == GetBridgeType(tile_start)) {
 
			return_cmd_error(STR_ERROR_ALREADY_BUILT);
 
		}
 

	
 
		/* Do not allow replacing another company's bridges. */
 
		if (!IsTileOwner(tile_start, _current_company) && !IsTileOwner(tile_start, OWNER_TOWN)) {
 
			return_cmd_error(STR_ERROR_AREA_IS_OWNED_BY_ANOTHER);
 
		}
 

	
 
		cost.AddCost((bridge_len + 1) * _price[PR_CLEAR_BRIDGE]); // The cost of clearing the current bridge.
 
		owner = GetTileOwner(tile_start);
 

	
 
		/* Do not remove road types when upgrading a bridge */
 
		roadtypes |= GetRoadTypes(tile_start);
 
		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);
 
				break;
 

	
 
			default: break;
 
		}
 
	} else {
 
		/* Build a new bridge. */
 

	
 
		bool allow_on_slopes = (_settings_game.construction.build_on_slopes && transport_type != TRANSPORT_WATER);
 

	
 
		/* Try and clear the start landscape */
 
		CommandCost ret = DoCommand(tile_start, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 
		if (ret.Failed()) return ret;
 
		cost = ret;
 

	
 
		if (terraform_cost_north.Failed() || (terraform_cost_north.GetCost() != 0 && !allow_on_slopes))
 
			return_cmd_error(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION);
 
@@ -395,24 +407,26 @@ CommandCost CmdBuildBridge(TileIndex end
 

	
 
		owner = _current_company;
 
	}
 

	
 
	/* do the drill? */
 
	if (flags & DC_EXEC) {
 
		DiagDirection dir = AxisToDiagDir(direction);
 

	
 
		switch (transport_type) {
 
			case TRANSPORT_RAIL:
 
				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);
 
				break;
 

	
 
			case TRANSPORT_ROAD:
 
				MakeRoadBridgeRamp(tile_start, owner, bridge_type, dir,                 roadtypes);
 
				MakeRoadBridgeRamp(tile_end,   owner, bridge_type, ReverseDiagDir(dir), roadtypes);
 
				break;
 

	
 
			case TRANSPORT_WATER:
 
				MakeAqueductBridgeRamp(tile_start, owner, dir);
 
				MakeAqueductBridgeRamp(tile_end,   owner, ReverseDiagDir(dir));
 
				break;
 

	
0 comments (0 inline, 0 general)