|
@@ -1090,33 +1090,40 @@ static void ViewportAddTownNames(DrawPix
|
|
|
}
|
|
|
|
|
|
|
|
|
static void AddStation(const Station *st, StringID str, uint16 width)
|
|
|
static void AddStation(const BaseStation *st, bool tiny, uint16 width)
|
|
|
{
|
|
|
/* Check whether the base station is a station or a waypoint */
|
|
|
bool is_station = Station::IsExpected(st);
|
|
|
|
|
|
/* Don't draw if the display options are disabled */
|
|
|
if (!HasBit(_display_opt, is_station ? DO_SHOW_STATION_NAMES : DO_SHOW_WAYPOINT_NAMES)) return;
|
|
|
|
|
|
StringID str = (is_station ? STR_STATION_SIGN : STR_WAYPOINT_VIEWPORT) + tiny;
|
|
|
|
|
|
AddStringToDraw(st->sign.left + 1, st->sign.top + 1, str, st->index, st->facilities, (st->owner == OWNER_NONE || !st->IsInUse()) ? 0xE : _company_colours[st->owner], width);
|
|
|
}
|
|
|
|
|
|
|
|
|
static void ViewportAddStationNames(DrawPixelInfo *dpi)
|
|
|
{
|
|
|
int left, top, right, bottom;
|
|
|
const Station *st;
|
|
|
|
|
|
if (!HasBit(_display_opt, DO_SHOW_STATION_NAMES) || _game_mode == GM_MENU)
|
|
|
if (!(HasBit(_display_opt, DO_SHOW_STATION_NAMES) || HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES)) || _game_mode == GM_MENU) {
|
|
|
return;
|
|
|
|
|
|
left = dpi->left;
|
|
|
top = dpi->top;
|
|
|
right = left + dpi->width;
|
|
|
bottom = top + dpi->height;
|
|
|
}
|
|
|
|
|
|
int left = dpi->left;
|
|
|
int top = dpi->top;
|
|
|
int right = left + dpi->width;
|
|
|
int bottom = top + dpi->height;
|
|
|
const BaseStation *st;
|
|
|
|
|
|
switch (dpi->zoom) {
|
|
|
case ZOOM_LVL_NORMAL:
|
|
|
FOR_ALL_STATIONS(st) {
|
|
|
FOR_ALL_BASE_STATIONS(st) {
|
|
|
if (bottom > st->sign.top &&
|
|
|
top < st->sign.top + 12 &&
|
|
|
right > st->sign.left &&
|
|
|
left < st->sign.left + st->sign.width_normal) {
|
|
|
AddStation(st, STR_STATION_SIGN, st->sign.width_normal);
|
|
|
AddStation(st, false, st->sign.width_normal);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -1124,12 +1131,12 @@ static void ViewportAddStationNames(Draw
|
|
|
case ZOOM_LVL_OUT_2X:
|
|
|
right += 2;
|
|
|
bottom += 2;
|
|
|
FOR_ALL_STATIONS(st) {
|
|
|
FOR_ALL_BASE_STATIONS(st) {
|
|
|
if (bottom > st->sign.top &&
|
|
|
top < st->sign.top + 24 &&
|
|
|
right > st->sign.left &&
|
|
|
left < st->sign.left + st->sign.width_normal * 2) {
|
|
|
AddStation(st, STR_STATION_SIGN, st->sign.width_normal);
|
|
|
AddStation(st, false, st->sign.width_normal);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -1139,12 +1146,12 @@ static void ViewportAddStationNames(Draw
|
|
|
right += ScaleByZoom(1, dpi->zoom);
|
|
|
bottom += ScaleByZoom(1, dpi->zoom) + 1;
|
|
|
|
|
|
FOR_ALL_STATIONS(st) {
|
|
|
FOR_ALL_BASE_STATIONS(st) {
|
|
|
if (bottom > st->sign.top &&
|
|
|
top < st->sign.top + ScaleByZoom(12, dpi->zoom) &&
|
|
|
right > st->sign.left &&
|
|
|
left < st->sign.left + ScaleByZoom(st->sign.width_small, dpi->zoom)) {
|
|
|
AddStation(st, STR_STATION_SIGN_TINY, st->sign.width_small | 0x8000);
|
|
|
AddStation(st, true, st->sign.width_small | 0x8000);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -1217,70 +1224,6 @@ static void ViewportAddSigns(DrawPixelIn
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
static void AddWaypoint(const Waypoint *wp, StringID str, uint16 width)
|
|
|
{
|
|
|
AddStringToDraw(wp->sign.left + 1, wp->sign.top + 1, str, wp->index, 0, (wp->owner == OWNER_NONE || !wp->IsInUse()) ? 0xE : _company_colours[wp->owner], width);
|
|
|
}
|
|
|
|
|
|
|
|
|
static void ViewportAddWaypoints(DrawPixelInfo *dpi)
|
|
|
{
|
|
|
const Waypoint *wp;
|
|
|
int left, top, right, bottom;
|
|
|
|
|
|
if (!HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES))
|
|
|
return;
|
|
|
|
|
|
left = dpi->left;
|
|
|
top = dpi->top;
|
|
|
right = left + dpi->width;
|
|
|
bottom = top + dpi->height;
|
|
|
|
|
|
switch (dpi->zoom) {
|
|
|
case ZOOM_LVL_NORMAL:
|
|
|
FOR_ALL_WAYPOINTS(wp) {
|
|
|
if (bottom > wp->sign.top &&
|
|
|
top < wp->sign.top + 12 &&
|
|
|
right > wp->sign.left &&
|
|
|
left < wp->sign.left + wp->sign.width_normal) {
|
|
|
AddWaypoint(wp, STR_WAYPOINT_VIEWPORT, wp->sign.width_normal);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case ZOOM_LVL_OUT_2X:
|
|
|
right += 2;
|
|
|
bottom += 2;
|
|
|
FOR_ALL_WAYPOINTS(wp) {
|
|
|
if (bottom > wp->sign.top &&
|
|
|
top < wp->sign.top + 24 &&
|
|
|
right > wp->sign.left &&
|
|
|
left < wp->sign.left + wp->sign.width_normal * 2) {
|
|
|
AddWaypoint(wp, STR_WAYPOINT_VIEWPORT, wp->sign.width_normal);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case ZOOM_LVL_OUT_4X:
|
|
|
case ZOOM_LVL_OUT_8X:
|
|
|
right += ScaleByZoom(1, dpi->zoom);
|
|
|
bottom += ScaleByZoom(1, dpi->zoom) + 1;
|
|
|
|
|
|
FOR_ALL_WAYPOINTS(wp) {
|
|
|
if (bottom > wp->sign.top &&
|
|
|
top < wp->sign.top + ScaleByZoom(12, dpi->zoom) &&
|
|
|
right > wp->sign.left &&
|
|
|
left < wp->sign.left + ScaleByZoom(wp->sign.width_small, dpi->zoom)) {
|
|
|
AddWaypoint(wp, STR_WAYPOINT_VIEWPORT_TINY, wp->sign.width_small | 0x8000);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
default: NOT_REACHED();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Update the position of the viewport sign.
|
|
|
* @param center the (preferred) center of the viewport sign
|
|
@@ -1528,7 +1471,6 @@ void ViewportDoDraw(const ViewPort *vp,
|
|
|
ViewportAddTownNames(&_vd.dpi);
|
|
|
ViewportAddStationNames(&_vd.dpi);
|
|
|
ViewportAddSigns(&_vd.dpi);
|
|
|
ViewportAddWaypoints(&_vd.dpi);
|
|
|
|
|
|
DrawTextEffects(&_vd.dpi);
|
|
|
|
|
@@ -1894,24 +1836,42 @@ static bool CheckClickOnTown(const ViewP
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
static bool ClickOnStation(const BaseStation *st)
|
|
|
{
|
|
|
/* Check whether the base station is a station or a waypoint */
|
|
|
bool is_station = Station::IsExpected(st);
|
|
|
|
|
|
/* Don't draw if the display options are disabled */
|
|
|
if (!HasBit(_display_opt, is_station ? DO_SHOW_STATION_NAMES : DO_SHOW_WAYPOINT_NAMES)) return false;
|
|
|
|
|
|
if (is_station) {
|
|
|
ShowStationViewWindow(st->index);
|
|
|
} else {
|
|
|
ShowWaypointWindow(Waypoint::From(st));
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
static bool CheckClickOnStation(const ViewPort *vp, int x, int y)
|
|
|
{
|
|
|
const Station *st;
|
|
|
|
|
|
if (!HasBit(_display_opt, DO_SHOW_STATION_NAMES) || IsInvisibilitySet(TO_SIGNS)) return false;
|
|
|
if (!(HasBit(_display_opt, DO_SHOW_STATION_NAMES) || HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES)) || IsInvisibilitySet(TO_SIGNS)) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
const BaseStation *st;
|
|
|
bool ret = false;
|
|
|
|
|
|
switch (vp->zoom) {
|
|
|
case ZOOM_LVL_NORMAL:
|
|
|
x = x - vp->left + vp->virtual_left;
|
|
|
y = y - vp->top + vp->virtual_top;
|
|
|
FOR_ALL_STATIONS(st) {
|
|
|
FOR_ALL_BASE_STATIONS(st) {
|
|
|
if (y >= st->sign.top &&
|
|
|
y < st->sign.top + 12 &&
|
|
|
x >= st->sign.left &&
|
|
|
x < st->sign.left + st->sign.width_normal) {
|
|
|
ShowStationViewWindow(st->index);
|
|
|
return true;
|
|
|
ret = ClickOnStation(st);
|
|
|
if (ret) break;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -1919,13 +1879,13 @@ static bool CheckClickOnStation(const Vi
|
|
|
case ZOOM_LVL_OUT_2X:
|
|
|
x = (x - vp->left + 1) * 2 + vp->virtual_left;
|
|
|
y = (y - vp->top + 1) * 2 + vp->virtual_top;
|
|
|
FOR_ALL_STATIONS(st) {
|
|
|
FOR_ALL_BASE_STATIONS(st) {
|
|
|
if (y >= st->sign.top &&
|
|
|
y < st->sign.top + 24 &&
|
|
|
x >= st->sign.left &&
|
|
|
x < st->sign.left + st->sign.width_normal * 2) {
|
|
|
ShowStationViewWindow(st->index);
|
|
|
return true;
|
|
|
ret = ClickOnStation(st);
|
|
|
if (ret) break;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -1935,13 +1895,13 @@ static bool CheckClickOnStation(const Vi
|
|
|
x = ScaleByZoom(x - vp->left + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_left;
|
|
|
y = ScaleByZoom(y - vp->top + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_top;
|
|
|
|
|
|
FOR_ALL_STATIONS(st) {
|
|
|
FOR_ALL_BASE_STATIONS(st) {
|
|
|
if (y >= st->sign.top &&
|
|
|
y < st->sign.top + ScaleByZoom(12, vp->zoom) &&
|
|
|
x >= st->sign.left &&
|
|
|
x < st->sign.left + ScaleByZoom(st->sign.width_small, vp->zoom)) {
|
|
|
ShowStationViewWindow(st->index);
|
|
|
return true;
|
|
|
ret = ClickOnStation(st);
|
|
|
if (ret) break;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -1949,7 +1909,7 @@ static bool CheckClickOnStation(const Vi
|
|
|
default: NOT_REACHED();
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -2012,64 +1972,6 @@ static bool CheckClickOnSign(const ViewP
|
|
|
}
|
|
|
|
|
|
|
|
|
static bool CheckClickOnWaypoint(const ViewPort *vp, int x, int y)
|
|
|
{
|
|
|
const Waypoint *wp;
|
|
|
|
|
|
if (!HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES) || IsInvisibilitySet(TO_SIGNS)) return false;
|
|
|
|
|
|
switch (vp->zoom) {
|
|
|
case ZOOM_LVL_NORMAL:
|
|
|
x = x - vp->left + vp->virtual_left;
|
|
|
y = y - vp->top + vp->virtual_top;
|
|
|
FOR_ALL_WAYPOINTS(wp) {
|
|
|
if (y >= wp->sign.top &&
|
|
|
y < wp->sign.top + 12 &&
|
|
|
x >= wp->sign.left &&
|
|
|
x < wp->sign.left + wp->sign.width_normal) {
|
|
|
ShowWaypointWindow(wp);
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case ZOOM_LVL_OUT_2X:
|
|
|
x = (x - vp->left + 1) * 2 + vp->virtual_left;
|
|
|
y = (y - vp->top + 1) * 2 + vp->virtual_top;
|
|
|
FOR_ALL_WAYPOINTS(wp) {
|
|
|
if (y >= wp->sign.top &&
|
|
|
y < wp->sign.top + 24 &&
|
|
|
x >= wp->sign.left &&
|
|
|
x < wp->sign.left + wp->sign.width_normal * 2) {
|
|
|
ShowWaypointWindow(wp);
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case ZOOM_LVL_OUT_4X:
|
|
|
case ZOOM_LVL_OUT_8X:
|
|
|
x = ScaleByZoom(x - vp->left + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_left;
|
|
|
y = ScaleByZoom(y - vp->top + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_top;
|
|
|
|
|
|
FOR_ALL_WAYPOINTS(wp) {
|
|
|
if (y >= wp->sign.top &&
|
|
|
y < wp->sign.top + ScaleByZoom(12, vp->zoom) &&
|
|
|
x >= wp->sign.left &&
|
|
|
x < wp->sign.left + ScaleByZoom(wp->sign.width_small, vp->zoom)) {
|
|
|
ShowWaypointWindow(wp);
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
default: NOT_REACHED();
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
|
|
|
static bool CheckClickOnLandscape(const ViewPort *vp, int x, int y)
|
|
|
{
|
|
|
Point pt = TranslateXYToTileCoord(vp, x, y);
|
|
@@ -2086,7 +1988,6 @@ bool HandleViewportClicked(const ViewPor
|
|
|
if (CheckClickOnTown(vp, x, y)) return true;
|
|
|
if (CheckClickOnStation(vp, x, y)) return true;
|
|
|
if (CheckClickOnSign(vp, x, y)) return true;
|
|
|
if (CheckClickOnWaypoint(vp, x, y)) return true;
|
|
|
CheckClickOnLandscape(vp, x, y);
|
|
|
|
|
|
v = CheckClickOnVehicle(vp, x, y);
|