Merge branch 'master' into jgrpp
# Conflicts: # cmake/CompileFlags.cmake # src/aircraft_cmd.cpp # src/blitter/32bpp_anim.cpp # src/cargopacket.cpp # src/cheat_gui.cpp # src/company_cmd.cpp # src/company_gui.cpp # src/core/pool_func.hpp # src/date.cpp # src/economy.cpp # src/error_gui.cpp # src/ground_vehicle.cpp # src/ground_vehicle.hpp # src/group_gui.cpp # src/industry_cmd.cpp # src/lang/dutch.txt # src/lang/french.txt # src/lang/german.txt # src/linkgraph/linkgraph_gui.cpp # src/linkgraph/mcf.cpp # src/network/network_content.cpp # src/network/network_server.cpp # src/network/network_udp.cpp # src/newgrf_engine.cpp # src/newgrf_station.cpp # src/order_cmd.cpp # src/order_gui.cpp # src/pathfinder/follow_track.hpp # src/pathfinder/yapf/yapf_common.hpp # src/saveload/saveload.cpp # src/settings_gui.cpp # src/station_cmd.cpp # src/station_kdtree.h # src/string_func.h # src/table/settings.ini # src/tgp.cpp # src/timetable_cmd.cpp # src/timetable_gui.cpp # src/toolbar_gui.cpp # src/town_cmd.cpp # src/train_cmd.cpp # src/train_gui.cpp # src/tree_gui.cpp # src/tunnelbridge_cmd.cpp # src/vehicle.cpp # src/vehicle_gui.cpp # src/video/sdl2_v.cpp # src/video/sdl_v.cpp # src/video/win32_v.cpp # src/viewport.cpp # src/viewport_sprite_sorter_sse4.cpp # src/window.cpp
This commit is contained in:
@@ -281,7 +281,7 @@ CommandCost CheckBridgeAvailability(BridgeType bridge_type, uint bridge_len, DoC
|
||||
const BridgeSpec *b = GetBridgeSpec(bridge_type);
|
||||
if (b->avail_year > _cur_year) return CMD_ERROR;
|
||||
|
||||
uint max = min(b->max_length, _settings_game.construction.max_bridge_length);
|
||||
uint max = std::min(b->max_length, _settings_game.construction.max_bridge_length);
|
||||
|
||||
if (b->min_length > bridge_len) return CMD_ERROR;
|
||||
if (bridge_len <= max) return CommandCost();
|
||||
@@ -296,6 +296,42 @@ bool MayTownBuildBridgeType(BridgeType bridge_type)
|
||||
return !HasBit(b->ctrl_flags, BSCF_NOT_AVAILABLE_TOWN);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the base cost of clearing a tunnel/bridge per tile.
|
||||
* @param tile Start tile of the tunnel/bridge.
|
||||
* @return How much clearing this tunnel/bridge costs per tile.
|
||||
*/
|
||||
static Money TunnelBridgeClearCost(TileIndex tile, Price base_price)
|
||||
{
|
||||
Money base_cost = _price[base_price];
|
||||
|
||||
/* Add the cost of the transport that is on the tunnel/bridge. */
|
||||
switch (GetTunnelBridgeTransportType(tile)) {
|
||||
case TRANSPORT_ROAD: {
|
||||
RoadType road_rt = GetRoadTypeRoad(tile);
|
||||
RoadType tram_rt = GetRoadTypeTram(tile);
|
||||
|
||||
auto check_rtt = [&](RoadTramType rtt) -> bool {
|
||||
return IsTunnel(tile) || DiagDirToRoadBits(GetTunnelBridgeDirection(tile)) & GetCustomBridgeHeadRoadBits(tile, rtt);
|
||||
};
|
||||
|
||||
if (road_rt != INVALID_ROADTYPE && check_rtt(RTT_ROAD)) {
|
||||
base_cost += 2 * RoadClearCost(road_rt);
|
||||
}
|
||||
if (tram_rt != INVALID_ROADTYPE && check_rtt(RTT_TRAM)) {
|
||||
base_cost += 2 * RoadClearCost(tram_rt);
|
||||
}
|
||||
} break;
|
||||
|
||||
case TRANSPORT_RAIL: base_cost += RailClearCost(GetRailType(tile)); break;
|
||||
/* Aquaducts have their own clear price. */
|
||||
case TRANSPORT_WATER: base_cost = _price[PR_CLEAR_AQUEDUCT]; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
return base_cost;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a Bridge
|
||||
* @param end_tile end tile
|
||||
@@ -385,6 +421,7 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u
|
||||
} else {
|
||||
if (bridge_len > _settings_game.construction.max_bridge_length) return_cmd_error(STR_ERROR_BRIDGE_TOO_LONG);
|
||||
}
|
||||
bridge_len += 2; // begin and end tiles/ramps
|
||||
|
||||
int z_start;
|
||||
int z_end;
|
||||
@@ -466,7 +503,8 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u
|
||||
}
|
||||
}
|
||||
|
||||
cost.AddCost((bridge_len + 1) * _price[PR_CLEAR_BRIDGE]); // The cost of clearing the current bridge.
|
||||
/* The cost of clearing the current bridge. */
|
||||
cost.AddCost(bridge_len * TunnelBridgeClearCost(tile_start, PR_CLEAR_BRIDGE));
|
||||
owner = GetTileOwner(tile_start);
|
||||
|
||||
/* If bridge belonged to bankrupt company, it has a new owner now */
|
||||
@@ -717,7 +755,7 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u
|
||||
}
|
||||
|
||||
case TRANSPORT_WATER:
|
||||
if (is_new_owner && c != nullptr) c->infrastructure.water += (bridge_len + 2) * TUNNELBRIDGE_TRACKBIT_FACTOR;
|
||||
if (is_new_owner && c != nullptr) c->infrastructure.water += bridge_len * TUNNELBRIDGE_TRACKBIT_FACTOR;
|
||||
MakeAqueductBridgeRamp(tile_start, owner, dir);
|
||||
MakeAqueductBridgeRamp(tile_end, owner, ReverseDiagDir(dir));
|
||||
CheckForDockingTile(tile_start);
|
||||
@@ -748,8 +786,6 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u
|
||||
* For (non-spectated) AI, Towns this has to be of course calculated. */
|
||||
Company *c = Company::GetIfValid(company);
|
||||
if (!(flags & DC_QUERY_COST) || (c != nullptr && c->is_ai && company != _local_company)) {
|
||||
bridge_len += 2; // begin and end tiles/ramps
|
||||
|
||||
switch (transport_type) {
|
||||
case TRANSPORT_ROAD: {
|
||||
cost.AddCost(bridge_len * 2 * RoadBuildCost(roadtype));
|
||||
@@ -1181,6 +1217,7 @@ static CommandCost DoClearTunnel(TileIndex tile, DoCommandFlag flags)
|
||||
|
||||
const bool is_chunnel = Tunnel::GetByTile(tile)->is_chunnel;
|
||||
|
||||
Money base_cost = TunnelBridgeClearCost(tile, PR_CLEAR_TUNNEL);
|
||||
uint len = GetTunnelBridgeLength(tile, endtile) + 2; // Don't forget the end tiles.
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
@@ -1245,7 +1282,8 @@ static CommandCost DoClearTunnel(TileIndex tile, DoCommandFlag flags)
|
||||
}
|
||||
ViewportMapInvalidateTunnelCacheByTile(tile < endtile ? tile : endtile, axis);
|
||||
}
|
||||
return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_CLEAR_TUNNEL] * len * (is_chunnel ? 2 : 1));
|
||||
|
||||
return CommandCost(EXPENSES_CONSTRUCTION, len * base_cost * (is_chunnel ? 2 : 1));
|
||||
}
|
||||
|
||||
|
||||
@@ -1306,7 +1344,7 @@ static CommandCost DoClearBridge(TileIndex tile, DoCommandFlag flags)
|
||||
}
|
||||
}
|
||||
|
||||
Money base_cost = (GetTunnelBridgeTransportType(tile) != TRANSPORT_WATER) ? _price[PR_CLEAR_BRIDGE] : _price[PR_CLEAR_AQUEDUCT];
|
||||
Money base_cost = TunnelBridgeClearCost(tile, PR_CLEAR_BRIDGE);
|
||||
uint middle_len = GetTunnelBridgeLength(tile, endtile);
|
||||
uint len = middle_len + 2; // Don't forget the end tiles.
|
||||
|
||||
@@ -1495,8 +1533,8 @@ static void DrawBridgePillars(const PalSpriteID *psid, const TileInfo *ti, Axis
|
||||
GetSlopePixelZOnEdge(ti->tileh, ReverseDiagDir(south_dir), &z_front_north, &z_back_north);
|
||||
|
||||
/* Shared height of pillars */
|
||||
int z_front = max(z_front_north, z_front_south);
|
||||
int z_back = max(z_back_north, z_back_south);
|
||||
int z_front = std::max(z_front_north, z_front_south);
|
||||
int z_back = std::max(z_back_north, z_back_south);
|
||||
|
||||
/* x and y size of bounding-box of pillars */
|
||||
int w = bounding_box_size[axis];
|
||||
@@ -2841,7 +2879,7 @@ static VehicleEnterTileStatus VehicleEnter_TunnelBridge(Vehicle *v, TileIndex ti
|
||||
|
||||
if (v->type == VEH_ROAD) spd *= 2;
|
||||
Vehicle *first = v->First();
|
||||
first->cur_speed = min(first->cur_speed, spd);
|
||||
first->cur_speed = std::min(first->cur_speed, spd);
|
||||
}
|
||||
|
||||
const Direction bridge_dir = DiagDirToDir(dir);
|
||||
|
Reference in New Issue
Block a user