diff options
author | rubidium <rubidium@openttd.org> | 2009-01-03 14:16:18 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2009-01-03 14:16:18 +0000 |
commit | 5b324104f48837c668c11e78b3ac58a341b72705 (patch) | |
tree | 92fd76e47ec8c532de7bb9d7a6d6b3005d1fbb57 | |
parent | 72d89337eea73156b6667874444919695f1cca28 (diff) | |
download | openttd-5b324104f48837c668c11e78b3ac58a341b72705.tar.xz |
(svn r14805) -Feature [FS#2238]: pressing CTRL while dragging to build a bridge build the last built bridge type if possible (planetmaker)
-rw-r--r-- | src/bridge_gui.cpp | 35 |
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(); |