summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile1
-rw-r--r--road_cmd.c40
-rw-r--r--road_map.c44
-rw-r--r--road_map.h17
-rw-r--r--station.h2
-rw-r--r--tile.h6
6 files changed, 73 insertions, 37 deletions
diff --git a/Makefile b/Makefile
index 590a82fa7..0bb437215 100644
--- a/Makefile
+++ b/Makefile
@@ -672,6 +672,7 @@ SRCS += rail_gui.c
SRCS += rev.c
SRCS += road_cmd.c
SRCS += road_gui.c
+SRCS += road_map.c
SRCS += roadveh_cmd.c
SRCS += roadveh_gui.c
SRCS += saveload.c
diff --git a/road_cmd.c b/road_cmd.c
index f2eb1f04f..7e8f410ef 100644
--- a/road_cmd.c
+++ b/road_cmd.c
@@ -27,38 +27,6 @@ static bool _road_special_gettrackstatus;
void RoadVehEnterDepot(Vehicle *v);
-static bool HasTileRoadAt(TileIndex tile, int i)
-{
- RoadBits b;
-
- switch (GetTileType(tile)) {
- case MP_STREET:
- switch (GetRoadType(tile)) {
- case ROAD_NORMAL: b = GetRoadBits(tile); break;
- case ROAD_CROSSING: b = GetCrossingRoadBits(tile); break;
- case ROAD_DEPOT: return (~_m[tile].m5 & 3) == i;
- default: return false;
- }
- break;
-
- case MP_STATION:
- return
- IS_BYTE_INSIDE(_m[tile].m5, 0x43, 0x43 + 8) &&
- (~(_m[tile].m5 - 0x43) & 3) == i;
-
- case MP_TUNNELBRIDGE:
- // bail out, if not a bridge middle part with road underneath
- if ((_m[tile].m5 & 0xF8) != 0xE8) return false;
- // road direction perpendicular to bridge
- b = (_m[tile].m5 & 0x01) ? ROAD_X : ROAD_Y;
-
- default:
- return false;
- }
-
- return HASBIT(b, i);
-}
-
static bool CheckAllowRemoveRoad(TileIndex tile, uint br, bool *edge_road)
{
int blocks;
@@ -90,10 +58,10 @@ static bool CheckAllowRemoveRoad(TileIndex tile, uint br, bool *edge_road)
// Get a bitmask of which neighbouring roads has a tile
n = 0;
- if (blocks&0x25 && HasTileRoadAt(TILE_ADDXY(tile,-1, 0), 1)) n |= 8;
- if (blocks&0x2A && HasTileRoadAt(TILE_ADDXY(tile, 0, 1), 0)) n |= 4;
- if (blocks&0x19 && HasTileRoadAt(TILE_ADDXY(tile, 1, 0), 3)) n |= 2;
- if (blocks&0x16 && HasTileRoadAt(TILE_ADDXY(tile, 0,-1), 2)) n |= 1;
+ if (blocks & 0x25 && GetAnyRoadBits(TILE_ADDXY(tile,-1, 0)) & ROAD_SW) n |= 8;
+ if (blocks & 0x2A && GetAnyRoadBits(TILE_ADDXY(tile, 0, 1)) & ROAD_NW) n |= 4;
+ if (blocks & 0x19 && GetAnyRoadBits(TILE_ADDXY(tile, 1, 0)) & ROAD_NE) n |= 2;
+ if (blocks & 0x16 && GetAnyRoadBits(TILE_ADDXY(tile, 0,-1)) & ROAD_SE) n |= 1;
// If 0 or 1 bits are set in n, or if no bits that match the bits to remove,
// then allow it
diff --git a/road_map.c b/road_map.c
new file mode 100644
index 000000000..ca35d8358
--- /dev/null
+++ b/road_map.c
@@ -0,0 +1,44 @@
+/* $Id$ */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "road_map.h"
+#include "station.h"
+
+
+RoadBits GetAnyRoadBits(TileIndex tile)
+{
+ switch (GetTileType(tile)) {
+ case MP_STREET:
+ switch (GetRoadType(tile)) {
+ default:
+ case ROAD_NORMAL: return GetRoadBits(tile);
+ case ROAD_CROSSING: return GetCrossingRoadBits(tile);
+ case ROAD_DEPOT: return DiagDirToRoadBits(GB(_m[tile].m5, 0, 2));
+ }
+
+ case MP_STATION:
+ if (!IsRoadStationTile(tile)) return 0;
+ return DiagDirToRoadBits(GetRoadStationDir(tile));
+
+ case MP_TUNNELBRIDGE:
+ if (_m[tile].m5 & 0x80) {
+ // bridge
+ if (_m[tile].m5 & 0x40) {
+ // middle part
+ if ((_m[tile].m5 & 0x38) != 0x28) return 0; // no road under bridge
+ return _m[tile].m5 & 1 ? ROAD_X : ROAD_Y;
+ } 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;
+ }
+ } else {
+ // tunnel
+ if (GB(_m[tile].m5, 2, 2) != TRANSPORT_ROAD) return 0; // not a road tunnel
+ return DiagDirToRoadBits(ReverseDiagDir(GB(_m[tile].m5, 0, 2)));
+ }
+
+ default: return 0;
+ }
+}
diff --git a/road_map.h b/road_map.h
index ec9cd33cc..120688474 100644
--- a/road_map.h
+++ b/road_map.h
@@ -22,6 +22,12 @@ static inline RoadBits ComplementRoadBits(RoadBits r)
return ROAD_ALL ^ r;
}
+static inline RoadBits DiagDirToRoadBits(DiagDirection d)
+{
+ return 1 << (3 ^ d);
+}
+
+
static inline RoadBits GetRoadBits(TileIndex tile)
{
return GB(_m[tile].m5, 0, 4);
@@ -50,6 +56,17 @@ static inline RoadType GetRoadType(TileIndex tile)
}
+/**
+ * Returns the RoadBits on an arbitrary 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 middle parts: bridge itself is ignored
+ */
+RoadBits GetAnyRoadBits(TileIndex);
+
+
static inline void MakeRoadNormal(TileIndex t, Owner owner, RoadBits bits, uint town)
{
SetTileType(t, MP_STREET);
diff --git a/station.h b/station.h
index 9e3321a54..9fe26fe70 100644
--- a/station.h
+++ b/station.h
@@ -244,7 +244,7 @@ static inline bool IsBuoyTile(TileIndex tile)
/* Get's the direction the station exit points towards. Ie, returns 0 for a
* station with the exit NE. */
-static inline byte GetRoadStationDir(TileIndex tile)
+static inline DiagDirection GetRoadStationDir(TileIndex tile)
{
assert(IsRoadStationTile(tile));
return (_m[tile].m5 - 0x43) & 3;
diff --git a/tile.h b/tile.h
index bb5698f4c..aacda662a 100644
--- a/tile.h
+++ b/tile.h
@@ -44,6 +44,12 @@ typedef enum DiagonalDirections {
INVALID_DIAGDIR = 0xFF,
} DiagDirection;
+static inline DiagDirection ReverseDiagDir(DiagDirection d)
+{
+ return 2 ^ d;
+}
+
+
/* the 2 axis */
typedef enum Axis {
AXIS_X = 0,