From 6328429aac8dede8e42226fb5938c5011dc1f052 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 22 May 2010 14:12:48 +0000 Subject: [PATCH] (svn r19881) -Fix [FS#3827]: pay for the rail/road when constructing tunnels and bridges --- src/ai/api/ai_bridge.hpp | 2 +- src/ai/api/ai_changelog.hpp | 5 +++-- src/bridge_gui.cpp | 10 +++++++++- src/tunnelbridge_cmd.cpp | 13 +++++++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/ai/api/ai_bridge.hpp b/src/ai/api/ai_bridge.hpp index e9daa27b48..19e6bbed1d 100644 --- a/src/ai/api/ai_bridge.hpp +++ b/src/ai/api/ai_bridge.hpp @@ -86,7 +86,7 @@ public: static int32 GetMaxSpeed(BridgeID bridge_id); /** - * Get the new cost of a bridge. + * Get the new cost of a bridge, excluding the road and/or rail. * @param bridge_id The bridge to get the new cost of. * @param length The length of the bridge. * @pre IsValidBridge(bridge_id). diff --git a/src/ai/api/ai_changelog.hpp b/src/ai/api/ai_changelog.hpp index b8943a1dad..c748066cd6 100644 --- a/src/ai/api/ai_changelog.hpp +++ b/src/ai/api/ai_changelog.hpp @@ -27,8 +27,9 @@ * \li HasNext for all lists. * * Other changes: - * \li AIRoad::BuildRoadStation now allows overbuilding - * \li AIRoad::BuildDriveThroughRoadStation now allows overbuilding + * \li AIBridge::GetPrice now returns the price of the bridge without the cost for the rail or road. + * \li AIRoad::BuildRoadStation now allows overbuilding. + * \li AIRoad::BuildDriveThroughRoadStation now allows overbuilding. * \li AIEngine::GetPower can be used for road vehicles. * \li AIEngine::GetWeight can be used for road vehicles. * \li AIEngine::GetMaxTractiveEffort can be used for road vehicles. diff --git a/src/bridge_gui.cpp b/src/bridge_gui.cpp index acdb95b5aa..c11d7554f5 100644 --- a/src/bridge_gui.cpp +++ b/src/bridge_gui.cpp @@ -14,6 +14,7 @@ #include "command_func.h" #include "economy_func.h" #include "bridge.h" +#include "rail.h" #include "strings_func.h" #include "window_func.h" #include "sound_func.h" @@ -394,6 +395,13 @@ void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transpo bl = new GUIBridgeList(); + Money infra_cost = 0; + switch (transport_type) { + case TRANSPORT_ROAD: infra_cost = (bridge_len + 2) * _price[PR_BUILD_ROAD] * 2; break; + case TRANSPORT_RAIL: infra_cost = (bridge_len + 2) * RailBuildCost((RailType)road_rail_type); break; + default: break; + } + /* loop for all bridgetypes */ for (BridgeType brd_type = 0; brd_type != MAX_BRIDGES; brd_type++) { if (CheckBridgeAvailability(brd_type, bridge_len).Succeeded()) { @@ -403,7 +411,7 @@ void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transpo item->spec = GetBridgeSpec(brd_type); /* Add to terraforming & bulldozing costs the cost of the * bridge itself (not computed with DC_QUERY_COST) */ - item->cost = ret.GetCost() + (((int64)tot_bridgedata_len * _price[PR_BUILD_BRIDGE] * item->spec->price) >> 8); + item->cost = ret.GetCost() + (((int64)tot_bridgedata_len * _price[PR_BUILD_BRIDGE] * item->spec->price) >> 8) + infra_cost; } } } diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index a08410eb5a..e706b27afe 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -468,6 +468,12 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u if (!(flags & DC_QUERY_COST) || (c != NULL && c->is_ai)) { bridge_len += 2; // begin and end tiles/ramps + switch (transport_type) { + case TRANSPORT_ROAD: cost.AddCost(bridge_len * _price[PR_BUILD_ROAD] * 2); break; + case TRANSPORT_RAIL: cost.AddCost(bridge_len * RailBuildCost(railtype)); break; + default: break; + } + if (c != NULL) bridge_len = CalcBridgeLenCostFactor(bridge_len); if (transport_type != TRANSPORT_WATER) { @@ -596,6 +602,13 @@ CommandCost CmdBuildTunnel(TileIndex start_tile, DoCommandFlag flags, uint32 p1, cost.AddCost(_price[PR_BUILD_TUNNEL]); cost.AddCost(ret); + /* Pay for the rail/road in the tunnel including entrances */ + switch (transport_type) { + case TRANSPORT_ROAD: cost.AddCost((tiles + 2) * _price[PR_BUILD_ROAD] * 2); break; + case TRANSPORT_RAIL: cost.AddCost((tiles + 2) * RailBuildCost(railtype)); break; + default: break; + } + if (flags & DC_EXEC) { if (transport_type == TRANSPORT_RAIL) { MakeRailTunnel(start_tile, _current_company, direction, railtype);