diff --git a/src/slope.h b/src/slope.h --- a/src/slope.h +++ b/src/slope.h @@ -16,7 +16,8 @@ enum Corner { CORNER_S = 1, CORNER_E = 2, CORNER_N = 3, - CORNER_END + CORNER_END, + CORNER_INVALID = 0xFF }; /** @@ -234,8 +235,20 @@ enum Foundation { FOUNDATION_LEVELED, ///< The tile is leveled up to a flat slope. FOUNDATION_INCLINED_X, ///< The tile has an along X-axis inclined foundation. FOUNDATION_INCLINED_Y, ///< The tile has an along Y-axis inclined foundation. - FOUNDATION_STEEP_LOWER, ///< The tile has a steep slope. The lowerst corner is raised by a foundation to allow building railroad on the lower halftile. - FOUNDATION_STEEP_HIGHER, ///< The tile has a steep slope. Three corners are raised by a foundation to allow building railroad on the higher halftile. + FOUNDATION_STEEP_LOWER, ///< The tile has a steep slope. The lowest corner is raised by a foundation to allow building railroad on the lower halftile. + +/* Halftile foundations */ + FOUNDATION_STEEP_BOTH, ///< The tile has a steep slope. The lowest corner is raised by a foundation and the upper halftile is leveled. + FOUNDATION_HALFTILE_W, ///< Level west halftile non-continuously. + FOUNDATION_HALFTILE_S, ///< Level south halftile non-continuously. + FOUNDATION_HALFTILE_E, ///< Level east halftile non-continuously. + FOUNDATION_HALFTILE_N, ///< Level north halftile non-continuously. + +/* Special anti-zig-zag foundations for single horizontal/vertical track */ + FOUNDATION_RAIL_W, ///< Foundation for TRACK_BIT_LEFT, but not a leveled foundation. + FOUNDATION_RAIL_S, ///< Foundation for TRACK_BIT_LOWER, but not a leveled foundation. + FOUNDATION_RAIL_E, ///< Foundation for TRACK_BIT_RIGHT, but not a leveled foundation. + FOUNDATION_RAIL_N, ///< Foundation for TRACK_BIT_UPPER, but not a leveled foundation. FOUNDATION_INVALID = 0xFF ///< Used inside "rail_cmd.cpp" to indicate invalid slope/track combination. }; @@ -274,6 +287,54 @@ static inline bool IsInclinedFoundation( } /** + * Tests if a foundation is a non-continuous foundation, i.e. halftile-foundation or FOUNDATION_STEEP_BOTH. + * + * @param f The #Foundation. + * @return true iff f is a non-continuous foundation + */ +static inline bool IsNonContinuousFoundation(Foundation f) +{ + return IS_INT_INSIDE(f, FOUNDATION_STEEP_BOTH, FOUNDATION_HALFTILE_N + 1); +} + +/** + * Returns the halftile corner of a halftile-foundation + * + * @pre f != FOUNDATION_STEEP_BOTH + * + * @param f The #Foundation. + * @return The #Corner with track. + */ +static inline Corner GetHalftileFoundationCorner(Foundation f) +{ + assert(IS_INT_INSIDE(f, FOUNDATION_HALFTILE_W, FOUNDATION_HALFTILE_N + 1)); + return (Corner)(f - FOUNDATION_HALFTILE_W); +} + +/** + * Tests if a foundation is a special rail foundation for single horizontal/vertical track. + * + * @param f The #Foundation. + * @return true iff f is a special rail foundation for single horizontal/vertical track. + */ +static inline bool IsSpecialRailFoundation(Foundation f) +{ + return IS_INT_INSIDE(f, FOUNDATION_RAIL_W, FOUNDATION_RAIL_N + 1); +} + +/** + * Returns the track corner of a special rail foundation + * + * @param f The #Foundation. + * @return The #Corner with track. + */ +static inline Corner GetRailFoundationCorner(Foundation f) +{ + assert(IsSpecialRailFoundation(f)); + return (Corner)(f - FOUNDATION_RAIL_W); +} + +/** * Returns the foundation needed to flatten a slope. * The returned foundation is either FOUNDATION_NONE if the tile was already flat, or FOUNDATION_LEVELED. * @@ -298,4 +359,28 @@ static inline Foundation InclinedFoundat return (axis == AXIS_X ? FOUNDATION_INCLINED_X : FOUNDATION_INCLINED_Y); } +/** + * Returns the halftile foundation for single horizontal/vertical track. + * + * @param corner The #Corner with the track. + * @return The wanted #Foundation. + */ +static inline Foundation HalftileFoundation(Corner corner) +{ + assert(IsValidCorner(corner)); + return (Foundation)(FOUNDATION_HALFTILE_W + corner); +} + +/** + * Returns the special rail foundation for single horizontal/vertical track. + * + * @param corner The #Corner with the track. + * @return The wanted #Foundation. + */ +static inline Foundation SpecialRailFoundation(Corner corner) +{ + assert(IsValidCorner(corner)); + return (Foundation)(FOUNDATION_RAIL_W + corner); +} + #endif /* SLOPE_H */