diff --git a/src/lang/english.txt b/src/lang/english.txt index dcbd355b13..08d7dc5b4b 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1479,6 +1479,9 @@ STR_CONFIG_SETTING_DEMOLISH_CONFIRM_MODE_ALL :Industries and STR_CONFIG_SETTING_ADV_SIG_BRIDGE_TUN_MODES :Enable signals on bridges/tunnels advanced modes: {STRING2} STR_CONFIG_SETTING_ADV_SIG_BRIDGE_TUN_MODES_HELPTEXT :Enables use of advanced modes of signal simulation on bridges and tunnels. When disabled, bridges/tunnels which are not already in an advanced mode cannot be changed to an advanced mode, however other players may choose to enable this setting and use an advanced mode. +STR_CONFIG_SETTING_SORT_TRACK_TYPES_BY_SPEED :Sort track types by speed: {STRING2} +STR_CONFIG_SETTING_SORT_TRACK_TYPES_BY_SPEED_HELPTEXT :Sorts track types by compatibility and by speed instead of using the default sorting. + STR_CONFIG_SETTING_LANDSCAPE :Landscape: {STRING2} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Landscapes define basic gameplay scenarios with different cargoes and town growth requirements. NewGRF and Game Scripts allow finer control though STR_CONFIG_SETTING_LAND_GENERATOR :Land generator: {STRING2} diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 28906ec7fd..b3222c7baf 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -129,7 +129,57 @@ void ResolveRailTypeGUISprites(RailtypeInfo *rti) */ static bool CompareRailTypes(const RailType &first, const RailType &second) { - return GetRailTypeInfo(first)->sorting_order < GetRailTypeInfo(second)->sorting_order; + if (_settings_client.gui.sort_track_types_by_speed) { + RailType rt[2] = { first, second }; + uint sort_value[2]; + + for (int i = 0; i < 2; ++i) { + // Last sort by speed + sort_value[i] = (GetRailTypeInfo(rt[i])->max_speed != 0) ? GetRailTypeInfo(rt[i])->max_speed : UINT16_MAX; + + // Inside those categories filter by compatibility with eachother. + if (!HasPowerOnRail(rt[i], rt[(i + 1) % 2])) { + sort_value[i] += (1 << 16); + } + + // We sort by Rail, Electric and others + if (!HasPowerOnRail(rt[i], RAILTYPE_RAIL)) { + sort_value[i] += (1 << 17); + + if (!HasPowerOnRail(rt[i], RAILTYPE_ELECTRIC)) { + sort_value[i] += (1 << 18); + + if (!HasPowerOnRail(rt[i], RAILTYPE_MONO) && HasPowerOnRail(rt[i], RAILTYPE_MAGLEV)) { + sort_value[i] += (1 << 19); + } + } + } + + // Then Mono + if (HasPowerOnRail(rt[i], RAILTYPE_MONO)) { + sort_value[i] += (1 << 20); + } + + // Maglev is second last + if (HasPowerOnRail(rt[i], RAILTYPE_MAGLEV)) { + sort_value[i] += (1 << 21); + } + + // All no-speed tracks (like planning and lifted) go to the end + if (GetRailTypeInfo(rt[i])->max_speed == 0) { + sort_value[i] += (1 << 22); + } + } + + return sort_value[0] < sort_value[1]; + } else { + return GetRailTypeInfo(first)->sorting_order < GetRailTypeInfo(second)->sorting_order; + } +} + +void SortRailTypes() +{ + std::sort(_sorted_railtypes.begin(), _sorted_railtypes.end(), CompareRailTypes); } /** @@ -149,7 +199,7 @@ void InitRailTypes() _sorted_railtypes.push_back(rt); } } - std::sort(_sorted_railtypes.begin(), _sorted_railtypes.end(), CompareRailTypes); + SortRailTypes(); for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) { _railtypes[rt].all_compatible_railtypes = _railtypes[rt].compatible_railtypes; diff --git a/src/settings.cpp b/src/settings.cpp index 2c01f57f98..6ec480aecc 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1529,6 +1529,13 @@ static bool VelocityUnitsChanged(int32 p1) { return true; } +static bool ChangeTrackTypeSortMode(int32 p1) { + extern void SortRailTypes(); + SortRailTypes(); + MarkWholeScreenDirty(); + return true; +} + /** Checks if any settings are set to incorrect values, and sets them to correct values in that case. */ static void ValidateSettings() { diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 435157afdb..f5a8af3ce6 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -1837,6 +1837,7 @@ static SettingsContainer &GetSettingsTree() interface->Add(new SettingEntry("gui.show_adv_load_mode_features")); interface->Add(new SettingEntry("gui.disable_top_veh_list_mass_actions")); interface->Add(new SettingEntry("gui.adv_sig_bridge_tun_modes")); + interface->Add(new SettingEntry("gui.sort_track_types_by_speed")); interface->Add(new SettingEntry("gui.show_depot_sell_gui")); interface->Add(new SettingEntry("gui.open_vehicle_gui_clone_share")); interface->Add(new SettingEntry("gui.vehicle_names")); diff --git a/src/settings_type.h b/src/settings_type.h index 6090628402..1ad161930f 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -215,6 +215,7 @@ struct GUISettings : public TimeSettings { bool show_adv_load_mode_features; ///< enable advanced loading mode features in UI bool disable_top_veh_list_mass_actions; ///< disable mass actions buttons for non-group vehicle lists bool adv_sig_bridge_tun_modes; ///< Enable advanced modes for signals on bridges/tunnels. + bool sort_track_types_by_speed; ///< Sorts track types by compatibility first, and speed next, instead of newGRF slot bool show_depot_sell_gui; ///< Show go to depot and sell in UI bool open_vehicle_gui_clone_share; ///< Open vehicle GUI when share-cloning vehicle from depot GUI uint8 linkgraph_colours; ///< linkgraph overlay colours diff --git a/src/table/settings.ini b/src/table/settings.ini index 2cfcfe0d00..7c02b39b9b 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -62,6 +62,7 @@ static bool ViewportMapLandscapeModeChanged(int32 p1); static bool UpdateLinkgraphColours(int32 p1); static bool ClimateThresholdModeChanged(int32 p1); static bool VelocityUnitsChanged(int32 p1); +static bool ChangeTrackTypeSortMode(int32 p1); static bool UpdateClientName(int32 p1); static bool UpdateServerPassword(int32 p1); @@ -5415,6 +5416,15 @@ str = STR_CONFIG_SETTING_ADV_SIG_BRIDGE_TUN_MODES strhelp = STR_CONFIG_SETTING_ADV_SIG_BRIDGE_TUN_MODES_HELPTEXT cat = SC_EXPERT +[SDTC_BOOL] +var = gui.sort_track_types_by_speed +flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC +def = false +str = STR_CONFIG_SETTING_SORT_TRACK_TYPES_BY_SPEED +strhelp = STR_CONFIG_SETTING_SORT_TRACK_TYPES_BY_SPEED_HELPTEXT +proc = ChangeTrackTypeSortMode +cat = SC_EXPERT + [SDTC_BOOL] var = gui.show_depot_sell_gui flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC