(svn r16086) -Codechange: magic numbers substitutes by enums and some type safety

replace/41b28d7194a279bdc17475d4fbe2ea6ec885a466
rubidium 15 years ago
parent 25cdef9523
commit b66783afab

@ -8,9 +8,10 @@
#include "core/enum_type.hpp"
enum {
TILE_SIZE = 16, ///< Tiles are 16x16 "units" in size
TILE_PIXELS = 32, ///< a tile is 32x32 pixels
TILE_HEIGHT = 8, ///< The standard height-difference between tiles on two levels is 8 (z-diff 8)
TILE_SIZE = 16, ///< Tiles are 16x16 "units" in size
TILE_UNIT_MASK = TILE_SIZE - 1, ///< for masking in/out the inner-tile units.
TILE_PIXELS = 32, ///< a tile is 32x32 pixels
TILE_HEIGHT = 8, ///< The standard height-difference between tiles on two levels is 8 (z-diff 8)
MAX_TILE_HEIGHT = 15, ///< Maximum allowed tile height
MAX_SNOWLINE_HEIGHT = (MAX_TILE_HEIGHT - 2), ///< Maximum allowed snowline height

@ -39,6 +39,7 @@ enum HighLightStyle {
HT_DIR_HL = 3, ///< horizontal lower
HT_DIR_VL = 4, ///< vertical left
HT_DIR_VR = 5, ///< vertical right
HT_DIR_END, ///< end marker
HT_DIR_MASK = 0x7 ///< masks the drag-direction
};
DECLARE_ENUM_AS_BIT_SET(HighLightStyle);
@ -59,9 +60,9 @@ struct TileHighlightData {
byte dirty;
byte sizelimit;
byte drawstyle; // lower bits 0-3 are reserved for detailed highlight information information
byte new_drawstyle; // only used in UpdateTileSelection() to as a buffer to compare if there was a change between old and new
byte next_drawstyle; // queued, but not yet drawn style
HighLightStyle drawstyle; // lower bits 0-3 are reserved for detailed highlight information information
HighLightStyle new_drawstyle; // only used in UpdateTileSelection() to as a buffer to compare if there was a change between old and new
HighLightStyle next_drawstyle; // queued, but not yet drawn style
ViewportHighlightMode place_mode;
bool make_square_red;

@ -902,15 +902,15 @@ static void DrawTileSelection(const TileInfo *ti)
DrawSelectionSprite(_cur_dpi->zoom <= ZOOM_LVL_DETAIL ? SPR_DOT : SPR_DOT_SMALL, PAL_NONE, ti, z, foundation_part);
} else if (_thd.drawstyle & HT_RAIL /* && _thd.place_mode == VHM_RAIL*/) {
/* autorail highlight piece under cursor */
uint type = _thd.drawstyle & 0xF;
assert(type <= 5);
HighLightStyle type = _thd.drawstyle & HT_DIR_MASK;
assert(type < HT_DIR_END);
DrawAutorailSelection(ti, _autorail_type[type][0]);
} else if (IsPartOfAutoLine(ti->x, ti->y)) {
/* autorail highlighting long line */
int dir = _thd.drawstyle & ~0xF0;
HighLightStyle dir = _thd.drawstyle & HT_DIR_MASK;
uint side;
if (dir < 2) {
if (dir == HT_DIR_X || dir == HT_DIR_Y) {
side = 0;
} else {
TileIndex start = TileVirtXY(_thd.selstart.x, _thd.selstart.y);
@ -942,8 +942,8 @@ static void ViewportAddLandscape()
_cur_ti = &ti;
/* Transform into tile coordinates and round to closest full tile */
x = ((_vd.dpi.top >> 1) - (_vd.dpi.left >> 2)) & ~0xF;
y = ((_vd.dpi.top >> 1) + (_vd.dpi.left >> 2) - 0x10) & ~0xF;
x = ((_vd.dpi.top >> 1) - (_vd.dpi.left >> 2)) & ~TILE_UNIT_MASK;
y = ((_vd.dpi.top >> 1) + (_vd.dpi.left >> 2) - TILE_SIZE) & ~TILE_UNIT_MASK;
/* determine size of area */
{
@ -2065,8 +2065,8 @@ void PlaceObject()
pt.y += 8;
}
_tile_fract_coords.x = pt.x & 0xF;
_tile_fract_coords.y = pt.y & 0xF;
_tile_fract_coords.x = pt.x & TILE_UNIT_MASK;
_tile_fract_coords.y = pt.y & TILE_UNIT_MASK;
w = GetCallbackWnd();
if (w != NULL) w->OnPlaceObject(pt, TileVirtXY(pt.x, pt.y));
@ -2132,7 +2132,7 @@ void SetTileSelectBigSize(int ox, int oy, int sx, int sy)
/** returns the best autorail highlight type from map coordinates */
static HighLightStyle GetAutorailHT(int x, int y)
{
return HT_RAIL | _autorail_piece[x & 0xF][y & 0xF];
return HT_RAIL | _autorail_piece[x & TILE_UNIT_MASK][y & TILE_UNIT_MASK];
}
/**
@ -2147,16 +2147,16 @@ void UpdateTileSelection()
int x1;
int y1;
_thd.new_drawstyle = 0;
_thd.new_drawstyle = HT_NONE;
if (_thd.place_mode == VHM_SPECIAL) {
x1 = _thd.selend.x;
y1 = _thd.selend.y;
if (x1 != -1) {
int x2 = _thd.selstart.x & ~0xF;
int y2 = _thd.selstart.y & ~0xF;
x1 &= ~0xF;
y1 &= ~0xF;
int x2 = _thd.selstart.x & ~TILE_UNIT_MASK;
int y2 = _thd.selstart.y & ~TILE_UNIT_MASK;
x1 &= ~TILE_UNIT_MASK;
y1 &= ~TILE_UNIT_MASK;
if (x1 >= x2) Swap(x1, x2);
if (y1 >= y2) Swap(y1, y2);
@ -2177,8 +2177,8 @@ void UpdateTileSelection()
break;
case VHM_POINT:
_thd.new_drawstyle = HT_POINT;
x1 += 8;
y1 += 8;
x1 += TILE_SIZE / 2;
y1 += TILE_SIZE / 2;
break;
case VHM_RAIL:
_thd.new_drawstyle = GetAutorailHT(pt.x, pt.y); // draw one highlighted tile
@ -2187,8 +2187,8 @@ void UpdateTileSelection()
NOT_REACHED();
break;
}
_thd.new_pos.x = x1 & ~0xF;
_thd.new_pos.y = y1 & ~0xF;
_thd.new_pos.x = x1 & ~TILE_UNIT_MASK;
_thd.new_pos.y = y1 & ~TILE_UNIT_MASK;
}
}
@ -2290,30 +2290,30 @@ static void VpStartPreSizing()
static HighLightStyle Check2x1AutoRail(int mode)
{
int fxpy = _tile_fract_coords.x + _tile_fract_coords.y;
int sxpy = (_thd.selend.x & 0xF) + (_thd.selend.y & 0xF);
int sxpy = (_thd.selend.x & TILE_UNIT_MASK) + (_thd.selend.y & TILE_UNIT_MASK);
int fxmy = _tile_fract_coords.x - _tile_fract_coords.y;
int sxmy = (_thd.selend.x & 0xF) - (_thd.selend.y & 0xF);
int sxmy = (_thd.selend.x & TILE_UNIT_MASK) - (_thd.selend.y & TILE_UNIT_MASK);
switch (mode) {
default: NOT_REACHED();
case 0: // end piece is lower right
if (fxpy >= 20 && sxpy <= 12) { /*SwapSelection(); DoRailroadTrack(0); */return HT_DIR_HL; }
if (fxmy < -3 && sxmy > 3) {/* DoRailroadTrack(0); */return HT_DIR_VR; }
if (fxpy >= 20 && sxpy <= 12) return HT_DIR_HL;
if (fxmy < -3 && sxmy > 3) return HT_DIR_VR;
return HT_DIR_Y;
case 1:
if (fxmy > 3 && sxmy < -3) { /*SwapSelection(); DoRailroadTrack(0); */return HT_DIR_VL; }
if (fxpy <= 12 && sxpy >= 20) { /*DoRailroadTrack(0); */return HT_DIR_HU; }
if (fxmy > 3 && sxmy < -3) return HT_DIR_VL;
if (fxpy <= 12 && sxpy >= 20) return HT_DIR_HU;
return HT_DIR_Y;
case 2:
if (fxmy > 3 && sxmy < -3) { /*DoRailroadTrack(3);*/ return HT_DIR_VL; }
if (fxpy >= 20 && sxpy <= 12) { /*SwapSelection(); DoRailroadTrack(0); */return HT_DIR_HL; }
if (fxmy > 3 && sxmy < -3) return HT_DIR_VL;
if (fxpy >= 20 && sxpy <= 12) return HT_DIR_HL;
return HT_DIR_X;
case 3:
if (fxmy < -3 && sxmy > 3) { /*SwapSelection(); DoRailroadTrack(3);*/ return HT_DIR_VR; }
if (fxpy <= 12 && sxpy >= 20) { /*DoRailroadTrack(0); */return HT_DIR_HU; }
if (fxmy < -3 && sxmy > 3) return HT_DIR_VR;
if (fxpy <= 12 && sxpy >= 20) return HT_DIR_HU;
return HT_DIR_X;
}
}
@ -2440,12 +2440,11 @@ static const StringID measure_strings_length[] = {STR_NULL, STR_MEASURE_LENGTH,
static void CalcRaildirsDrawstyle(TileHighlightData *thd, int x, int y, int method)
{
HighLightStyle b;
uint w, h;
int dx = thd->selstart.x - (thd->selend.x & ~0xF);
int dy = thd->selstart.y - (thd->selend.y & ~0xF);
w = abs(dx) + 16;
h = abs(dy) + 16;
int dx = thd->selstart.x - (thd->selend.x & ~TILE_UNIT_MASK);
int dy = thd->selstart.y - (thd->selend.y & ~TILE_UNIT_MASK);
uint w = abs(dx) + TILE_SIZE;
uint h = abs(dy) + TILE_SIZE;
if (TileVirtXY(thd->selstart.x, thd->selstart.y) == TileVirtXY(x, y)) { // check if we're only within one tile
if (method == VPM_RAILDIRS) {
@ -2453,19 +2452,19 @@ static void CalcRaildirsDrawstyle(TileHighlightData *thd, int x, int y, int meth
} else { // rect for autosignals on one tile
b = HT_RECT;
}
} else if (h == 16) { // Is this in X direction?
if (dx == 16) { // 2x1 special handling
} else if (h == TILE_SIZE) { // Is this in X direction?
if (dx == TILE_SIZE) { // 2x1 special handling
b = (Check2x1AutoRail(3)) | HT_LINE;
} else if (dx == -16) {
} else if (dx == -TILE_SIZE) {
b = (Check2x1AutoRail(2)) | HT_LINE;
} else {
b = HT_LINE | HT_DIR_X;
}
y = thd->selstart.y;
} else if (w == 16) { // Or Y direction?
if (dy == 16) { // 2x1 special handling
} else if (w == TILE_SIZE) { // Or Y direction?
if (dy == TILE_SIZE) { // 2x1 special handling
b = (Check2x1AutoRail(1)) | HT_LINE;
} else if (dy == -16) { // 2x1 other direction
} else if (dy == -TILE_SIZE) { // 2x1 other direction
b = (Check2x1AutoRail(0)) | HT_LINE;
} else {
b = HT_LINE | HT_DIR_Y;
@ -2479,27 +2478,26 @@ static void CalcRaildirsDrawstyle(TileHighlightData *thd, int x, int y, int meth
x = thd->selstart.x;
} else { // complicated direction
int d = w - h;
thd->selend.x = thd->selend.x & ~0xF;
thd->selend.y = thd->selend.y & ~0xF;
thd->selend.x = thd->selend.x & ~TILE_UNIT_MASK;
thd->selend.y = thd->selend.y & ~TILE_UNIT_MASK;
/* four cases. */
if (x > thd->selstart.x) {
if (y > thd->selstart.y) {
/* south */
if (d == 0) {
b = (x & 0xF) > (y & 0xF) ? HT_LINE | HT_DIR_VL : HT_LINE | HT_DIR_VR;
b = (x & TILE_UNIT_MASK) > (y & TILE_UNIT_MASK) ? HT_LINE | HT_DIR_VL : HT_LINE | HT_DIR_VR;
} else if (d >= 0) {
x = thd->selstart.x + h;
b = HT_LINE | HT_DIR_VL;
// return px == py || px == py + 16;
} else {
y = thd->selstart.y + w;
b = HT_LINE | HT_DIR_VR;
} // return px == py || px == py - 16;
}
} else {
/* west */
if (d == 0) {
b = (x & 0xF) + (y & 0xF) >= 0x10 ? HT_LINE | HT_DIR_HL : HT_LINE | HT_DIR_HU;
b = (x & TILE_UNIT_MASK) + (y & TILE_UNIT_MASK) >= TILE_SIZE ? HT_LINE | HT_DIR_HL : HT_LINE | HT_DIR_HU;
} else if (d >= 0) {
x = thd->selstart.x + h;
b = HT_LINE | HT_DIR_HL;
@ -2512,27 +2510,25 @@ static void CalcRaildirsDrawstyle(TileHighlightData *thd, int x, int y, int meth
if (y > thd->selstart.y) {
/* east */
if (d == 0) {
b = (x & 0xF) + (y & 0xF) >= 0x10 ? HT_LINE | HT_DIR_HL : HT_LINE | HT_DIR_HU;
b = (x & TILE_UNIT_MASK) + (y & TILE_UNIT_MASK) >= TILE_SIZE ? HT_LINE | HT_DIR_HL : HT_LINE | HT_DIR_HU;
} else if (d >= 0) {
x = thd->selstart.x - h;
b = HT_LINE | HT_DIR_HU;
// return px == -py || px == -py - 16;
} else {
y = thd->selstart.y + w;
b = HT_LINE | HT_DIR_HL;
} // return px == -py || px == -py + 16;
}
} else {
/* north */
if (d == 0) {
b = (x & 0xF) > (y & 0xF) ? HT_LINE | HT_DIR_VL : HT_LINE | HT_DIR_VR;
b = (x & TILE_UNIT_MASK) > (y & TILE_UNIT_MASK) ? HT_LINE | HT_DIR_VL : HT_LINE | HT_DIR_VR;
} else if (d >= 0) {
x = thd->selstart.x - h;
b = HT_LINE | HT_DIR_VR;
// return px == py || px == py - 16;
} else {
y = thd->selstart.y - w;
b = HT_LINE | HT_DIR_VL;
} // return px == py || px == py + 16;
}
}
}
}

Loading…
Cancel
Save