diff --git a/src/cmd_helper.h b/src/cmd_helper.h index 9fad397352..bbab273f56 100644 --- a/src/cmd_helper.h +++ b/src/cmd_helper.h @@ -5,7 +5,7 @@ #include "direction_type.h" #include "macros.h" -#include "road.h" +#include "road_type.h" template static inline void ExtractValid(); diff --git a/src/main_gui.cpp b/src/main_gui.cpp index 66d8540609..100d0f4559 100644 --- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -19,7 +19,6 @@ #include "viewport.h" #include "gfx.h" #include "player.h" -#include "road.h" #include "command.h" #include "news.h" #include "town.h" diff --git a/src/player.h b/src/player.h index bd93563400..620ea7d5b8 100644 --- a/src/player.h +++ b/src/player.h @@ -8,7 +8,7 @@ #include "oldpool.h" #include "aystar.h" #include "rail.h" -#include "road.h" +#include "road_func.h" #include "engine.h" #include "livery.h" #include "genworld.h" diff --git a/src/road.cpp b/src/road.cpp index dd0d7f87f6..5ecb2d75c9 100644 --- a/src/road.cpp +++ b/src/road.cpp @@ -4,8 +4,8 @@ #include "openttd.h" #include "functions.h" #include "rail_map.h" -#include "road.h" #include "road_map.h" +#include "road_internal.h" #include "water_map.h" #include "macros.h" diff --git a/src/road.h b/src/road.h deleted file mode 100644 index 506868b95e..0000000000 --- a/src/road.h +++ /dev/null @@ -1,218 +0,0 @@ -/* $Id$ */ - -/** @file road.h */ - -#ifndef ROAD_H -#define ROAD_H - -#include "helpers.hpp" - -/** - * The different roadtypes we support - * - * @note currently only ROADTYPE_ROAD and ROADTYPE_TRAM are supported. - */ -enum RoadType { - ROADTYPE_ROAD = 0, ///< Basic road type - ROADTYPE_TRAM = 1, ///< Trams - ROADTYPE_HWAY = 2, ///< Only a placeholder. Not sure what we are going to do with this road type. - ROADTYPE_END, ///< Used for iterations - INVALID_ROADTYPE = 0xFF ///< flag for invalid roadtype -}; -DECLARE_POSTFIX_INCREMENT(RoadType); - -/** - * The different roadtypes we support, but then a bitmask of them - * @note currently only roadtypes with ROADTYPE_ROAD and ROADTYPE_TRAM are supported. - */ -enum RoadTypes { - ROADTYPES_NONE = 0, ///< No roadtypes - ROADTYPES_ROAD = 1 << ROADTYPE_ROAD, ///< Road - ROADTYPES_TRAM = 1 << ROADTYPE_TRAM, ///< Trams - ROADTYPES_HWAY = 1 << ROADTYPE_HWAY, ///< Highway (or whatever substitute) - ROADTYPES_ROADTRAM = ROADTYPES_ROAD | ROADTYPES_TRAM, ///< Road + trams - ROADTYPES_ROADHWAY = ROADTYPES_ROAD | ROADTYPES_HWAY, ///< Road + highway (or whatever substitute) - ROADTYPES_TRAMHWAY = ROADTYPES_TRAM | ROADTYPES_HWAY, ///< Trams + highway (or whatever substitute) - ROADTYPES_ALL = ROADTYPES_ROAD | ROADTYPES_TRAM | ROADTYPES_HWAY, ///< Road + trams + highway (or whatever substitute) -}; -DECLARE_ENUM_AS_BIT_SET(RoadTypes); - -/** - * Whether the given roadtype is valid. - * @param rt the roadtype to check for validness - * @return true if and only if valid - */ -static inline bool IsValidRoadType(RoadType rt) -{ - return rt == ROADTYPE_ROAD || rt == ROADTYPE_TRAM; -} - -/** - * Are the given bits pointing to valid roadtypes? - * @param rts the roadtypes to check for validness - * @return true if and only if valid - */ -static inline bool AreValidRoadTypes(RoadTypes rts) -{ - return HasBit(rts, ROADTYPE_ROAD) || HasBit(rts, ROADTYPE_TRAM); -} - -/** - * Maps a RoadType to the corresponding RoadTypes value - * - * @param rt the roadtype to get the roadtypes from - * @return the roadtypes with the given roadtype - */ -static inline RoadTypes RoadTypeToRoadTypes(RoadType rt) -{ - return (RoadTypes)(1 << rt); -} - -/** - * Returns the RoadTypes which are not present in the given RoadTypes - * - * This function returns the complement of a given RoadTypes. - * - * @param r The given RoadTypes - * @return The complement of the given RoadTypes - * @note The unused value ROADTYPES_HWAY will be used, too. - */ -static inline RoadTypes ComplementRoadTypes(RoadTypes r) -{ - return (RoadTypes)(ROADTYPES_ALL ^ r); -} - -/** - * Enumeration for the road parts on a tile. - * - * This enumeration defines the possible road parts which - * can be build on a tile. - */ -enum RoadBits { - ROAD_NONE = 0U, ///< No road-part is build - ROAD_NW = 1U, ///< North-west part - ROAD_SW = 2U, ///< South-west part - ROAD_SE = 4U, ///< South-east part - ROAD_NE = 8U, ///< North-east part - ROAD_X = ROAD_SW | ROAD_NE, ///< Full road along the x-axis (south-west + north-east) - ROAD_Y = ROAD_NW | ROAD_SE, ///< Full road along the y-axis (north-west + south-east) - ROAD_ALL = ROAD_X | ROAD_Y ///< Full 4-way crossing -}; - -DECLARE_ENUM_AS_BIT_SET(RoadBits); - -/** - * Calculate the complement of a RoadBits value - * - * Simply flips all bits in the RoadBits value to get the complement - * of the RoadBits. - * - * @param r The given RoadBits value - * @return the complement - */ -static inline RoadBits ComplementRoadBits(RoadBits r) -{ - return (RoadBits)(ROAD_ALL ^ r); -} - -/** - * Calculate the mirrored RoadBits - * - * Simply move the bits to their new position. - * - * @param r The given RoadBits value - * @return the mirrored - */ -static inline RoadBits MirrorRoadBits(RoadBits r) -{ - return (RoadBits)(GB(r, 0, 2) << 2 | GB(r, 2, 2)); -} - -/** - * Calculate rotated RoadBits - * - * Move the Roadbits clockwise til they are in their final position. - * - * @param r The given RoadBits value - * @param rot The given Rotation angle - * @return the rotated - */ -static inline RoadBits RotateRoadBits(RoadBits r, DiagDirDiff rot) -{ - for (; rot > (DiagDirDiff)0; rot--){ - r = (RoadBits)(GB(r, 0, 1) << 3 | GB(r, 1, 3)); - } - return r; -} - -/** - * Create the road-part which belongs to the given DiagDirection - * - * This function returns a RoadBits value which belongs to - * the given DiagDirection. - * - * @param d The DiagDirection - * @return The result RoadBits which the selected road-part set - */ -static inline RoadBits DiagDirToRoadBits(DiagDirection d) -{ - return (RoadBits)(ROAD_NW << (3 ^ d)); -} - -/** - * Return if the tile is a valid tile for a crossing. - * - * @note function is overloaded - * @param tile the curent tile - * @param ax the axis of the road over the rail - * @return true if it is a valid tile - */ -bool IsPossibleCrossing(const TileIndex tile, Axis ax); - -/** - * Checks whether the trackdir means that we are reversing. - * @param dir the trackdir to check - * @return true if it is a reversing road trackdir - */ -static inline bool IsReversingRoadTrackdir(Trackdir dir) -{ - return (dir & 0x07) >= 6; -} - -/** - * Checks whether the given trackdir is a straight road - * @param dir the trackdir to check - * @return true if it is a straight road trackdir - */ -static inline bool IsStraightRoadTrackdir(Trackdir dir) -{ - return (dir & 0x06) == 0; -} - -/** - * Clean up unneccesary RoadBits of a planed tile. - * @param tile current tile - * @param org_rb planed RoadBits - * @return optimised RoadBits - */ -RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb); - -/** - * Is it allowed to remove the given road bits from the given tile? - * @param tile the tile to remove the road from - * @param remove the roadbits that are going to be removed - * @param owner the actual owner of the roadbits of the tile - * @param edge_road are the removed bits from a town? - * @param rt the road type to remove the bits from - * @return true when it is allowed to remove the road bits - */ -bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road, RoadType rt); - -/** - * Draw the catenary for tram road bits - * @param ti information about the tile (position, slope) - * @param tram the roadbits to draw the catenary for - */ -void DrawTramCatenary(TileInfo *ti, RoadBits tram); - -#endif /* ROAD_H */ diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index f6a2a86945..26b016e7d1 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -9,6 +9,7 @@ #include "cmd_helper.h" #include "rail_map.h" #include "road_map.h" +#include "road_internal.h" #include "sprite.h" #include "table/sprites.h" #include "table/strings.h" diff --git a/src/road_func.h b/src/road_func.h new file mode 100644 index 0000000000..4081796e48 --- /dev/null +++ b/src/road_func.h @@ -0,0 +1,114 @@ +/* $Id$ */ + +/** @file road_func.h Functions related to roads. */ + +#ifndef ROAD_FUNC_H +#define ROAD_FUNC_H + +#include "road_type.h" + +/** + * Whether the given roadtype is valid. + * @param rt the roadtype to check for validness + * @return true if and only if valid + */ +static inline bool IsValidRoadType(RoadType rt) +{ + return rt == ROADTYPE_ROAD || rt == ROADTYPE_TRAM; +} + +/** + * Are the given bits pointing to valid roadtypes? + * @param rts the roadtypes to check for validness + * @return true if and only if valid + */ +static inline bool AreValidRoadTypes(RoadTypes rts) +{ + return HasBit(rts, ROADTYPE_ROAD) || HasBit(rts, ROADTYPE_TRAM); +} + +/** + * Maps a RoadType to the corresponding RoadTypes value + * + * @param rt the roadtype to get the roadtypes from + * @return the roadtypes with the given roadtype + */ +static inline RoadTypes RoadTypeToRoadTypes(RoadType rt) +{ + return (RoadTypes)(1 << rt); +} + +/** + * Returns the RoadTypes which are not present in the given RoadTypes + * + * This function returns the complement of a given RoadTypes. + * + * @param r The given RoadTypes + * @return The complement of the given RoadTypes + * @note The unused value ROADTYPES_HWAY will be used, too. + */ +static inline RoadTypes ComplementRoadTypes(RoadTypes r) +{ + return (RoadTypes)(ROADTYPES_ALL ^ r); +} + + +/** + * Calculate the complement of a RoadBits value + * + * Simply flips all bits in the RoadBits value to get the complement + * of the RoadBits. + * + * @param r The given RoadBits value + * @return the complement + */ +static inline RoadBits ComplementRoadBits(RoadBits r) +{ + return (RoadBits)(ROAD_ALL ^ r); +} + +/** + * Calculate the mirrored RoadBits + * + * Simply move the bits to their new position. + * + * @param r The given RoadBits value + * @return the mirrored + */ +static inline RoadBits MirrorRoadBits(RoadBits r) +{ + return (RoadBits)(GB(r, 0, 2) << 2 | GB(r, 2, 2)); +} + +/** + * Calculate rotated RoadBits + * + * Move the Roadbits clockwise til they are in their final position. + * + * @param r The given RoadBits value + * @param rot The given Rotation angle + * @return the rotated + */ +static inline RoadBits RotateRoadBits(RoadBits r, DiagDirDiff rot) +{ + for (; rot > (DiagDirDiff)0; rot--){ + r = (RoadBits)(GB(r, 0, 1) << 3 | GB(r, 1, 3)); + } + return r; +} + +/** + * Create the road-part which belongs to the given DiagDirection + * + * This function returns a RoadBits value which belongs to + * the given DiagDirection. + * + * @param d The DiagDirection + * @return The result RoadBits which the selected road-part set + */ +static inline RoadBits DiagDirToRoadBits(DiagDirection d) +{ + return (RoadBits)(ROAD_NW << (3 ^ d)); +} + +#endif /* ROAD_FUNC_H */ diff --git a/src/road_gui.cpp b/src/road_gui.cpp index c7b984c61a..c6eeedf575 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -17,7 +17,6 @@ #include "sound.h" #include "command.h" #include "variables.h" -#include "road.h" #include "road_cmd.h" #include "road_map.h" #include "station_map.h" diff --git a/src/road_internal.h b/src/road_internal.h new file mode 100644 index 0000000000..642e89b6e3 --- /dev/null +++ b/src/road_internal.h @@ -0,0 +1,34 @@ +/* $Id$ */ + +/** @file road_internal.h Functions used internally by the roads. */ + +#ifndef ROAD_INTERNAL_H +#define ROAD_INTERNAL_H + +/** + * Clean up unneccesary RoadBits of a planed tile. + * @param tile current tile + * @param org_rb planed RoadBits + * @return optimised RoadBits + */ +RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb); + +/** + * Is it allowed to remove the given road bits from the given tile? + * @param tile the tile to remove the road from + * @param remove the roadbits that are going to be removed + * @param owner the actual owner of the roadbits of the tile + * @param edge_road are the removed bits from a town? + * @param rt the road type to remove the bits from + * @return true when it is allowed to remove the road bits + */ +bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road, RoadType rt); + +/** + * Draw the catenary for tram road bits + * @param ti information about the tile (position, slope) + * @param tram the roadbits to draw the catenary for + */ +void DrawTramCatenary(TileInfo *ti, RoadBits tram); + +#endif /* ROAD_INTERNAL_H */ diff --git a/src/road_map.h b/src/road_map.h index add991214e..02ec365125 100644 --- a/src/road_map.h +++ b/src/road_map.h @@ -8,7 +8,7 @@ #include "macros.h" #include "track_func.h" #include "rail_type.h" -#include "road.h" +#include "road_func.h" #include "tile.h" @@ -305,6 +305,16 @@ RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt); */ TrackBits GetAnyRoadTrackBits(TileIndex tile, RoadType rt); +/** + * Return if the tile is a valid tile for a crossing. + * + * @note function is overloaded + * @param tile the curent tile + * @param ax the axis of the road over the rail + * @return true if it is a valid tile + */ +bool IsPossibleCrossing(const TileIndex tile, Axis ax); + static inline void MakeRoadNormal(TileIndex t, RoadBits bits, RoadTypes rot, TownID town, Owner road, Owner tram, Owner hway) { diff --git a/src/road_type.h b/src/road_type.h new file mode 100644 index 0000000000..36c01eec6f --- /dev/null +++ b/src/road_type.h @@ -0,0 +1,59 @@ +/* $Id$ */ + +/** @file road.h Enums and other types related to roads. */ + +#ifndef ROAD_TYPE_H +#define ROAD_TYPE_H + +#include "core/enum_type.hpp" + +/** + * The different roadtypes we support + * + * @note currently only ROADTYPE_ROAD and ROADTYPE_TRAM are supported. + */ +enum RoadType { + ROADTYPE_ROAD = 0, ///< Basic road type + ROADTYPE_TRAM = 1, ///< Trams + ROADTYPE_HWAY = 2, ///< Only a placeholder. Not sure what we are going to do with this road type. + ROADTYPE_END, ///< Used for iterations + INVALID_ROADTYPE = 0xFF ///< flag for invalid roadtype +}; +DECLARE_POSTFIX_INCREMENT(RoadType); + +/** + * The different roadtypes we support, but then a bitmask of them + * @note currently only roadtypes with ROADTYPE_ROAD and ROADTYPE_TRAM are supported. + */ +enum RoadTypes { + ROADTYPES_NONE = 0, ///< No roadtypes + ROADTYPES_ROAD = 1 << ROADTYPE_ROAD, ///< Road + ROADTYPES_TRAM = 1 << ROADTYPE_TRAM, ///< Trams + ROADTYPES_HWAY = 1 << ROADTYPE_HWAY, ///< Highway (or whatever substitute) + ROADTYPES_ROADTRAM = ROADTYPES_ROAD | ROADTYPES_TRAM, ///< Road + trams + ROADTYPES_ROADHWAY = ROADTYPES_ROAD | ROADTYPES_HWAY, ///< Road + highway (or whatever substitute) + ROADTYPES_TRAMHWAY = ROADTYPES_TRAM | ROADTYPES_HWAY, ///< Trams + highway (or whatever substitute) + ROADTYPES_ALL = ROADTYPES_ROAD | ROADTYPES_TRAM | ROADTYPES_HWAY, ///< Road + trams + highway (or whatever substitute) +}; +DECLARE_ENUM_AS_BIT_SET(RoadTypes); + + +/** + * Enumeration for the road parts on a tile. + * + * This enumeration defines the possible road parts which + * can be build on a tile. + */ +enum RoadBits { + ROAD_NONE = 0U, ///< No road-part is build + ROAD_NW = 1U, ///< North-west part + ROAD_SW = 2U, ///< South-west part + ROAD_SE = 4U, ///< South-east part + ROAD_NE = 8U, ///< North-east part + ROAD_X = ROAD_SW | ROAD_NE, ///< Full road along the x-axis (south-west + north-east) + ROAD_Y = ROAD_NW | ROAD_SE, ///< Full road along the y-axis (north-west + south-east) + ROAD_ALL = ROAD_X | ROAD_Y ///< Full 4-way crossing +}; +DECLARE_ENUM_AS_BIT_SET(RoadBits); + +#endif /* ROAD_TYPE_H */ diff --git a/src/station.h b/src/station.h index b964f5f461..0969a52e4f 100644 --- a/src/station.h +++ b/src/station.h @@ -10,7 +10,7 @@ #include "oldpool.h" #include "sprite.h" #include "tile.h" -#include "road.h" +#include "road_type.h" #include "newgrf_station.h" #include "cargopacket.h" #include diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index d8555037f7..9d47cfb22c 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -39,7 +39,8 @@ #include "date.h" #include "helpers.hpp" #include "misc/autoptr.hpp" -#include "road.h" +#include "road_type.h" +#include "road_internal.h" /* For drawing catenary/checking road removal */ #include "cargotype.h" #include "strings.h" #include "autoslope.h" diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index e2eb215371..70368a59cd 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -8,6 +8,7 @@ #include "debug.h" #include "strings.h" #include "road_map.h" +#include "road_internal.h" /* Cleaning up road bits */ #include "table/strings.h" #include "table/sprites.h" #include "map.h" diff --git a/src/track_func.h b/src/track_func.h index 32a872b61b..813f211b19 100644 --- a/src/track_func.h +++ b/src/track_func.h @@ -494,4 +494,24 @@ static inline bool TracksOverlap(TrackBits bits) return bits != TRACK_BIT_HORZ && bits != TRACK_BIT_VERT; } +/** + * Checks whether the trackdir means that we are reversing. + * @param dir the trackdir to check + * @return true if it is a reversing road trackdir + */ +static inline bool IsReversingRoadTrackdir(Trackdir dir) +{ + return (dir & 0x07) >= 6; +} + +/** + * Checks whether the given trackdir is a straight road + * @param dir the trackdir to check + * @return true if it is a straight road trackdir + */ +static inline bool IsStraightRoadTrackdir(Trackdir dir) +{ + return (dir & 0x06) == 0; +} + #endif /* RAIL_H */ diff --git a/src/tunnel_map.h b/src/tunnel_map.h index 5226c1f90b..b14d8f0f82 100644 --- a/src/tunnel_map.h +++ b/src/tunnel_map.h @@ -8,8 +8,8 @@ #include "direction_func.h" #include "macros.h" #include "map.h" -#include "rail.h" -#include "road.h" +#include "rail_type.h" +#include "road_type.h" /** diff --git a/src/vehicle.h b/src/vehicle.h index ef27294b0b..0bc0fb0d97 100644 --- a/src/vehicle.h +++ b/src/vehicle.h @@ -7,8 +7,9 @@ #include "oldpool.h" #include "order.h" -#include "rail.h" -#include "road.h" +#include "track_type.h" +#include "rail_type.h" +#include "road_type.h" #include "cargopacket.h" #include "texteff.hpp" diff --git a/src/window.h b/src/window.h index 8765fb4287..403b2268ee 100644 --- a/src/window.h +++ b/src/window.h @@ -8,8 +8,8 @@ #include "macros.h" #include "string.h" #include "order.h" -#include "rail.h" -#include "road.h" +#include "rail_type.h" +#include "road_type.h" #include "airport.h" #include "vehicle.h" #include "viewport.h"