diff --git a/src/lang/czech.txt b/src/lang/czech.txt index c41bd17af6..c299a817d3 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -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 diff --git a/src/lang/english.txt b/src/lang/english.txt index 2a006becb0..7e428abe28 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -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 diff --git a/src/lang/galician.txt b/src/lang/galician.txt index da8396ea7d..281792d018 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -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 diff --git a/src/lang/german.txt b/src/lang/german.txt index a7a72a1ac7..4c747b05c4 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -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 diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 1d5f594a2d..fbdb067f84 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -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 :실선 diff --git a/src/main_gui.cpp b/src/main_gui.cpp index e5789efb3e..1b88cc39ed 100644 --- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -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); diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 6155282729..690b1fa33e 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -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")); diff --git a/src/settings_type.h b/src/settings_type.h index 6cf5e6e966..47efab9804 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -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 diff --git a/src/table/settings/settings.ini b/src/table/settings/settings.ini index b625e0605a..e6d26d75b0 100644 --- a/src/table/settings/settings.ini +++ b/src/table/settings/settings.ini @@ -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 diff --git a/src/viewport.cpp b/src/viewport.cpp index 7f8b420b44..c479927acf 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -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 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(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 &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. * diff --git a/src/viewport_func.h b/src/viewport_func.h index e8ca5c2633..f90efb2675 100644 --- a/src/viewport_func.h +++ b/src/viewport_func.h @@ -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);