summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatric Stout <truebrain@openttd.org>2021-01-06 21:12:32 +0100
committerPatric Stout <github@truebrain.nl>2021-01-08 12:02:25 +0100
commitaac8c28d7369a4394303449ce5307067379067bd (patch)
tree58b51f7f2caf1463d213bd2cd0a284bce990a7a2
parentebd9f26c152a400d55d52bad77ec97ea2f5788fe (diff)
downloadopenttd-aac8c28d7369a4394303449ce5307067379067bd.tar.xz
Fix #7656: destroying a tunnel/bridge now first removes the tracks for cost calculation
This means that for rail tunnel/bridges, the rail is first sold, and the tunnel/bridge is destroyed after. This means destroying tunnels/ bridges now often makes you money, instead of costing. Similar, with road/tram tracks. Destroying a road+tram tunnel/bridge now costs the same amount of money as first removing the tram tracks and than destroying the road tunnel/bridge. Especially as tram tracks generate money when removing, this is a noticeable difference.
-rw-r--r--regression/regression/result.txt6
-rw-r--r--src/tunnelbridge_cmd.cpp41
2 files changed, 41 insertions, 6 deletions
diff --git a/regression/regression/result.txt b/regression/regression/result.txt
index 2153cdaad..84d8feaff 100644
--- a/regression/regression/result.txt
+++ b/regression/regression/result.txt
@@ -7314,7 +7314,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
IsBuoyTile(): false
IsLockTile(): false
IsCanalTile(): false
- GetBankBalance(): 1999979664
+ GetBankBalance(): 1999979304
BuildWaterDepot(): true
BuildDock(): true
BuildBuoy(): true
@@ -7327,7 +7327,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
IsBuoyTile(): true
IsLockTile(): true
IsCanalTile(): true
- GetBankBalance(): 1999965040
+ GetBankBalance(): 1999964680
--AIWaypointList(BUOY)--
Count(): 1
@@ -7346,7 +7346,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
IsBuoyTile(): false
IsLockTile(): false
IsCanalTile(): false
- GetBankBalance(): 1999959645
+ GetBankBalance(): 1999959285
BuildWaterDepot(): true
BuildDock(): true
diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp
index 1ac747bc2..e71440fc2 100644
--- a/src/tunnelbridge_cmd.cpp
+++ b/src/tunnelbridge_cmd.cpp
@@ -214,6 +214,38 @@ CommandCost CheckBridgeAvailability(BridgeType bridge_type, uint bridge_len, DoC
}
/**
+ * 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);
+
+ if (road_rt != INVALID_ROADTYPE) {
+ base_cost += 2 * RoadClearCost(road_rt);
+ }
+ if (tram_rt != INVALID_ROADTYPE) {
+ 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
* @param flags type of operation
@@ -373,7 +405,8 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u
return_cmd_error(STR_ERROR_AREA_IS_OWNED_BY_ANOTHER);
}
- cost.AddCost(bridge_len * _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 */
@@ -849,6 +882,7 @@ static CommandCost DoClearTunnel(TileIndex tile, DoCommandFlag flags)
ChangeTownRating(t, RATING_TUNNEL_BRIDGE_DOWN_STEP, RATING_TUNNEL_BRIDGE_MINIMUM, flags);
}
+ Money base_cost = TunnelBridgeClearCost(tile, PR_CLEAR_TUNNEL);
uint len = GetTunnelBridgeLength(tile, endtile) + 2; // Don't forget the end tiles.
if (flags & DC_EXEC) {
@@ -889,7 +923,8 @@ static CommandCost DoClearTunnel(TileIndex tile, DoCommandFlag flags)
DoClearSquare(endtile);
}
}
- return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_CLEAR_TUNNEL] * len);
+
+ return CommandCost(EXPENSES_CONSTRUCTION, len * base_cost);
}
@@ -928,7 +963,7 @@ static CommandCost DoClearBridge(TileIndex tile, DoCommandFlag flags)
ChangeTownRating(t, RATING_TUNNEL_BRIDGE_DOWN_STEP, RATING_TUNNEL_BRIDGE_MINIMUM, 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 len = GetTunnelBridgeLength(tile, endtile) + 2; // Don't forget the end tiles.
if (flags & DC_EXEC) {