summaryrefslogtreecommitdiff
path: root/src/road_map.h
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2007-05-31 15:15:00 +0000
committerrubidium <rubidium@openttd.org>2007-05-31 15:15:00 +0000
commit294a154bf7a4892fb16979bb4304fa2ecdb91c51 (patch)
tree3d9486f1a21425d7003ab07134c9311a3d77cb1a /src/road_map.h
parentcca48f8e7e0dd1832e4abcac944f700b5288d81c (diff)
downloadopenttd-294a154bf7a4892fb16979bb4304fa2ecdb91c51.tar.xz
(svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
Diffstat (limited to 'src/road_map.h')
-rw-r--r--src/road_map.h55
1 files changed, 51 insertions, 4 deletions
diff --git a/src/road_map.h b/src/road_map.h
index 4887e76d3..032febed6 100644
--- a/src/road_map.h
+++ b/src/road_map.h
@@ -89,14 +89,24 @@ static inline Owner GetRoadOwner(TileIndex t, RoadType rt)
switch (rt) {
default: NOT_REACHED();
case ROADTYPE_ROAD: return (Owner)GB( _m[t].m1, 0, 5);
- case ROADTYPE_TRAM: return (Owner)GB( _m[t].m5, 0, 5);
+ case ROADTYPE_TRAM: {
+ /* Trams don't need OWNER_TOWN, and remapping OWNER_NONE
+ * to OWNER_TOWN makes it use one bit less */
+ Owner o = (Owner)GB( _m[t].m5, 0, 4);
+ return o == OWNER_TOWN ? OWNER_NONE : o;
+ }
case ROADTYPE_HWAY: return (Owner)GB(_me[t].m7, 0, 5);
}
case ROAD_TILE_CROSSING:
switch (rt) {
default: NOT_REACHED();
case ROADTYPE_ROAD: return (Owner)GB( _m[t].m4, 0, 5);
- case ROADTYPE_TRAM: return (Owner)GB( _m[t].m5, 0, 5);
+ case ROADTYPE_TRAM: {
+ /* Trams don't need OWNER_TOWN, and remapping OWNER_NONE
+ * to OWNER_TOWN makes it use one bit less */
+ Owner o = (Owner)GB( _m[t].m5, 0, 4);
+ return o == OWNER_TOWN ? OWNER_NONE : o;
+ }
case ROADTYPE_HWAY: return (Owner)GB(_me[t].m7, 0, 5);
}
case ROAD_TILE_DEPOT: return GetTileOwner(t);
@@ -113,7 +123,9 @@ static inline void SetRoadOwner(TileIndex t, RoadType rt, Owner o)
switch (rt) {
default: NOT_REACHED();
case ROADTYPE_ROAD: SB( _m[t].m1, 0, 5, o); break;
- case ROADTYPE_TRAM: SB( _m[t].m5, 0, 5, o); break;
+ /* Trams don't need OWNER_TOWN, and remapping OWNER_NONE
+ * to OWNER_TOWN makes it use one bit less */
+ case ROADTYPE_TRAM: SB( _m[t].m5, 0, 4, o == OWNER_NONE ? OWNER_TOWN : o); break;
case ROADTYPE_HWAY: SB(_me[t].m7, 0, 5, o); break;
}
break;
@@ -121,7 +133,9 @@ static inline void SetRoadOwner(TileIndex t, RoadType rt, Owner o)
switch (rt) {
default: NOT_REACHED();
case ROADTYPE_ROAD: SB( _m[t].m4, 0, 5, o); break;
- case ROADTYPE_TRAM: SB( _m[t].m5, 0, 5, o); break;
+ /* Trams don't need OWNER_TOWN, and remapping OWNER_NONE
+ * to OWNER_TOWN makes it use one bit less */
+ case ROADTYPE_TRAM: SB( _m[t].m5, 0, 4, o == OWNER_NONE ? OWNER_TOWN : o); break;
case ROADTYPE_HWAY: SB(_me[t].m7, 0, 5, o); break;
}
break;
@@ -129,6 +143,39 @@ static inline void SetRoadOwner(TileIndex t, RoadType rt, Owner o)
}
}
+/** Which directions are disallowed ? */
+enum DisallowedRoadDirections {
+ DRD_NONE, ///< None of the directions are disallowed
+ DRD_SOUTHBOUND, ///< All southbound traffic is disallowed
+ DRD_NORTHBOUND, ///< All northbound traffic is disallowed
+ DRD_BOTH, ///< All directions are disallowed
+ DRD_END
+};
+DECLARE_ENUM_AS_BIT_SET(DisallowedRoadDirections);
+
+/**
+ * Gets the disallowed directions
+ * @param t the tile to get the directions from
+ * @return the disallowed directions
+ */
+static inline DisallowedRoadDirections GetDisallowedRoadDirections(TileIndex t)
+{
+ assert(GetRoadTileType(t) == ROAD_TILE_NORMAL);
+ return (DisallowedRoadDirections)GB(_m[t].m5, 4, 2);
+}
+
+/**
+ * Sets the disallowed directions
+ * @param t the tile to set the directions for
+ * @param drd the disallowed directions
+ */
+static inline void SetDisallowedRoadDirections(TileIndex t, DisallowedRoadDirections drd)
+{
+ assert(GetRoadTileType(t) == ROAD_TILE_NORMAL);
+ assert(drd < DRD_END);
+ SB(_m[t].m5, 4, 2, drd);
+}
+
static inline Axis GetCrossingRoadAxis(TileIndex t)
{
assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);