diff --git a/src/lang/english.txt b/src/lang/english.txt index 1a221a4aff..6dac2fbb06 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1123,6 +1123,7 @@ STR_TERRAIN_TYPE_HILLY :Hilly STR_TERRAIN_TYPE_MOUNTAINOUS :Mountainous STR_TERRAIN_TYPE_ALPINIST :Alpinist +STR_CITY_APPROVAL_INDIFFERENT :Indifferent STR_CITY_APPROVAL_PERMISSIVE :Permissive STR_CITY_APPROVAL_TOLERANT :Tolerant STR_CITY_APPROVAL_HOSTILE :Hostile diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 14713afcb2..b2b6e213fc 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -1123,6 +1123,7 @@ STR_TERRAIN_TYPE_HILLY :언덕 STR_TERRAIN_TYPE_MOUNTAINOUS :산 STR_TERRAIN_TYPE_ALPINIST :매우 험한 산지 +STR_CITY_APPROVAL_INDIFFERENT :무관심 STR_CITY_APPROVAL_PERMISSIVE :신경 안씀 STR_CITY_APPROVAL_TOLERANT :신경 씀 STR_CITY_APPROVAL_HOSTILE :싫어함 diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index c1c3dd7761..e3a1c21b25 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2304,6 +2304,8 @@ uint8 GetAirportNoiseLevelForDistance(const AirportSpec *as, uint distance) * So no need to go any further*/ if (as->noise_level < 2) return as->noise_level; + if (_settings_game.difficulty.town_council_tolerance == TOWN_COUNCIL_INDIFFERENT) return 1; + /* The steps for measuring noise reduction are based on the "magical" (and arbitrary) 8 base distance * adding the town_council_tolerance 4 times, as a way to graduate, depending of the tolerance. * Basically, it says that the less tolerant a town is, the bigger the distance before diff --git a/src/table/settings.ini b/src/table/settings.ini index 5401bf924a..a342e80357 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -106,6 +106,13 @@ static const SettingDescEnumEntry _linkgraph_mode_per_cargo[] = { { DT_ASYMMETRIC_NEAR, STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC_NEAREST }, { 0, STR_NULL } }; +static const SettingDescEnumEntry _town_council_approval[] = { +{ 255, STR_CITY_APPROVAL_INDIFFERENT }, +{ 0, STR_CITY_APPROVAL_PERMISSIVE }, +{ 1, STR_CITY_APPROVAL_TOLERANT }, +{ 2, STR_CITY_APPROVAL_HOSTILE }, +{ 0, STR_NULL } +}; static const SettingDescEnumEntry _train_braking_model[] = { { TBM_ORIGINAL, STR_CONFIG_SETTING_ORIGINAL }, @@ -375,19 +382,15 @@ str = STR_CONFIG_SETTING_DISASTERS strhelp = STR_CONFIG_SETTING_DISASTERS_HELPTEXT cat = SC_BASIC -[SDT_VAR] +[SDT_ENUM] base = GameSettings var = difficulty.town_council_tolerance type = SLE_UINT8 from = SLV_97 -guiflags = SGF_MULTISTRING def = 0 -min = 0 -max = 2 -interval = 1 +enumlist = _town_council_approval str = STR_CONFIG_SETTING_CITY_APPROVAL strhelp = STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT -strval = STR_CITY_APPROVAL_PERMISSIVE proc = DifficultyNoiseChange [SDT_BOOL] diff --git a/src/town.h b/src/town.h index 5552c8ccd7..cca54689eb 100644 --- a/src/town.h +++ b/src/town.h @@ -38,6 +38,8 @@ static const uint TOWN_GROWTH_DESERT = 0xFFFFFFFF; ///< The town needs the cargo static const uint16 TOWN_GROWTH_RATE_NONE = 0xFFFF; ///< Special value for Town::growth_rate to disable town growth. static const uint16 MAX_TOWN_GROWTH_TICKS = 930; ///< Max amount of original town ticks that still fit into uint16, about equal to UINT16_MAX / TOWN_GROWTH_TICKS but slightly less to simplify calculations +static const byte TOWN_COUNCIL_INDIFFERENT = 0xFF; + typedef Pool TownPool; extern TownPool _town_pool; @@ -148,7 +150,7 @@ struct Town : TownPool::PoolItem<&_town_pool> { */ inline uint16 MaxTownNoise() const { - if (this->cache.population == 0) return 0; // no population? no noise + if (this->cache.population == 0 || _settings_game.difficulty.town_council_tolerance == TOWN_COUNCIL_INDIFFERENT) return 0; // no population? no noise /* 3 is added (the noise of the lowest airport), so the user can at least build a small airfield. */ return (this->cache.population / _settings_game.economy.town_noise_population[_settings_game.difficulty.town_council_tolerance]) + 3; diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index fd9bf169f3..817eb49926 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -809,7 +809,10 @@ static CommandCost ClearTile_Town(TileIndex tile, DoCommandFlag flags) Town *t = Town::GetByTile(tile); if (Company::IsValidID(_current_company)) { - if (rating > t->ratings[_current_company] && !(flags & DC_NO_TEST_TOWN_RATING) && !_cheats.magic_bulldozer.value) { + if (rating > t->ratings[_current_company] + && !(flags & DC_NO_TEST_TOWN_RATING) + && !_cheats.magic_bulldozer.value + && _settings_game.difficulty.town_council_tolerance != TOWN_COUNCIL_INDIFFERENT) { SetDParam(0, t->index); return_cmd_error(STR_ERROR_LOCAL_AUTHORITY_REFUSES_TO_ALLOW_THIS); } @@ -3886,7 +3889,7 @@ CommandCost CheckIfAuthorityAllowsNewStation(TileIndex tile, DoCommandFlag flags Town *t = ClosestTownFromTile(tile, _settings_game.economy.dist_local_authority); if (t == nullptr) return CommandCost(); - if (t->ratings[_current_company] > RATING_VERYPOOR) return CommandCost(); + if (t->ratings[_current_company] > RATING_VERYPOOR || _settings_game.difficulty.town_council_tolerance == TOWN_COUNCIL_INDIFFERENT) return CommandCost(); SetDParam(0, t->index); return_cmd_error(STR_ERROR_LOCAL_AUTHORITY_REFUSES_TO_ALLOW_THIS); @@ -4047,6 +4050,10 @@ CommandCost CheckforTownRating(DoCommandFlag flags, Town *t, TownRatingCheckType return CommandCost(); } + if (_settings_game.difficulty.town_council_tolerance == TOWN_COUNCIL_INDIFFERENT) { + return CommandCost(); + } + /* minimum rating needed to be allowed to remove stuff */ static const int needed_rating[][TOWN_RATING_CHECK_TYPE_COUNT] = { /* ROAD_REMOVE, TUNNELBRIDGE_REMOVE */