summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bridge_gui.cpp35
1 files changed, 30 insertions, 5 deletions
diff --git a/src/bridge_gui.cpp b/src/bridge_gui.cpp
index 5d8d0e8e2..581064033 100644
--- a/src/bridge_gui.cpp
+++ b/src/bridge_gui.cpp
@@ -22,6 +22,11 @@
#include "table/strings.h"
+/** The type of the last built rail bridge */
+static BridgeType _last_railbridge_type = 0;
+/** The type of the last built road bridge */
+static BridgeType _last_roadbridge_type = 0;
+
/**
* Carriage for the data we need if we want to build a bridge
*/
@@ -93,6 +98,11 @@ private:
void BuildBridge(uint8 i)
{
+ switch ((TransportType)(this->type >> 15)) {
+ 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,
CMD_BUILD_BRIDGE | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE), CcBuildBridge);
}
@@ -287,6 +297,25 @@ void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transpo
* 7..0 = type of bridge */
uint32 type = (transport_type << 15) | (road_rail_type << 8);
+ /* The bridge length without ramps. */
+ const uint bridge_len = GetTunnelBridgeLength(start, end);
+
+ /* 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.
+ */
+ 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: break; // water ways and air routes don't have bridge types
+ }
+ if (_ctrl_pressed && CheckBridge_Stuff(last_bridge_type, bridge_len)) {
+ DoCommandP(end, start, type | last_bridge_type, CMD_BUILD_BRIDGE | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE), CcBuildBridge);
+ return;
+ }
+
/* only query bridge building possibility once, result is the same for all bridges!
* returns CMD_ERROR on failure, and price on success */
StringID errmsg = INVALID_STRING_ID;
@@ -296,11 +325,7 @@ void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transpo
if (CmdFailed(ret)) {
errmsg = _error_message;
} 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 */
+ /* check which bridges can be built */
const uint tot_bridgedata_len = CalcBridgeLenCostFactor(bridge_len + 2);
bl = new GUIBridgeList();