Change vehicle route overlay settings

Add a mode setting: off, all locations, station stops only
Change show vehicle route setting to on/off
Move settings to their own section in the GUI
Add an unset hotkey to switch the mode setting
pull/453/head
Jonathan G Rennison 2 years ago
parent 7ec5450ed1
commit 6cf62af092

@ -1753,8 +1753,6 @@ STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_DO_NOTHING :Nic
STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_ZOOM_MAIN :Nastvit 1X zoom
STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_NEW_EXTRA :Otevřít další pohled
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE :Zobrazit trasu vozidla: {STRING}
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE_NO :Vypnuto
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE_SIMPLE :Jednoduchá
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH :Styl vykreslení trasy vozidla: {STRING}
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_VALUE :přerušovaná čára široká {COMMA} pixel{P "" y ů}
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_DISABLED :plné čáry

@ -1785,7 +1785,15 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :Disabled
STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Double click
STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Single click (when focussed)
STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Single click (immediately)
STR_CONFIG_SETTING_SHOW_VEHICLE_ROUTE_STEPS :Show the vehicle's route steps: {STRING2}
STR_CONFIG_SETTING_SHOW_VEHICLE_ROUTE_MODE :Show route overlay of focused vehicle: {STRING2}
STR_CONFIG_SETTING_SHOW_VEHICLE_ROUTE_MODE_HELPTEXT :When enabled, and a vehicle window is focused, show markers at and/or lines between the locations of the vehicle's orders.{}The station stopped at only mode only shows orders where the vehicle stops at a station (this excludes via orders, waypoints and depots).
STR_CONFIG_SETTING_SHOW_VEHICLE_ROUTE_MODE_OFF :Off
STR_CONFIG_SETTING_SHOW_VEHICLE_ROUTE_MODE_ALL_LOCATIONS :All order locations
STR_CONFIG_SETTING_SHOW_VEHICLE_ROUTE_MODE_STATIONS_ONLY :Stations stops only
STR_CONFIG_SETTING_SHOW_VEHICLE_ROUTE_STEPS :Show vehicle route overlay markers: {STRING2}
STR_CONFIG_SETTING_SHOW_VEHICLE_ROUTE_STEPS_HELPTEXT :When enabled, and a vehicle window is focused, a marker with the order number and type is shown at the location of each order.
STR_CONFIG_SETTING_SHOW_VEHICLE_LIST_COMPANY_COLOUR :Mark other companies' vehicles in lists with their company colour: {STRING2}
STR_CONFIG_SETTING_SHOW_VEHICLE_LIST_COMPANY_COLOUR_HELPTEXT :Vehicles in a vehicle list window which are owned by a different company than the owner of the vehicle list are marked with a coloured square in the vehicle's company colour.
STR_CONFIG_SETTING_ENABLE_SINGLE_VEH_SHARED_ORDER_GUI :Enable single vehicles in shared order group window: {STRING2}
@ -1809,9 +1817,8 @@ STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK :Function of dou
STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_DO_NOTHING :Do nothing
STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_ZOOM_MAIN :Zoom in directly to 1X
STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_NEW_EXTRA :Open an extra viewport
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE :Show the vehicle's route: {STRING2}
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE_NO :No
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE_SIMPLE :Simple
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE :Show vehicle route overlay lines: {STRING2}
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE_HELPTEXT :When enabled, and a vehicle window is focused, lines are drawn between the locations of each of the vehicle's orders. (Conditional order branches are shown using yellow lines).
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH :Drawing style of vehicle's route: {STRING}
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_VALUE :dashed lines of {COMMA} pixel{P "" s}
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_DISABLED :plain lines
@ -2443,6 +2450,7 @@ STR_CONFIG_SETTING_AI_NPC :{ORANGE}Compute
STR_CONFIG_SETTING_NETWORK :{ORANGE}Network
STR_CONFIG_SETTING_VIEWPORT_MAP_OPTIONS :{ORANGE}Map mode
STR_CONFIG_SETTING_VIEWPORT_SIGNALS :{ORANGE}Signals
STR_CONFIG_SETTING_VEHICLE_ROUTE_OVERLAY :{ORANGE}Vehicle route overlay
STR_CONFIG_SETTING_SHARING :{ORANGE}Infrastructure sharing
STR_CONFIG_SETTING_SCENARIO_EDITOR :{ORANGE}Scenario Editor

