diff --git a/src/lang/english.txt b/src/lang/english.txt index 0f1fe723ac..f2824f1f87 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2195,6 +2195,11 @@ STR_CONFIG_SETTING_TOWN_TUNNELS_FORBIDDEN :Forbidden STR_CONFIG_SETTING_TOWN_TUNNELS_ALLOWED_OBSTRUCTION :Allowed only for small obstructions STR_CONFIG_SETTING_TOWN_TUNNELS_ALLOWED :Allowed +STR_CONFIG_SETTING_TOWN_MAX_ROAD_SLOPE :Limit towns building continuous inclined roads: {STRING2} +STR_CONFIG_SETTING_TOWN_MAX_ROAD_SLOPE_HELPTEXT :Limit the length of consecutive sloped road tiles which towns will build. This can be used to prevent towns from growing long straight road segments up or down mountain sides +STR_CONFIG_SETTING_TOWN_MAX_ROAD_SLOPE_VALUE :{NUM} tile{P "" s} +STR_CONFIG_SETTING_TOWN_MAX_ROAD_SLOPE_ZERO :No limit + STR_CONFIG_SETTING_NOISE_LEVEL :Allow town controlled noise level for airports: {STRING2} STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :With this setting disabled, there can be two airports in each town. With this setting enabled, the number of airports in a town is limited by the noise acceptance of the town, which depends on population and airport size and distance diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 305d804532..dda7bc24fe 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -494,7 +494,7 @@ extern const RoadBits _invalid_tileh_slopes_road[2][15] = { } }; -static Foundation GetRoadFoundation(Slope tileh, RoadBits bits); +Foundation GetRoadFoundation(Slope tileh, RoadBits bits); void NotifyRoadLayoutChangedIfTileNonLeaf(TileIndex tile, RoadTramType rtt, RoadBits present_bits) { @@ -1831,7 +1831,7 @@ struct DrawRoadTileStruct { * @param bits The RoadBits part * @return The resulting Foundation */ -static Foundation GetRoadFoundation(Slope tileh, RoadBits bits) +Foundation GetRoadFoundation(Slope tileh, RoadBits bits) { /* Flat land and land without a road doesn't require a foundation */ if (tileh == SLOPE_FLAT || bits == ROAD_NONE) return FOUNDATION_NONE; diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 300387a3e9..434a7a3f42 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -2192,6 +2192,7 @@ static SettingsContainer &GetSettingsTree() towns->Add(new SettingEntry("economy.allow_town_roads")); towns->Add(new SettingEntry("economy.allow_town_level_crossings")); towns->Add(new SettingEntry("economy.town_build_tunnels")); + towns->Add(new SettingEntry("economy.town_max_road_slope")); towns->Add(new SettingEntry("economy.found_town")); towns->Add(new SettingEntry("economy.town_cargogen_mode")); towns->Add(new SettingEntry("economy.town_cargo_scale_factor")); diff --git a/src/settings_type.h b/src/settings_type.h index 54b6f43af0..b4fa82c64e 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -689,6 +689,7 @@ struct EconomySettings { bool sharing_payment_in_debt; ///< allow fee payment for companies with more loan than money (switch off to prevent MP exploits) bool allow_town_level_crossings; ///< towns are allowed to build level crossings TownTunnelMode town_build_tunnels; ///< if/when towns are allowed to build road tunnels + uint8 town_max_road_slope; ///< maximum number of consecutive sloped road tiles which towns are allowed to build int8 old_town_cargo_factor; ///< old power-of-two multiplier for town (passenger, mail) generation. May be negative. int16 town_cargo_scale_factor; ///< scaled power-of-two multiplier for town (passenger, mail) generation. May be negative. int16 industry_cargo_scale_factor; ///< scaled power-of-two multiplier for primary industry generation. May be negative. diff --git a/src/table/settings/settings.ini b/src/table/settings/settings.ini index b31ba7a74a..3b17f30aaf 100644 --- a/src/table/settings/settings.ini +++ b/src/table/settings/settings.ini @@ -949,6 +949,20 @@ strval = STR_CONFIG_SETTING_TOWN_TUNNELS_FORBIDDEN cat = SC_BASIC patxname = ""economy.town_build_tunnels"" +[SDT_VAR] +var = economy.town_max_road_slope +type = SLE_UINT8 +flags = SF_GUI_0_IS_SPECIAL +def = 4 +min = 0 +max = 8 +interval = 1 +str = STR_CONFIG_SETTING_TOWN_MAX_ROAD_SLOPE +strhelp = STR_CONFIG_SETTING_TOWN_MAX_ROAD_SLOPE_HELPTEXT +strval = STR_CONFIG_SETTING_TOWN_MAX_ROAD_SLOPE_VALUE +cat = SC_BASIC +patxname = ""economy.town_max_road_slope"" + [SDT_XREF] xref = ""economy.old_town_cargo_factor"" extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 0d5269f947..60fec46843 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -1592,6 +1592,35 @@ static void GrowTownInTile(TileIndex *tile_ptr, RoadBits cur_rb, DiagDirection t break; } + if (_settings_game.economy.town_max_road_slope > 0 && ((rcmd == ROAD_X) || (rcmd == ROAD_Y))) { + /* Limit consecutive sloped road tiles */ + + auto get_road_slope = [rcmd](TileIndex t) -> Slope { + Slope slope = GetTileSlope(t); + extern Foundation GetRoadFoundation(Slope tileh, RoadBits bits); + ApplyFoundationToSlope(GetRoadFoundation(slope, rcmd), &slope); + return slope; + }; + + const Slope slope = get_road_slope(tile); + if (slope != SLOPE_FLAT) { + const int delta = TileOffsByDiagDir(ReverseDiagDir(target_dir)); + bool ok = false; + TileIndex t = tile; + for (uint i = 0; i < _settings_game.economy.town_max_road_slope; i++) { + t += delta; + if (!IsValidTile(t) || !IsNormalRoadTile(t) || GetRoadBits(t, RTT_ROAD) != rcmd || get_road_slope(t) != slope) { + ok = true; + break; + } + } + if (!ok) { + /* All tested tiles had the same incline, disallow road */ + return; + } + } + } + } else if (target_dir < DIAGDIR_END && !(cur_rb & DiagDirToRoadBits(ReverseDiagDir(target_dir)))) { /* Continue building on a partial road. * Should be always OK, so we only generate