changeset 10548:e145152cf9e5 draft

(svn r14805) -Feature [FS#2238]: pressing CTRL while dragging to build a bridge build the last built bridge type if possible (planetmaker)
author rubidium <rubidium@openttd.org>
date Sat, 03 Jan 2009 14:16:18 +0000
parents 0b7be1ee92c5
children dd9cc2c7c5be
files src/bridge_gui.cpp
diffstat 1 files changed, 30 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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 @@
 
 	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 @@
 	 *      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 @@
 	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();