diff options
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | ai/default/default.c | 9 | ||||
-rw-r--r-- | bridge_map.c | 17 | ||||
-rw-r--r-- | bridge_map.h | 12 | ||||
-rw-r--r-- | tunnelbridge_cmd.c | 2 |
5 files changed, 33 insertions, 8 deletions
@@ -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) { |