@ -5773,8 +5773,6 @@ STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_DO_NOTHING :Non facer nada
STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_ZOOM_MAIN :Facer zoom directamente a 1X
STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_NEW_EXTRA :Abrir unha vista adicional
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE :Amosar a ruta do vehículo: {STRING}
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE_NO :Non
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE_SIMPLE :Simple
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH :Estilo de debuxo da ruta do vehículo: {STRING}
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_VALUE :liñas discontinuas de {COMMA} pixel{P "" es}
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_DISABLED :liñas planas

@ -1797,8 +1797,6 @@ STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_DO_NOTHING :Keine
STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_ZOOM_MAIN :Zoome direkt auf Faktor 1x
STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_NEW_EXTRA :Öffne eine neue Zusatzansicht
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE :Zeige die Fahrzeugroute: {STRING}
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE_NO :Aus
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE_SIMPLE :Einfach
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH :Zeichenstil der Fahrzeugroute: {STRING}
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_VALUE :gestrichelte Linie von {COMMA} Pixel{P "" n} Länge
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_DISABLED :durchgezogene Linie

@ -1811,8 +1811,6 @@ STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_DO_NOTHING :아무것도
STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_ZOOM_MAIN :확대/축소 배율 원래대로
STR_CONFIG_SETTING_VIEWPORT_MAP_ACTION_DBLCLICK_NEW_EXTRA :새 외부 화면 열기
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE :차량 경로 보이기: {STRING}
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE_NO :표시 안함
STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE_SIMPLE :단순
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH :차량 경로 표시 방식: {STRING}
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_VALUE :{COMMA} 픽셀 간격의 점선
STR_CONFIG_SETTING_VIEWPORT_MAP_DRAW_ROUTE_DASH_DISABLED :실선

@ -233,6 +233,7 @@ enum {
GHK_CLOSE_ERROR,
GHK_CHANGE_MAP_MODE_PREV,
GHK_CHANGE_MAP_MODE_NEXT,
GHK_SWITCH_VIEWPORT_ROUTE_OVERLAY_MODE,
};
struct MainWindow : Window
@ -458,6 +459,13 @@ struct MainWindow : Window
this->SetDirty();
}
break;
case GHK_SWITCH_VIEWPORT_ROUTE_OVERLAY_MODE:
if (_settings_client.gui.show_vehicle_route_mode != 0) {
_settings_client.gui.show_vehicle_route_mode ^= 3;
CheckMarkDirtyFocusedRoutePaths();
SetWindowDirty(WC_GAME_OPTIONS, WN_GAME_OPTIONS_GAME_SETTINGS);
}
break;
default: return ES_NOT_HANDLED;
}
@ -576,6 +584,7 @@ static Hotkey global_hotkeys[] = {
Hotkey(WKC_SPACE, "close_error", GHK_CLOSE_ERROR),
Hotkey(WKC_PAGEUP, "previous_map_mode", GHK_CHANGE_MAP_MODE_PREV),
Hotkey(WKC_PAGEDOWN, "next_map_mode", GHK_CHANGE_MAP_MODE_NEXT),
Hotkey((uint16)0, "switch_viewport_route_overlay_mode", GHK_SWITCH_VIEWPORT_ROUTE_OVERLAY_MODE),
HOTKEY_LIST_END
};
HotkeyList MainWindow::hotkeys("global", global_hotkeys);

