Add setting to limit length of continuous inclined roads built by towns

Default to max 4 tiles
This commit is contained in:
Jonathan G Rennison
2022-10-10 18:14:09 +01:00
parent 1e4912cf78
commit 846cd7e228
6 changed files with 52 additions and 2 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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"));

View File

@@ -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.

View File

@@ -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)

View File

@@ -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