summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ai/default/default.c17
-rw-r--r--bridge_map.h13
-rw-r--r--road_map.c3
-rw-r--r--road_map.h2
-rw-r--r--tunnelbridge_cmd.c5
5 files changed, 27 insertions, 13 deletions
diff --git a/ai/default/default.c b/ai/default/default.c
index 7ba7fb137..9cfa14f10 100644
--- a/ai/default/default.c
+++ b/ai/default/default.c
@@ -2,6 +2,7 @@
#include "../../stdafx.h"
#include "../../openttd.h"
+#include "../../bridge_map.h"
#include "../../functions.h"
#include "../../map.h"
#include "../../rail_map.h"
@@ -2161,7 +2162,7 @@ static bool AiRemoveTileAndGoForward(Player *p)
// Check if the bridge points in the right direction.
// This is not really needed the first place AiRemoveTileAndGoForward is called.
- if ((_m[tile].m5 & 1) != (p->ai.cur_dir_a & 1)) return false;
+ if (DiagDirToAxis(GetBridgeRampDirection(tile)) != (p->ai.cur_dir_a & 1U)) return false;
// Find other side of bridge.
offs = TileOffsByDir(p->ai.cur_dir_a);
@@ -3673,18 +3674,18 @@ pos_3:
CMD_REMOVE_ROAD);
}
} else if (IsTileType(tile, MP_TUNNELBRIDGE)) {
- byte b;
-
if (!IsTileOwner(tile, _current_player) || (_m[tile].m5 & 0xC6) != 0x80)
return;
m5 = 0;
- b = _m[tile].m5 & 0x21;
- if (b == 0) goto pos_0;
- if (b == 1) goto pos_3;
- if (b == 0x20) goto pos_2;
- goto pos_1;
+ switch (GetBridgeRampDirection(tile)) {
+ default:
+ case DIAGDIR_NE: goto pos_2;
+ case DIAGDIR_SE: goto pos_3;
+ case DIAGDIR_SW: goto pos_0;
+ case DIAGDIR_NW: goto pos_1;
+ }
}
}
diff --git a/bridge_map.h b/bridge_map.h
index ba8e71d50..f1e12db59 100644
--- a/bridge_map.h
+++ b/bridge_map.h
@@ -3,12 +3,25 @@
#ifndef BRIDGE_MAP_H
#define BRIDGE_MAP_H
+#include "direction.h"
#include "macros.h"
#include "map.h"
#include "rail.h"
#include "tile.h"
+/**
+ * Get the direction pointing onto the bridge
+ */
+static inline DiagDirection GetBridgeRampDirection(TileIndex t)
+{
+ /* Heavy wizardry to convert the X/Y (bit 0) + N/S (bit 5) encoding of
+ * bridges to a DiagDirection
+ */
+ return (DiagDirection)((6 - (_m[t].m5 >> 4 & 2) - (_m[t].m5 & 1)) % 4);
+}
+
+
static inline void SetClearUnderBridge(TileIndex t)
{
SetTileOwner(t, OWNER_NONE);
diff --git a/road_map.c b/road_map.c
index 3780334a3..756ab1a92 100644
--- a/road_map.c
+++ b/road_map.c
@@ -2,6 +2,7 @@
#include "stdafx.h"
#include "openttd.h"
+#include "bridge_map.h"
#include "functions.h"
#include "road_map.h"
#include "station.h"
@@ -33,7 +34,7 @@ RoadBits GetAnyRoadBits(TileIndex tile)
} else {
// ending
if (GB(_m[tile].m5, 1, 2) != TRANSPORT_ROAD) return 0; // not a road bridge
- return _m[tile].m5 & 1 ? ROAD_Y : ROAD_X;
+ return DiagDirToRoadBits(ReverseDiagDir(GetBridgeRampDirection(tile)));
}
} else {
// tunnel
diff --git a/road_map.h b/road_map.h
index 6eccc3249..d40ddc92c 100644
--- a/road_map.h
+++ b/road_map.h
@@ -73,7 +73,7 @@ static inline DiagDirection GetRoadDepotDirection(TileIndex tile)
* Special behavior:
* - road depots: entrance is treated as road piece
* - road tunnels: entrance is treated as road piece
- * - bridge ramps: treated as straight road
+ * - bridge ramps: start of the ramp is treated as road piece
* - bridge middle parts: bridge itself is ignored
*/
RoadBits GetAnyRoadBits(TileIndex);
diff --git a/tunnelbridge_cmd.c b/tunnelbridge_cmd.c
index c04da682f..795c59477 100644
--- a/tunnelbridge_cmd.c
+++ b/tunnelbridge_cmd.c
@@ -1019,10 +1019,9 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
if (f) DrawFoundation(ti, f);
}
- /* Cope for the direction of the bridge */
- if (HASBIT(ti->map5, 0)) base_offset++;
+ // HACK Wizardry to convert the bridge ramp direction into a sprite offset
+ base_offset += (6 - GetBridgeRampDirection(ti->tile)) % 4;
- if (ti->map5 & 0x20) base_offset += 2; // which side
if (ti->tileh == 0) base_offset += 4; // sloped bridge head
/* Table number 6 always refers to the bridge heads for any bridge type */