summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tile_type.h7
-rw-r--r--src/tilehighlight_type.h7
-rw-r--r--src/viewport.cpp98
3 files changed, 55 insertions, 57 deletions
diff --git a/src/tile_type.h b/src/tile_type.h
index 229dcee15..409fdf5a3 100644
--- a/src/tile_type.h
+++ b/src/tile_type.h
@@ -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
diff --git a/src/tilehighlight_type.h b/src/tilehighlight_type.h
index 1ad04d9ea..934aaa13a 100644
--- a/src/tilehighlight_type.h
+++ b/src/tilehighlight_type.h
@@ -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;
diff --git a/src/viewport.cpp b/src/viewport.cpp
index aa4764929..87a417c1d 100644
--- a/src/viewport.cpp
+++ b/src/viewport.cpp
@@ -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;
+ }
}
}
}