mirror of https://github.com/OpenTTD/OpenTTD
(svn r11209) -Codechange: remove some magic numbers and bit magic with appropriate enums and functions. Patch by frosch.
parent
e237ac3ff3
commit
f4721fed87
|
@ -77,23 +77,23 @@ uint ApplyFoundationToSlope(Foundation f, Slope *s)
|
||||||
}
|
}
|
||||||
|
|
||||||
uint dz = IsSteepSlope(*s) ? TILE_HEIGHT : 0;
|
uint dz = IsSteepSlope(*s) ? TILE_HEIGHT : 0;
|
||||||
byte highest_corner = GetHighestSlopeCorner(*s);
|
Corner highest_corner = GetHighestSlopeCorner(*s);
|
||||||
|
|
||||||
switch (f) {
|
switch (f) {
|
||||||
case FOUNDATION_INCLINED_X:
|
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;
|
break;
|
||||||
|
|
||||||
case FOUNDATION_INCLINED_Y:
|
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;
|
break;
|
||||||
|
|
||||||
case FOUNDATION_STEEP_LOWER:
|
case FOUNDATION_STEEP_LOWER:
|
||||||
*s = (Slope) (1 << highest_corner);
|
*s = SlopeWithOneCornerRaised(highest_corner);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FOUNDATION_STEEP_HIGHER:
|
case FOUNDATION_STEEP_HIGHER:
|
||||||
*s = (Slope) (*s & ~SLOPE_STEEP);
|
*s = SlopeWithThreeCornersRaised(OppositeCorner(highest_corner));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: NOT_REACHED();
|
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
|
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);
|
ti->z += ApplyFoundationToSlope(f, &ti->tileh);
|
||||||
|
|
||||||
if (IsInclinedFoundation(f)) {
|
if (IsInclinedFoundation(f)) {
|
||||||
|
|
56
src/slope.h
56
src/slope.h
|
@ -40,6 +40,16 @@ enum Slope {
|
||||||
SLOPE_STEEP_N = SLOPE_STEEP | SLOPE_ENW ///< a steep slope falling to south (from north)
|
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.
|
* 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.
|
* @pre The slope must be a slope with one corner raised or a steep slope.
|
||||||
* @param s The #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) {
|
switch (s) {
|
||||||
case SLOPE_W:
|
case SLOPE_W:
|
||||||
case SLOPE_STEEP_W: return 0;
|
case SLOPE_STEEP_W: return CORNER_W;
|
||||||
case SLOPE_S:
|
case SLOPE_S:
|
||||||
case SLOPE_STEEP_S: return 1;
|
case SLOPE_STEEP_S: return CORNER_S;
|
||||||
case SLOPE_E:
|
case SLOPE_E:
|
||||||
case SLOPE_STEEP_E: return 2;
|
case SLOPE_STEEP_E: return CORNER_E;
|
||||||
case SLOPE_N:
|
case SLOPE_N:
|
||||||
case SLOPE_STEEP_N: return 3;
|
case SLOPE_STEEP_N: return CORNER_N;
|
||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -103,6 +113,40 @@ static inline uint GetSlopeMaxZ(Slope s)
|
||||||
return TILE_HEIGHT;
|
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.
|
* Enumeration for Foundations.
|
||||||
|
|
Loading…
Reference in New Issue