@ -1786,9 +1786,6 @@ static SettingsContainer &GetSettingsTree()
graphics->Add(new SettingEntry("gui.smallmap_land_colour"));
graphics->Add(new SettingEntry("gui.linkgraph_colours"));
graphics->Add(new SettingEntry("gui.graph_line_thickness"));
graphics->Add(new SettingEntry("gui.show_vehicle_route_steps"));
graphics->Add(new SettingEntry("gui.show_vehicle_route"));
graphics->Add(new SettingEntry("gui.dash_level_of_route_lines"));
}
SettingsPage *sound = main->Add(new SettingsPage(STR_CONFIG_SETTING_SOUND));
@ -1834,6 +1831,13 @@ static SettingsContainer &GetSettingsTree()
viewport_signals->Add(new SettingEntry("gui.show_restricted_signal_default"));
viewport_signals->Add(new SettingEntry("gui.show_all_signal_default"));
}
SettingsPage *viewport_route_overlay = viewports->Add(new SettingsPage(STR_CONFIG_SETTING_VEHICLE_ROUTE_OVERLAY));
{
viewport_route_overlay->Add(new SettingEntry("gui.show_vehicle_route_mode"));
viewport_route_overlay->Add(new ConditionallyHiddenSettingEntry("gui.show_vehicle_route_steps", []() -> bool { return _settings_client.gui.show_vehicle_route_mode == 0; }));
viewport_route_overlay->Add(new ConditionallyHiddenSettingEntry("gui.show_vehicle_route", []() -> bool { return _settings_client.gui.show_vehicle_route_mode == 0; }));
viewport_route_overlay->Add(new ConditionallyHiddenSettingEntry("gui.dash_level_of_route_lines", []() -> bool { return _settings_client.gui.show_vehicle_route_mode == 0 || !_settings_client.gui.show_vehicle_route; }));
}
viewports->Add(new SettingEntry("gui.auto_scrolling"));
viewports->Add(new SettingEntry("gui.scroll_mode"));

