diff --git a/src/lang/english.txt b/src/lang/english.txt index ad29b3d596..859cd4f3cf 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1703,6 +1703,9 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Allow trains to STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Change setting value +STR_CONFIG_SETTING_ADJACENT_CROSSINGS :Close adjacent level crossings: {STRING2} +STR_CONFIG_SETTING_ADJACENT_CROSSINGS_HELPTEXT :Closes all adjacent level crossings on parallel tracks whenever one or more is occupied + # Config errors STR_CONFIG_ERROR :{WHITE}Error with the configuration file... STR_CONFIG_ERROR_ARRAY :{WHITE}... error in array '{RAW_STRING}' diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 7127faf7b6..2a9a86eb9a 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -45,6 +45,7 @@ std::vector _sl_xv_discardable_chunk_ids; ///< list of chunks static const uint32 _sl_xv_slxi_chunk_version = 0; ///< current version os SLXI chunk const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { + { XSLFI_ADJACENT_CROSSINGS, XSCF_NULL, 1, 1, "adjacent_crossings", NULL, NULL, NULL }, { XSLFI_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker }; diff --git a/src/saveload/extended_ver_sl.h b/src/saveload/extended_ver_sl.h index a7e9496944..55a4c704c8 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -21,6 +21,7 @@ */ enum SlXvFeatureIndex { XSLFI_NULL = 0, ///< Unused value, to indicate that no extended feature test is in use + XSLFI_ADJACENT_CROSSINGS, ///< Adjacent level crossings closure patch XSLFI_SIZE, ///< Total count of features, including null feature }; diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index f1af4804e4..c89b9f5043 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -1626,6 +1626,7 @@ static SettingsContainer &GetSettingsTree() vehicles->Add(new SettingEntry("order.no_servicing_if_no_breakdowns")); vehicles->Add(new SettingEntry("order.serviceathelipad")); + vehicles->Add(new SettingEntry("vehicle.adjacent_crossings")); } SettingsPage *limitations = main->Add(new SettingsPage(STR_CONFIG_SETTING_LIMITATIONS)); diff --git a/src/settings_type.h b/src/settings_type.h index 41366a7719..61ade2140c 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -462,6 +462,7 @@ struct VehicleSettings { byte extend_vehicle_life; ///< extend vehicle life by this many years byte road_side; ///< the side of the road vehicles drive on uint8 plane_crashes; ///< number of plane crashes, 0 = none, 1 = reduced, 2 = normal + bool adjacent_crossings; ///< enable closing of adjacent level crossings }; /** Settings related to the economy. */ diff --git a/src/table/settings.ini b/src/table/settings.ini index 0b5e55a643..027958ae1e 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -2506,6 +2506,16 @@ def = NULL proc = RedrawScreen cat = SC_BASIC +[SDT_BOOL] +base = GameSettings +var = vehicle.adjacent_crossings +guiflags = SGF_NO_NETWORK +def = true +str = STR_CONFIG_SETTING_ADJACENT_CROSSINGS +strhelp = STR_CONFIG_SETTING_ADJACENT_CROSSINGS_HELPTEXT +cat = SC_BASIC +patxname = ""adjacent_crossings.vehicle.adjacent_crossings"" + ;*************************************************************************** ; Unsaved setting variables. diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 552bbfa97c..b44a69c7bb 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -1723,11 +1723,13 @@ void UpdateLevelCrossing(TileIndex tile, bool sound) Axis axis = GetCrossingRoadAxis(tile); - for (TileIndex t = tile; !is_forced && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == axis; t = TileAddByDiagDir(t, AxisToDiagDir(GetCrossingRoadAxis(t)))) { - is_forced |= CheckLevelCrossing(t); - } - for (TileIndex t = tile; !is_forced && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == axis; t = TileAddByDiagDir(t, ReverseDiagDir(AxisToDiagDir(GetCrossingRoadAxis(t))))) { - is_forced |= CheckLevelCrossing(t); + if (_settings_game.vehicle.adjacent_crossings) { + for (TileIndex t = tile; !is_forced && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == axis; t = TileAddByDiagDir(t, AxisToDiagDir(GetCrossingRoadAxis(t)))) { + is_forced |= CheckLevelCrossing(t); + } + for (TileIndex t = tile; !is_forced && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == axis; t = TileAddByDiagDir(t, ReverseDiagDir(AxisToDiagDir(GetCrossingRoadAxis(t))))) { + is_forced |= CheckLevelCrossing(t); + } } for (TileIndex t = tile; IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == axis; t = TileAddByDiagDir(t, AxisToDiagDir(GetCrossingRoadAxis(t)))) {