summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/landscape.cpp12
-rw-r--r--src/slope.h56
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.