(svn r11209) -Codechange: remove some magic numbers and bit magic with appropriate enums and functions. Patch by frosch.

pull/155/head
rubidium 17 years ago
parent 0827b314f9
commit c4edf5c6ce

@ -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)) {

@ -40,6 +40,16 @@ enum Slope {
SLOPE_STEEP_N = SLOPE_STEEP | SLOPE_ENW ///< a steep slope falling to south (from north)
};
/**
* Enumeration of tile corners
*/
enum Corner {
CORNER_W = 0,
CORNER_S = 1,
CORNER_E = 2,
CORNER_N = 3,
};
/**
* Checks if a slope is steep.
*
@ -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.

Loading…
Cancel
Save