(svn r3887) Add a function to get the other bridge end when you're at a bridge ramp
--- 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) {