@ -170,8 +170,6 @@ struct GUISettings : public TimeSettings {
uint32 show_scrolling_viewport_on_map; ///< when a no map viewport is scrolled, its location is marked on the other map viewports
bool show_bridges_on_map; ///< bridges are rendered on a viewport in map mode
bool show_tunnels_on_map; ///< tunnels are rendered on a viewport in map mode
uint32 show_vehicle_route; ///< show a vehicle's route when its orders/timetable window is focused
uint32 dash_level_of_route_lines; ///< the dash level passed to GfxDrawLine() (plain if 0)
bool use_owner_colour_for_tunnelbridge;///< bridges and tunnels are rendered with their owner's colour
bool timetable_arrival_departure; ///< show arrivals and departures in vehicle timetables
uint8 max_departures; ///< maximum number of departures to show per station
@ -232,7 +230,10 @@ struct GUISettings : public TimeSettings {
bool auto_remove_signals; ///< automatically remove signals when in the way during rail construction
uint16 refresh_rate; ///< How often we refresh the screen (time between draw-ticks).
uint16 fast_forward_speed_limit; ///< Game speed to use when fast-forward is enabled.
bool show_vehicle_route_steps; ///< when a window related to a specific vehicle is focused, show route steps
uint8 show_vehicle_route_mode; ///< How to show a vehicle's route when one of its windows is focused
bool show_vehicle_route; ///< Show route lines when vehicles route overlay is being shown
bool show_vehicle_route_steps; ///< Show route step markers when vehicles route overlay is being shown
uint8 dash_level_of_route_lines; ///< the dash level passed to GfxDrawLine() (plain if 0)
bool show_vehicle_list_company_colour; ///< show the company colour of vehicles which have an owner different to the owner of the vehicle list
bool enable_single_veh_shared_order_gui; ///< enable showing a single vehicle in the shared order GUI window
bool show_adv_load_mode_features; ///< enable advanced loading mode features in UI

@ -4664,20 +4664,37 @@ str = STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_TUNNELS
post_cb = ViewportMapShowTunnelModeChanged
[SDTC_VAR]
var = gui.show_vehicle_route
type = SLE_UINT32
var = gui.show_vehicle_route_mode
type = SLE_UINT8
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
def = 1
min = 0
max = 1
max = 2
interval = 1
str = STR_CONFIG_SETTING_SHOW_VEHICLE_ROUTE_MODE
strhelp = STR_CONFIG_SETTING_SHOW_VEHICLE_ROUTE_MODE_HELPTEXT
strval = STR_CONFIG_SETTING_SHOW_VEHICLE_ROUTE_MODE_OFF
post_cb = [](auto) { InvalidateWindowClassesData(WC_GAME_OPTIONS); MarkWholeScreenDirty(); }
[SDTC_BOOL]
var = gui.show_vehicle_route_steps
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
def = true
str = STR_CONFIG_SETTING_SHOW_VEHICLE_ROUTE_STEPS
strhelp = STR_CONFIG_SETTING_SHOW_VEHICLE_ROUTE_STEPS_HELPTEXT
post_cb = [](auto) { InvalidateWindowClassesData(WC_GAME_OPTIONS); MarkWholeScreenDirty(); }
[SDTC_BOOL]
var = gui.show_vehicle_route
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
def = true
str = STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE
strval = STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE_NO
post_cb = [](auto) { MarkWholeScreenDirty(); }
strhelp = STR_CONFIG_SETTING_VIEWPORT_MAP_SHOW_VEHICLE_ROUTE_HELPTEXT
post_cb = [](auto) { InvalidateWindowClassesData(WC_GAME_OPTIONS); MarkWholeScreenDirty(); }
[SDTC_VAR]
var = gui.dash_level_of_route_lines
type = SLE_UINT32
type = SLE_UINT8
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL
def = 0
min = 0
@ -5344,13 +5361,6 @@ strhelp = STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT
strval = STR_JUST_COMMA
post_cb = [](auto) { MarkWholeScreenDirty(); }
[SDTC_BOOL]
var = gui.show_vehicle_route_steps
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC
def = true
str = STR_CONFIG_SETTING_SHOW_VEHICLE_ROUTE_STEPS
post_cb = [](auto) { MarkWholeScreenDirty(); }
[SDTC_BOOL]
var = gui.show_train_length_in_details
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC

@ -2287,23 +2287,31 @@ static inline Vehicle *GetVehicleFromWindow(Window *w)
return nullptr;
}
static bool ViewportVehicleRouteShouldSkipOrder(const Order *order)
{
if (_settings_client.gui.show_vehicle_route_mode != 2) return false;
switch (order->GetType()) {
case OT_GOTO_STATION:
case OT_IMPLICIT:
return (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) != 0;
default:
return true;
}
}
static inline TileIndex GetLastValidOrderLocation(const Vehicle *veh)
{
TileIndex tmp, result = INVALID_TILE;
for(const Order *order : veh->Orders()) {
switch (order->GetType()) {
case OT_GOTO_STATION:
case OT_GOTO_WAYPOINT:
case OT_IMPLICIT:
case OT_GOTO_DEPOT:
tmp = order->GetLocation(veh, veh->type == VEH_AIRCRAFT);
if (tmp != INVALID_TILE) result = tmp;
break;
default:
break;
}
VehicleOrderID order_id = veh->GetNumOrders();
while (order_id > 0) {
order_id--;
const Order *order = veh->GetOrder(order_id);
if (ViewportVehicleRouteShouldSkipOrder(order)) continue;
TileIndex location = order->GetLocation(veh, veh->type == VEH_AIRCRAFT);
if (location != INVALID_TILE) return location;
}
return result;
return INVALID_TILE;
}
static inline std::pair<const Order *, bool> GetFinalOrder(const Vehicle *veh, const Order *order)
@ -2342,7 +2350,7 @@ static bool ViewportMapPrepareVehicleRoute(const Vehicle * const veh)
TileIndex from_tile = GetLastValidOrderLocation(veh);
if (from_tile == INVALID_TILE) return false;
for(const Order *order : veh->Orders()) {
for (const Order *order : veh->Orders()) {
auto guard = scope_guard([&]() {
if (order->IsType(OT_CONDITIONAL) && order->GetConditionVariable() == OCV_UNCONDITIONALLY) from_tile = INVALID_TILE;
});
@ -2350,6 +2358,7 @@ static bool ViewportMapPrepareVehicleRoute(const Vehicle * const veh)
bool conditional;
std::tie(final_order, conditional) = GetFinalOrder(veh, order);
if (final_order == nullptr) continue;
if (ViewportVehicleRouteShouldSkipOrder(final_order)) continue;
const TileIndex to_tile = final_order->GetLocation(veh, veh->type == VEH_AIRCRAFT);
if (to_tile == INVALID_TILE) continue;
@ -2372,41 +2381,35 @@ static bool ViewportMapPrepareVehicleRoute(const Vehicle * const veh)
/** Draw the route of a vehicle. */
static void ViewportMapDrawVehicleRoute(const Viewport *vp, ViewportDrawerDynamic *vdd)
{
switch (_settings_client.gui.show_vehicle_route) {
/* case 0: return; // No */
case 1: { // Simple
if (_vp_route_paths.empty()) return;
DrawPixelInfo dpi_for_text = vdd->MakeDPIForText();
for (const auto &iter : _vp_route_paths) {
const int from_tile_x = TileX(iter.from_tile) * TILE_SIZE + TILE_SIZE / 2;
const int from_tile_y = TileY(iter.from_tile) * TILE_SIZE + TILE_SIZE / 2;
Point from_pt = RemapCoords(from_tile_x, from_tile_y, 0);
const int from_x = UnScaleByZoom(from_pt.x, vp->zoom);
const int to_tile_x = TileX(iter.to_tile) * TILE_SIZE + TILE_SIZE / 2;
const int to_tile_y = TileY(iter.to_tile) * TILE_SIZE + TILE_SIZE / 2;
Point to_pt = RemapCoords(to_tile_x, to_tile_y, 0);
const int to_x = UnScaleByZoom(to_pt.x, vp->zoom);
if (_vp_route_paths.empty()) return;
if (from_x < dpi_for_text.left - 1 && to_x < dpi_for_text.left - 1) continue;
if (from_x > dpi_for_text.left + dpi_for_text.width + 1 && to_x > dpi_for_text.left + dpi_for_text.width + 1) continue;
DrawPixelInfo dpi_for_text = vdd->MakeDPIForText();
from_pt.y -= GetSlopePixelZ(from_tile_x, from_tile_y) * ZOOM_LVL_BASE;
to_pt.y -= GetSlopePixelZ(to_tile_x, to_tile_y) * ZOOM_LVL_BASE;
const int from_y = UnScaleByZoom(from_pt.y, vp->zoom);
const int to_y = UnScaleByZoom(to_pt.y, vp->zoom);
int line_width = 3;
if (_settings_client.gui.dash_level_of_route_lines == 0) {
GfxDrawLine(&dpi_for_text, from_x, from_y, to_x, to_y, PC_BLACK, 3, _settings_client.gui.dash_level_of_route_lines);
line_width = 1;
}
GfxDrawLine(&dpi_for_text, from_x, from_y, to_x, to_y, iter.order_match ? PC_WHITE : PC_YELLOW, line_width, _settings_client.gui.dash_level_of_route_lines);
}
break;
for (const auto &iter : _vp_route_paths) {
const int from_tile_x = TileX(iter.from_tile) * TILE_SIZE + TILE_SIZE / 2;
const int from_tile_y = TileY(iter.from_tile) * TILE_SIZE + TILE_SIZE / 2;
Point from_pt = RemapCoords(from_tile_x, from_tile_y, 0);
const int from_x = UnScaleByZoom(from_pt.x, vp->zoom);
const int to_tile_x = TileX(iter.to_tile) * TILE_SIZE + TILE_SIZE / 2;
const int to_tile_y = TileY(iter.to_tile) * TILE_SIZE + TILE_SIZE / 2;
Point to_pt = RemapCoords(to_tile_x, to_tile_y, 0);
const int to_x = UnScaleByZoom(to_pt.x, vp->zoom);
if (from_x < dpi_for_text.left - 1 && to_x < dpi_for_text.left - 1) continue;
if (from_x > dpi_for_text.left + dpi_for_text.width + 1 && to_x > dpi_for_text.left + dpi_for_text.width + 1) continue;
from_pt.y -= GetSlopePixelZ(from_tile_x, from_tile_y) * ZOOM_LVL_BASE;
to_pt.y -= GetSlopePixelZ(to_tile_x, to_tile_y) * ZOOM_LVL_BASE;
const int from_y = UnScaleByZoom(from_pt.y, vp->zoom);
const int to_y = UnScaleByZoom(to_pt.y, vp->zoom);
int line_width = 3;
if (_settings_client.gui.dash_level_of_route_lines == 0) {
GfxDrawLine(&dpi_for_text, from_x, from_y, to_x, to_y, PC_BLACK, 3, _settings_client.gui.dash_level_of_route_lines);
line_width = 1;
}
GfxDrawLine(&dpi_for_text, from_x, from_y, to_x, to_y, iter.order_match ? PC_WHITE : PC_YELLOW, line_width, _settings_client.gui.dash_level_of_route_lines);
}
}
@ -2507,9 +2510,10 @@ static bool ViewportPrepareVehicleRouteSteps(const Vehicle * const veh)
if (_vp_route_steps.size() == 0) {
/* Prepare data. */
int order_rank = 0;
for(const Order *order : veh->Orders()) {
const TileIndex tile = order->GetLocation(veh, veh->type == VEH_AIRCRAFT);
for (const Order *order : veh->Orders()) {
order_rank++;
if (ViewportVehicleRouteShouldSkipOrder(order)) continue;
const TileIndex tile = order->GetLocation(veh, veh->type == VEH_AIRCRAFT);
if (tile == INVALID_TILE) continue;
_vp_route_steps[tile].push_back(std::pair<int, OrderType>(order_rank, order->GetType()));
}
@ -2520,6 +2524,7 @@ static bool ViewportPrepareVehicleRouteSteps(const Vehicle * const veh)
void ViewportPrepareVehicleRoute()
{
if (_settings_client.gui.show_vehicle_route_mode == 0) return;
if (!_settings_client.gui.show_vehicle_route_steps && !_settings_client.gui.show_vehicle_route) return;
const Vehicle * const veh = GetVehicleFromWindow(_focused_window);
if (_settings_client.gui.show_vehicle_route_steps && veh && ViewportPrepareVehicleRouteSteps(veh)) {
@ -3780,7 +3785,7 @@ static void ViewportDoDrawPhase2(Viewport *vp, ViewportDrawerDynamic *vdd)
vp->overlay->Draw(&dp);
}
if (_settings_client.gui.show_vehicle_route) ViewportMapDrawVehicleRoute(vp, vdd);
if (_settings_client.gui.show_vehicle_route_mode != 0 && _settings_client.gui.show_vehicle_route) ViewportMapDrawVehicleRoute(vp, vdd);
}
/* This is run in the main thread */
@ -3798,7 +3803,7 @@ static void ViewportDoDrawPhase3(Viewport *vp)
dp.top = UnScaleByZoom(_vdd->dpi.top, zoom);
ViewportDrawStrings(_vdd.get(), zoom, &_vdd->string_sprites_to_draw);
}
if (_settings_client.gui.show_vehicle_route_steps && !_vp_route_steps.empty()) {
if (_settings_client.gui.show_vehicle_route_mode != 0 && _settings_client.gui.show_vehicle_route_steps && !_vp_route_steps.empty()) {
dp.left = _vdd->offset_x + vp->left;
dp.top = _vdd->offset_y + vp->top;
ViewportDrawVehicleRouteSteps(vp);
@ -4336,13 +4341,8 @@ static void MarkRoutePathsDirty(const std::vector<DrawnPathRouteTileLine> &lines
void MarkAllRoutePathsDirty(const Vehicle *veh)
{
switch (_settings_client.gui.show_vehicle_route) {
case 0: // No
return;
case 1: // Simple
ViewportMapPrepareVehicleRoute(veh);
break;
if (_settings_client.gui.show_vehicle_route) {
ViewportMapPrepareVehicleRoute(veh);
}
for (const auto &iter : _vp_route_paths) {
MarkTileLineDirty(iter.from_tile, iter.to_tile, VMDF_NOT_LANDSCAPE);
@ -4354,12 +4354,21 @@ void MarkAllRoutePathsDirty(const Vehicle *veh)
void CheckMarkDirtyFocusedRoutePaths(const Vehicle *veh)
{
const Vehicle *focused_veh = GetVehicleFromWindow(_focused_window);
if (focused_veh && veh == focused_veh) {
if (focused_veh != nullptr && veh == focused_veh) {
MarkAllRoutePathsDirty(veh);
MarkAllRouteStepsDirty(veh);
}
}
void CheckMarkDirtyFocusedRoutePaths()
{
const Vehicle *focused_veh = GetVehicleFromWindow(_focused_window);
if (focused_veh != nullptr) {
MarkAllRoutePathsDirty(focused_veh);
MarkAllRouteStepsDirty(focused_veh);
}
}
/**
* Marks the selected tiles as dirty.
*

@ -46,6 +46,7 @@ void MarkViewportLineDirty(Viewport * const vp, const Point from_pt, const Point
void MarkTileLineDirty(const TileIndex from_tile, const TileIndex to_tile, ViewportMarkDirtyFlags flags);
void MarkAllRoutePathsDirty(const Vehicle *veh);
void CheckMarkDirtyFocusedRoutePaths(const Vehicle *veh);
void CheckMarkDirtyFocusedRoutePaths();
bool DoZoomInOutWindow(ZoomStateChange how, Window *w);
void ZoomInOrOutToCursorWindow(bool in, Window * w);

Loading…
Cancel
Save