summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile1
-rw-r--r--ai/default/default.c9
-rw-r--r--bridge_map.c17
-rw-r--r--bridge_map.h12
-rw-r--r--tunnelbridge_cmd.c2
5 files changed, 33 insertions, 8 deletions
diff --git a/Makefile b/Makefile
index 9450a7f6f..73b566f91 100644
--- a/Makefile
+++ b/Makefile
@@ -612,6 +612,7 @@ SRCS += airport.c
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
diff --git a/ai/default/default.c b/ai/default/default.c
index 9cfa14f10..c5d463e45 100644
--- a/ai/default/default.c
+++ b/ai/default/default.c
@@ -2146,7 +2146,6 @@ static bool AiRemoveTileAndGoForward(Player *p)
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 @@ static bool AiRemoveTileAndGoForward(Player *p)
// 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);
+ tile = GetOtherBridgeEnd(tile);
- tilenew = TILE_MASK(tile - offs);
+ 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;
diff --git a/bridge_map.c b/bridge_map.c
new file mode 100644
index 000000000..dbd6ac3f4
--- /dev/null
+++ b/bridge_map.c
@@ -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;
+}
diff --git a/bridge_map.h b/bridge_map.h
index 6b2c92cdf..9d504f06c 100644
--- a/bridge_map.h
+++ b/bridge_map.h
@@ -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 @@ static inline DiagDirection GetBridgeRampDirection(TileIndex t)
}
+/**
+ * Starting at one bridge end finds the other bridge end
+ */
+TileIndex GetOtherBridgeEnd(TileIndex);
+
+
static inline void SetClearUnderBridge(TileIndex t)
{
SetTileOwner(t, OWNER_NONE);
diff --git a/tunnelbridge_cmd.c b/tunnelbridge_cmd.c
index c0151655e..f0d81207d 100644
--- a/tunnelbridge_cmd.c
+++ b/tunnelbridge_cmd.c
@@ -809,7 +809,7 @@ int32 DoConvertTunnelBridgeRail(TileIndex tile, uint totype, bool exec)
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) {