diff --git a/src/lang/english.txt b/src/lang/english.txt index ede50e8dda..b19ca8eebd 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -457,6 +457,7 @@ STR_SETTINGS_MENU_STATION_NAMES_LORRY :Lorry stops STR_SETTINGS_MENU_STATION_NAMES_BUS :Bus stops STR_SETTINGS_MENU_STATION_NAMES_SHIP :Docks STR_SETTINGS_MENU_STATION_NAMES_PLANE :Airports +STR_SETTINGS_MENU_STATION_NAMES_GHOST :Ghost STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED :Waypoint names displayed STR_SETTINGS_MENU_SIGNS_DISPLAYED :Signs displayed STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS :Competitor signs and names displayed diff --git a/src/station_type.h b/src/station_type.h index 54a4ea814c..a6c5223195 100644 --- a/src/station_type.h +++ b/src/station_type.h @@ -61,6 +61,9 @@ enum StationFacility : uint8_t { }; DECLARE_ENUM_AS_BIT_SET(StationFacility) +/** Fake 'facility' to allow toggling display of recently-removed station signs. */ +static constexpr StationFacility FACIL_GHOST{1U << 6}; + /** The vehicles that may have visited a station */ enum StationHadVehicleOfType : uint8_t { HVOT_NONE = 0, ///< Station has seen no vehicles diff --git a/src/table/settings/misc_settings.ini b/src/table/settings/misc_settings.ini index 7c95c28ccb..a4333a6e4a 100644 --- a/src/table/settings/misc_settings.ini +++ b/src/table/settings/misc_settings.ini @@ -12,7 +12,7 @@ extern std::string _config_language_file; static constexpr std::initializer_list _support8bppmodes{"no", "system", "hardware"}; static constexpr std::initializer_list _display_opt_modes{"SHOW_TOWN_NAMES", "SHOW_STATION_NAMES", "SHOW_SIGNS", "FULL_ANIMATION", "", "FULL_DETAIL", "WAYPOINTS", "SHOW_COMPETITOR_SIGNS"}; -static constexpr std::initializer_list _facility_display_opt_modes{"TRAIN", "TRUCK_STOP", "BUS_STOP", "AIRPORT", "DOCK"}; +static constexpr std::initializer_list _facility_display_opt_modes{"TRAIN", "TRUCK_STOP", "BUS_STOP", "AIRPORT", "DOCK", "", "GHOST"}; #ifdef WITH_COCOA extern bool _allow_hidpi_window; @@ -69,7 +69,7 @@ full = _display_opt_modes name = ""facility_display_opt"" type = SLE_UINT8 var = _facility_display_opt -def = (1 << FACIL_TRAIN | 1 << FACIL_TRUCK_STOP | 1 << FACIL_BUS_STOP | 1 << FACIL_AIRPORT | 1 << FACIL_DOCK) +def = (FACIL_TRAIN | FACIL_TRUCK_STOP | FACIL_BUS_STOP | FACIL_AIRPORT | FACIL_DOCK | FACIL_GHOST) full = _facility_display_opt_modes [SDTG_BOOL] diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index cc63de4575..2181219aa7 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -241,6 +241,7 @@ enum OptionMenuEntries { OME_SHOW_STATIONNAMES_BUS, OME_SHOW_STATIONNAMES_SHIP, OME_SHOW_STATIONNAMES_PLANE, + OME_SHOW_STATIONNAMES_GHOST, OME_SHOW_WAYPOINTNAMES, OME_SHOW_SIGNS, OME_SHOW_COMPETITOR_SIGNS, @@ -281,6 +282,7 @@ static CallBackFunction ToolbarOptionsClick(Window *w) list.push_back(MakeDropDownListCheckedItem((_facility_display_opt & FACIL_BUS_STOP) != 0, STR_SETTINGS_MENU_STATION_NAMES_BUS, OME_SHOW_STATIONNAMES_BUS, false, false, 1)); list.push_back(MakeDropDownListCheckedItem((_facility_display_opt & FACIL_DOCK) != 0, STR_SETTINGS_MENU_STATION_NAMES_SHIP, OME_SHOW_STATIONNAMES_SHIP, false, false, 1)); list.push_back(MakeDropDownListCheckedItem((_facility_display_opt & FACIL_AIRPORT) != 0, STR_SETTINGS_MENU_STATION_NAMES_PLANE, OME_SHOW_STATIONNAMES_PLANE, false, false, 1)); + list.push_back(MakeDropDownListCheckedItem((_facility_display_opt & FACIL_GHOST) != 0, STR_SETTINGS_MENU_STATION_NAMES_GHOST, OME_SHOW_STATIONNAMES_GHOST, false, false, 1)); list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_WAYPOINT_NAMES), STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED, OME_SHOW_WAYPOINTNAMES)); list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_SIGNS), STR_SETTINGS_MENU_SIGNS_DISPLAYED, OME_SHOW_SIGNS)); list.push_back(MakeDropDownListCheckedItem(HasBit(_display_opt, DO_SHOW_COMPETITOR_SIGNS), STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS, OME_SHOW_COMPETITOR_SIGNS)); @@ -331,6 +333,7 @@ static CallBackFunction MenuClickSettings(int index) case OME_SHOW_STATIONNAMES_BUS: ToggleFacilityDisplay(FACIL_BUS_STOP); break; case OME_SHOW_STATIONNAMES_SHIP: ToggleFacilityDisplay(FACIL_DOCK); break; case OME_SHOW_STATIONNAMES_PLANE: ToggleFacilityDisplay(FACIL_AIRPORT); break; + case OME_SHOW_STATIONNAMES_GHOST: ToggleFacilityDisplay(FACIL_GHOST); break; case OME_SHOW_WAYPOINTNAMES: ToggleBit(_display_opt, DO_SHOW_WAYPOINT_NAMES); break; case OME_SHOW_SIGNS: ToggleBit(_display_opt, DO_SHOW_SIGNS); break; case OME_SHOW_COMPETITOR_SIGNS: diff --git a/src/viewport.cpp b/src/viewport.cpp index c12b05f0a3..dda99b7507 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -1448,7 +1448,12 @@ static void ViewportAddKdtreeSigns(DrawPixelInfo *dpi) case ViewportSignKdtreeItem::VKI_STATION: { if (!show_stations) break; const BaseStation *st = BaseStation::Get(item.id.station); - if ((_facility_display_opt & st->facilities) == 0) break; + + /* If no facilities are present the station is a ghost station. */ + StationFacility facilities = st->facilities; + if (facilities == FACIL_NONE) facilities = FACIL_GHOST; + + if ((_facility_display_opt & facilities) == 0) break; /* Don't draw if station is owned by another company and competitor station names are hidden. Stations owned by none are never ignored. */ if (!show_competitors && _local_company != st->owner && st->owner != OWNER_NONE) break;