(svn r3887) Add a function to get the other bridge end when you're at a bridge ramp
authortron
Wed, 15 Mar 2006 16:44:50 +0000
changeset 3214 172b409bf612
parent 3213 8e56434d36d5
child 3215 56c250955b3b
(svn r3887) Add a function to get the other bridge end when you're at a bridge ramp
Makefile
ai/default/default.c
bridge_map.c
bridge_map.h
tunnelbridge_cmd.c
--- a/Makefile	Wed Mar 15 16:09:23 2006 +0000
+++ b/Makefile	Wed Mar 15 16:44:50 2006 +0000
@@ -612,6 +612,7 @@
 SRCS += airport_gui.c
 SRCS += aystar.c
 SRCS += bridge_gui.c
+SRCS += bridge_map.c
 SRCS += callback_table.c
 SRCS += clear_cmd.c
 SRCS += command.c
--- a/ai/default/default.c	Wed Mar 15 16:09:23 2006 +0000
+++ b/ai/default/default.c	Wed Mar 15 16:44:50 2006 +0000
@@ -2146,7 +2146,6 @@
 	int bit;
 	const byte *ptr;
 	TileIndex tile = p->ai.cur_tile_a;
-	int offs;
 	TileIndex tilenew;
 
 	if (IsTileType(tile, MP_TUNNELBRIDGE)) {
@@ -2164,13 +2163,9 @@
 			// This is not really needed the first place AiRemoveTileAndGoForward is called.
 			if (DiagDirToAxis(GetBridgeRampDirection(tile)) != (p->ai.cur_dir_a & 1U)) return false;
 
-			// Find other side of bridge.
-			offs = TileOffsByDir(p->ai.cur_dir_a);
-			do {
-				tile = TILE_MASK(tile - offs);
-			} while (_m[tile].m5 & 0x40);
-
-			tilenew = TILE_MASK(tile - offs);
+			tile = GetOtherBridgeEnd(tile);
+
+			tilenew = TILE_MASK(tile - TileOffsByDir(p->ai.cur_dir_a));
 			// And clear the bridge.
 			if (CmdFailed(DoCommandByTile(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR)))
 				return false;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bridge_map.c	Wed Mar 15 16:44:50 2006 +0000
@@ -0,0 +1,17 @@
+/* $Id$ */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "bridge_map.h"
+
+
+TileIndex GetOtherBridgeEnd(TileIndex tile)
+{
+	TileIndexDiff delta = TileOffsByDir(GetBridgeRampDirection(tile));
+
+	do {
+		tile += delta;
+	} while (!IsBridgeRamp(tile));
+
+	return tile;
+}
--- a/bridge_map.h	Wed Mar 15 16:09:23 2006 +0000
+++ b/bridge_map.h	Wed Mar 15 16:44:50 2006 +0000
@@ -10,6 +10,12 @@
 #include "tile.h"
 
 
+static inline bool IsBridgeRamp(TileIndex t)
+{
+	return !HASBIT(_m[t].m5, 6);
+}
+
+
 /**
  * Get the direction pointing onto the bridge
  */
@@ -22,6 +28,12 @@
 }
 
 
+/**
+ * Starting at one bridge end finds the other bridge end
+ */
+TileIndex GetOtherBridgeEnd(TileIndex);
+
+
 static inline void SetClearUnderBridge(TileIndex t)
 {
 	SetTileOwner(t, OWNER_NONE);
--- a/tunnelbridge_cmd.c	Wed Mar 15 16:09:23 2006 +0000
+++ b/tunnelbridge_cmd.c	Wed Mar 15 16:44:50 2006 +0000
@@ -809,7 +809,7 @@
 		if (!CheckTileOwnership(tile)) return CMD_ERROR;
 
 		// railway bridge
-		tile = FindEdgesOfBridge(tile, &endtile);
+		tile = GetOtherBridgeEnd(tile);
 		// Make sure there's no vehicle on the bridge
 		v = FindVehicleBetween(tile, endtile, z);
 		if (v != NULL) {