tron@3518: /* $Id$ */ tron@3518: belugas@6393: /** @file road.h */ belugas@6393: tron@3518: #ifndef ROAD_H tron@3518: #define ROAD_H tron@3518: rubidium@5587: #include "helpers.hpp" rubidium@5587: rubidium@6661: /** rubidium@6661: * The different roadtypes we support rubidium@6661: * @note currently only ROADTYPE_ROAD is supported. rubidium@6661: */ rubidium@6661: enum RoadType { rubidium@6661: ROADTYPE_ROAD = 0, rubidium@6661: ROADTYPE_TRAM = 1, rubidium@6661: ROADTYPE_HWAY = 2, ///< Only a placeholder. Not sure what we are going to do with this road type. rubidium@6661: ROADTYPE_END, rubidium@6661: INVALID_ROADTYPE = 0xFF rubidium@6661: }; rubidium@6661: DECLARE_POSTFIX_INCREMENT(RoadType); rubidium@6661: rubidium@6661: /** rubidium@6661: * The different roadtypes we support, but then a bitmask of them rubidium@6661: * @note currently only ROADTYPES_ROAD is supported. rubidium@6661: */ rubidium@6661: enum RoadTypes { rubidium@6661: ROADTYPES_NONE = 0, rubidium@6661: ROADTYPES_ROAD = 1 << ROADTYPE_ROAD, rubidium@6661: ROADTYPES_TRAM = 1 << ROADTYPE_TRAM, rubidium@6661: ROADTYPES_HWAY = 1 << ROADTYPE_HWAY, rubidium@6661: ROADTYPES_ROADTRAM = ROADTYPES_ROAD | ROADTYPES_TRAM, rubidium@6661: ROADTYPES_ROADHWAY = ROADTYPES_ROAD | ROADTYPES_HWAY, rubidium@6661: ROADTYPES_TRAMHWAY = ROADTYPES_TRAM | ROADTYPES_HWAY, rubidium@6661: ROADTYPES_ALL = ROADTYPES_ROAD | ROADTYPES_TRAM | ROADTYPES_HWAY, rubidium@6661: }; rubidium@6661: DECLARE_ENUM_AS_BIT_SET(RoadTypes); rubidium@6661: rubidium@6661: /** rubidium@6661: * Whether the given roadtype is valid. rubidium@6661: * @param rt the roadtype to check for validness rubidium@6661: * @return true if and only if valid rubidium@6661: */ rubidium@6661: static inline bool IsValidRoadType(RoadType rt) rubidium@6661: { rubidium@6691: return rt == ROADTYPE_ROAD || rt == ROADTYPE_TRAM; rubidium@6661: } rubidium@6661: rubidium@6661: /** rubidium@6661: * Are the given bits pointing to valid roadtypes? rubidium@6661: * @param rts the roadtypes to check for validness rubidium@6661: * @return true if and only if valid rubidium@6661: */ rubidium@6661: static inline bool AreValidRoadTypes(RoadTypes rts) rubidium@6661: { rubidium@6691: return HASBIT(rts, ROADTYPE_ROAD) || HASBIT(rts, ROADTYPE_TRAM); rubidium@6661: } rubidium@6661: rubidium@6661: /** rubidium@6661: * Maps a RoadType to the corresponding RoadTypes value rubidium@6661: */ rubidium@6661: static inline RoadTypes RoadTypeToRoadTypes(RoadType rt) rubidium@6661: { rubidium@6661: return (RoadTypes)(1 << rt); rubidium@6661: } rubidium@6661: rubidium@6661: static inline RoadTypes ComplementRoadTypes(RoadTypes r) rubidium@6661: { rubidium@6661: return (RoadTypes)(ROADTYPES_ALL ^ r); rubidium@6661: } rubidium@6661: rubidium@6248: enum RoadBits { rubidium@5587: ROAD_NONE = 0U, peter1138@3795: ROAD_NW = 1U, peter1138@3795: ROAD_SW = 2U, peter1138@3795: ROAD_SE = 4U, peter1138@3795: ROAD_NE = 8U, tron@3518: ROAD_X = ROAD_SW | ROAD_NE, tron@3518: ROAD_Y = ROAD_NW | ROAD_SE, tron@3518: ROAD_ALL = ROAD_X | ROAD_Y rubidium@6248: }; tron@3518: rubidium@5587: DECLARE_ENUM_AS_BIT_SET(RoadBits); rubidium@5587: tron@3518: static inline RoadBits ComplementRoadBits(RoadBits r) tron@3518: { KUDr@3900: return (RoadBits)(ROAD_ALL ^ r); tron@3518: } tron@3518: tron@3518: static inline RoadBits DiagDirToRoadBits(DiagDirection d) tron@3518: { KUDr@3900: return (RoadBits)(1U << (3 ^ d)); tron@3518: } tron@3518: rubidium@6009: /** Checks whether the trackdir means that we are reversing */ rubidium@6009: static inline bool IsReversingRoadTrackdir(Trackdir dir) rubidium@6009: { rubidium@6009: return (dir & 0x07) >= 6; rubidium@6009: } rubidium@6009: rubidium@6009: /** Checks whether the given trackdir is a straight road */ rubidium@6009: static inline bool IsStraightRoadTrackdir(Trackdir dir) rubidium@6009: { rubidium@6009: return (dir & 0x06) == 0; rubidium@6009: } rubidium@6009: rubidium@6116: /** rubidium@6116: * Is it allowed to remove the given road bits from the given tile? rubidium@6116: * @param tile the tile to remove the road from rubidium@6116: * @param remove the roadbits that are going to be removed rubidium@6116: * @param owner the actual owner of the roadbits of the tile rubidium@6116: * @param edge_road are the removed bits from a town? rubidium@6661: * @param rt the road type to remove the bits from rubidium@6116: * @return true when it is allowed to remove the road bits rubidium@6116: */ rubidium@6661: bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road, RoadType rt); rubidium@6116: rubidium@6691: void DrawTramCatenary(TileInfo *ti, RoadBits tram); rubidium@6691: peter1138@4666: #endif /* ROAD_H */