(svn r11209) -Codechange: remove some magic numbers and bit magic with appropriate enums and functions. Patch by frosch.
authorrubidium
Fri, 05 Oct 2007 19:36:13 +0000
changeset 8174 5343705d60f5
parent 8173 a631134b69e5
child 8175 d67b421799bc
(svn r11209) -Codechange: remove some magic numbers and bit magic with appropriate enums and functions. Patch by frosch.
src/landscape.cpp
src/slope.h
--- a/src/landscape.cpp	Fri Oct 05 17:55:12 2007 +0000
+++ b/src/landscape.cpp	Fri Oct 05 19:36:13 2007 +0000
@@ -77,23 +77,23 @@
 	}
 
 	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 @@
 			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)) {
--- a/src/slope.h	Fri Oct 05 17:55:12 2007 +0000
+++ b/src/slope.h	Fri Oct 05 19:36:13 2007 +0000
@@ -41,6 +41,16 @@
 };
 
 /**
+ * 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 @@
  *
  * @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 @@
 	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.