From 294a154bf7a4892fb16979bb4304fa2ecdb91c51 Mon Sep 17 00:00:00 2001 From: rubidium Date: Thu, 31 May 2007 15:15:00 +0000 Subject: (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road. --- src/road_map.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 4 deletions(-) (limited to 'src/road_map.h') 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); -- cgit v1.2.3-54-g00ecf