diff options
-rw-r--r-- | src/landscape.cpp | 12 | ||||
-rw-r--r-- | src/slope.h | 56 |
2 files changed, 56 insertions, 12 deletions
diff --git a/src/landscape.cpp b/src/landscape.cpp index fa21d667c..0e61d5010 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -77,23 +77,23 @@ uint ApplyFoundationToSlope(Foundation f, Slope *s) } uint dz = IsSteepSlope(*s) ? TILE_HEIGHT : 0; - byte highest_corner = GetHighestSlopeCorner(*s); + Corner highest_corner = GetHighestSlopeCorner(*s); switch (f) { case FOUNDATION_INCLINED_X: - *s = (highest_corner <= 1 ? SLOPE_SW : SLOPE_NE); + *s = (((highest_corner == CORNER_W) || (highest_corner == CORNER_S)) ? SLOPE_SW : SLOPE_NE); break; case FOUNDATION_INCLINED_Y: - *s = (((highest_corner == 1) || (highest_corner == 2)) ? SLOPE_SE : SLOPE_NW); + *s = (((highest_corner == CORNER_S) || (highest_corner == CORNER_E)) ? SLOPE_SE : SLOPE_NW); break; case FOUNDATION_STEEP_LOWER: - *s = (Slope) (1 << highest_corner); + *s = SlopeWithOneCornerRaised(highest_corner); break; case FOUNDATION_STEEP_HIGHER: - *s = (Slope) (*s & ~SLOPE_STEEP); + *s = SlopeWithThreeCornersRaised(OppositeCorner(highest_corner)); break; default: NOT_REACHED(); @@ -271,7 +271,7 @@ void DrawFoundation(TileInfo *ti, Foundation f) lower_base + (ti->tileh & ~SLOPE_STEEP), PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z ); - byte highest_corner = GetHighestSlopeCorner(ti->tileh); + Corner highest_corner = GetHighestSlopeCorner(ti->tileh); ti->z += ApplyFoundationToSlope(f, &ti->tileh); if (IsInclinedFoundation(f)) { diff --git a/src/slope.h b/src/slope.h index dd04c24be..db8b17a12 100644 --- a/src/slope.h +++ b/src/slope.h @@ -41,6 +41,16 @@ enum Slope { }; /** + * Enumeration of tile corners + */ +enum Corner { + CORNER_W = 0, + CORNER_S = 1, + CORNER_E = 2, + CORNER_N = 3, +}; + +/** * Checks if a slope is steep. * * @param s The given #Slope. @@ -73,19 +83,19 @@ static inline Slope ComplementSlope(Slope s) * * @pre The slope must be a slope with one corner raised or a steep slope. * @param s The #Slope. - * @return Number of the highest corner. (0 west, 1 south, 2 east, 3 north) + * @return Highest corner. */ -static inline byte GetHighestSlopeCorner(Slope s) +static inline Corner GetHighestSlopeCorner(Slope s) { switch (s) { case SLOPE_W: - case SLOPE_STEEP_W: return 0; + case SLOPE_STEEP_W: return CORNER_W; case SLOPE_S: - case SLOPE_STEEP_S: return 1; + case SLOPE_STEEP_S: return CORNER_S; case SLOPE_E: - case SLOPE_STEEP_E: return 2; + case SLOPE_STEEP_E: return CORNER_E; case SLOPE_N: - case SLOPE_STEEP_N: return 3; + case SLOPE_STEEP_N: return CORNER_N; default: NOT_REACHED(); } } @@ -103,6 +113,40 @@ static inline uint GetSlopeMaxZ(Slope s) return TILE_HEIGHT; } +/** + * Returns the opposite corner. + * + * @param corner A #Corner. + * @return The opposite corner to "corner". + */ +static inline Corner OppositeCorner(Corner corner) +{ + return (Corner)(corner ^ 2); +} + +/** + * Returns the slope with a specific corner raised. + * + * @param corner The #Corner. + * @return The #Slope with corner "corner" raised. + */ +static inline Slope SlopeWithOneCornerRaised(Corner corner) +{ + assert(IS_INT_INSIDE(corner, 0, 4)); + return (Slope)(1 << corner); +} + +/** + * Returns the slope with all except one corner raised. + * + * @param corner The #Corner. + * @return The #Slope with all corners but "corner" raised. + */ +static inline Slope SlopeWithThreeCornersRaised(Corner corner) +{ + return ComplementSlope(SlopeWithOneCornerRaised(corner)); +} + /** * Enumeration for Foundations. |