diff -r 50e315db0024 src/bridge_gui.cpp --- src/bridge_gui.cpp Mon Nov 24 19:31:01 2008 +0000 +++ src/bridge_gui.cpp Mon Nov 24 20:39:04 2008 +0100 @@ -21,6 +21,9 @@ #include "widgets/dropdown_func.h" #include "table/strings.h" + +BridgeType _last_railbridge_type = 0; +BridgeType _last_roadbridge_type = 0; /** * Carriage for the data we need if we want to build a bridge @@ -93,6 +96,17 @@ void BuildBridge(uint8 i) { + TransportType type = (TransportType)(this->type >> 15); + switch (type) { + case TRANSPORT_RAIL: + _last_railbridge_type = this->bridges->Get(i)->index; + break; + case TRANSPORT_ROAD: + _last_roadbridge_type = this->bridges->Get(i)->index; + break; + default: + break; + } DoCommandP(this->end_tile, this->start_tile, this->type | this->bridges->Get(i)->index, CcBuildBridge, CMD_BUILD_BRIDGE | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE)); } @@ -286,6 +300,33 @@ * 14..8 = road/rail types, * 7..0 = type of bridge */ uint32 type = (transport_type << 15) | (road_rail_type << 8); + + /* If Ctrl is being pressed, check wether the last bridge built is available + * If so, return this bridge type. Otherwise continue normally. + * We store bridge types for each transport type, so we have to check for + * the transport type beforehand. + */ + const uint bridge_len = GetTunnelBridgeLength(start, end); + + BridgeType last_bridge_type = 0; + switch (transport_type) { + case TRANSPORT_ROAD: + last_bridge_type = _last_roadbridge_type; + break; + + case TRANSPORT_RAIL: + last_bridge_type = _last_railbridge_type; + break; + + default: + /* water ways and air routes don't have bridge types */ + break; + } + if ( (_ctrl_pressed) && (CheckBridge_Stuff(last_bridge_type, bridge_len))) { + DoCommandP(end, start, type | last_bridge_type, CcBuildBridge, + CMD_BUILD_BRIDGE | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE)); + return; + } /* only query bridge building possibility once, result is the same for all bridges! * returns CMD_ERROR on failure, and price on success */ @@ -298,9 +339,9 @@ } else { /* check which bridges can be built * get absolute bridge length - * length of the middle parts of the bridge */ - const uint bridge_len = GetTunnelBridgeLength(start, end); - /* total length of bridge */ + * length of the middle parts of the bridge. + * + * total length of bridge */ const uint tot_bridgedata_len = CalcBridgeLenCostFactor(bridge_len + 2); bl = new GUIBridgeList();