tron@3069: /* $Id$ */ tron@3069: tron@3145: #ifndef ROAD_MAP_H tron@3145: #define ROAD_MAP_H tron@3069: tron@3069: #include "macros.h" tron@3099: #include "rail.h" tron@3518: #include "road.h" tron@3099: #include "tile.h" tron@3069: tron@3146: rubidium@3793: typedef enum RoadTileType { rubidium@3793: ROAD_TILE_NORMAL, rubidium@3793: ROAD_TILE_CROSSING, rubidium@3793: ROAD_TILE_DEPOT rubidium@3793: } RoadTileType; tron@3369: rubidium@3793: static inline RoadTileType GetRoadTileType(TileIndex t) tron@3069: { tron@3369: assert(IsTileType(t, MP_STREET)); tron@4000: return (RoadTileType)GB(_m[t].m5, 4, 4); tron@3150: } tron@3150: tron@3497: static inline bool IsLevelCrossing(TileIndex t) tron@3497: { rubidium@3793: return GetRoadTileType(t) == ROAD_TILE_CROSSING; tron@3497: } tron@3497: Darkvater@3560: static inline bool IsLevelCrossingTile(TileIndex t) Darkvater@3560: { Darkvater@3560: return IsTileType(t, MP_STREET) && IsLevelCrossing(t); Darkvater@3560: } tron@3150: tron@3369: static inline RoadBits GetRoadBits(TileIndex t) tron@3272: { rubidium@3793: assert(GetRoadTileType(t) == ROAD_TILE_NORMAL); tron@4000: return (RoadBits)GB(_m[t].m5, 0, 4); tron@3369: } tron@3369: tron@3369: static inline void SetRoadBits(TileIndex t, RoadBits r) tron@3369: { rubidium@3793: assert(GetRoadTileType(t) == ROAD_TILE_NORMAL); // XXX incomplete tron@3369: SB(_m[t].m5, 0, 4, r); tron@3369: } tron@3369: tron@3369: tron@3369: static inline Axis GetCrossingRoadAxis(TileIndex t) tron@3369: { rubidium@3793: assert(GetRoadTileType(t) == ROAD_TILE_CROSSING); tron@3369: return (Axis)GB(_m[t].m5, 3, 1); tron@3272: } tron@3272: tron@3070: static inline RoadBits GetCrossingRoadBits(TileIndex tile) tron@3070: { tron@3272: return GetCrossingRoadAxis(tile) == AXIS_X ? ROAD_X : ROAD_Y; tron@3070: } tron@3070: tron@3103: static inline TrackBits GetCrossingRailBits(TileIndex tile) tron@3103: { tron@4158: return AxisToTrackBits(OtherAxis(GetCrossingRoadAxis(tile))); tron@3103: } tron@3103: tron@3103: tron@3274: // TODO swap owner of road and rail tron@3274: static inline Owner GetCrossingRoadOwner(TileIndex t) tron@3274: { rubidium@3793: assert(GetRoadTileType(t) == ROAD_TILE_CROSSING); tron@3274: return (Owner)_m[t].m3; tron@3274: } tron@3274: tron@3274: static inline void SetCrossingRoadOwner(TileIndex t, Owner o) tron@3274: { rubidium@3793: assert(GetRoadTileType(t) == ROAD_TILE_CROSSING); tron@3274: _m[t].m3 = o; tron@3274: } tron@3274: celestar@3322: static inline void UnbarCrossing(TileIndex t) celestar@3322: { rubidium@3793: assert(GetRoadTileType(t) == ROAD_TILE_CROSSING); celestar@3322: CLRBIT(_m[t].m5, 2); celestar@3322: } celestar@3322: celestar@3322: static inline void BarCrossing(TileIndex t) celestar@3322: { rubidium@3793: assert(GetRoadTileType(t) == ROAD_TILE_CROSSING); celestar@3322: SETBIT(_m[t].m5, 2); celestar@3322: } celestar@3322: celestar@3322: static inline bool IsCrossingBarred(TileIndex t) celestar@3322: { rubidium@3793: assert(GetRoadTileType(t) == ROAD_TILE_CROSSING); celestar@3322: return HASBIT(_m[t].m5, 2); celestar@3322: } tron@3274: celestar@3430: #define IsOnDesert IsOnSnow celestar@3430: static inline bool IsOnSnow(TileIndex t) celestar@3430: { celestar@3430: return HASBIT(_m[t].m4, 7); celestar@3430: } celestar@3430: celestar@3430: #define ToggleDesert ToggleSnow celestar@3430: static inline void ToggleSnow(TileIndex t) celestar@3430: { celestar@3430: TOGGLEBIT(_m[t].m4, 7); celestar@3430: } celestar@3430: celestar@3430: tron@4048: typedef enum Roadside { tron@4048: ROADSIDE_BARREN = 0, tron@4048: ROADSIDE_GRASS = 1, tron@4048: ROADSIDE_PAVED = 2, tron@4048: ROADSIDE_STREET_LIGHTS = 3, tron@4048: ROADSIDE_TREES = 5, tron@4048: ROADSIDE_GRASS_ROAD_WORKS = 6, tron@4048: ROADSIDE_PAVED_ROAD_WORKS = 7 tron@4048: } Roadside; celestar@3430: tron@4048: static inline Roadside GetRoadside(TileIndex tile) celestar@3430: { tron@4048: return (Roadside)GB(_m[tile].m4, 4, 3); celestar@3430: } celestar@3430: tron@4048: static inline void SetRoadside(TileIndex tile, Roadside s) celestar@3430: { tron@4048: SB(_m[tile].m4, 4, 3, s); celestar@3430: } celestar@3430: celestar@3430: static inline bool HasRoadWorks(TileIndex t) celestar@3430: { tron@4048: return GetRoadside(t) >= ROADSIDE_GRASS_ROAD_WORKS; celestar@3430: } celestar@3430: celestar@3430: static inline bool IncreaseRoadWorksCounter(TileIndex t) celestar@3430: { celestar@3430: AB(_m[t].m4, 0, 4, 1); celestar@3430: celestar@3430: return GB(_m[t].m4, 0, 4) == 15; celestar@3430: } celestar@3430: celestar@3430: static inline void StartRoadWorks(TileIndex t) celestar@3430: { celestar@3430: assert(!HasRoadWorks(t)); celestar@3430: /* Remove any trees or lamps in case or roadwork */ tron@4048: switch (GetRoadside(t)) { tron@4048: case ROADSIDE_BARREN: tron@4048: case ROADSIDE_GRASS: SetRoadside(t, ROADSIDE_GRASS_ROAD_WORKS); break; tron@4048: default: SetRoadside(t, ROADSIDE_PAVED_ROAD_WORKS); break; tron@4045: } celestar@3430: } celestar@3430: celestar@3430: static inline void TerminateRoadWorks(TileIndex t) celestar@3430: { celestar@3430: assert(HasRoadWorks(t)); tron@4048: SetRoadside(t, (Roadside)(GetRoadside(t) - ROADSIDE_GRASS_ROAD_WORKS + ROADSIDE_GRASS)); celestar@3430: /* Stop the counter */ celestar@3430: SB(_m[t].m4, 0, 4, 0); celestar@3430: } celestar@3430: tron@3069: tron@3369: static inline DiagDirection GetRoadDepotDirection(TileIndex t) tron@3069: { rubidium@3793: assert(GetRoadTileType(t) == ROAD_TILE_DEPOT); tron@3369: return (DiagDirection)GB(_m[t].m5, 0, 2); tron@3167: } tron@3167: tron@3167: tron@3146: /** tron@3146: * Returns the RoadBits on an arbitrary tile tron@3146: * Special behavior: tron@3146: * - road depots: entrance is treated as road piece tron@3146: * - road tunnels: entrance is treated as road piece tron@3196: * - bridge ramps: start of the ramp is treated as road piece tron@3146: * - bridge middle parts: bridge itself is ignored tron@3146: */ tron@3146: RoadBits GetAnyRoadBits(TileIndex); tron@3146: tron@3146: tron@3150: TrackBits GetAnyRoadTrackBits(TileIndex tile); tron@3150: tron@3150: Darkvater@4849: static inline void MakeRoadNormal(TileIndex t, Owner owner, RoadBits bits, TownID town) tron@3099: { tron@3099: SetTileType(t, MP_STREET); tron@3099: SetTileOwner(t, owner); tron@3099: _m[t].m2 = town; tron@3099: _m[t].m3 = 0; tron@3099: _m[t].m4 = 0 << 7 | 0 << 4 | 0; rubidium@3793: _m[t].m5 = ROAD_TILE_NORMAL << 4 | bits; tron@3099: } tron@3099: tron@3099: tron@3099: static inline void MakeRoadCrossing(TileIndex t, Owner road, Owner rail, Axis roaddir, RailType rt, uint town) tron@3099: { tron@3099: SetTileType(t, MP_STREET); tron@3099: SetTileOwner(t, rail); tron@3099: _m[t].m2 = town; tron@3099: _m[t].m3 = road; tron@3099: _m[t].m4 = 0 << 7 | 0 << 4 | rt; rubidium@3793: _m[t].m5 = ROAD_TILE_CROSSING << 4 | roaddir << 3 | 0 << 2; tron@3099: } tron@3099: tron@3099: tron@3099: static inline void MakeRoadDepot(TileIndex t, Owner owner, DiagDirection dir) tron@3099: { tron@3099: SetTileType(t, MP_STREET); tron@3099: SetTileOwner(t, owner); tron@3099: _m[t].m2 = 0; tron@3099: _m[t].m3 = 0; tron@3099: _m[t].m4 = 0; rubidium@3793: _m[t].m5 = ROAD_TILE_DEPOT << 4 | dir; tron@3099: } tron@3099: peter1138@4666: #endif /* ROAD_MAP_H */