diff --git a/src/lang/english.txt b/src/lang/english.txt index 377a0cfcb7..740385f2d4 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2010,6 +2010,10 @@ STR_CONFIG_SETTING_SCENARIO_HOUSE_IGNORE_ZONES_HELPTEXT :Allow manually STR_CONFIG_SETTING_SCENARIO_HOUSE_IGNORE_GRF :Ignore house GRF restrictions: {STRING2} STR_CONFIG_SETTING_SCENARIO_HOUSE_IGNORE_GRF_HELPTEXT :Allow manually adding houses even if this is not permitted by the house GRF. +STR_CONFIG_SETTING_SCENARIO_HOUSE_IGNORE_ZONES_OFF :Off +STR_CONFIG_SETTING_SCENARIO_HOUSE_IGNORE_ZONES_WITHIN_TOWN :Within town +STR_CONFIG_SETTING_SCENARIO_HOUSE_IGNORE_ZONES_ANYWHERE :Anywhere + # 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/settings_type.h b/src/settings_type.h index 5166b16ff1..f1d64ae374 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -663,7 +663,7 @@ struct DebugSettings { struct ScenarioSettings { bool multiple_buildings; ///< allow manually adding more than one church/stadium bool house_ignore_dates; ///< allow manually adding houses regardless of date restrictions - bool house_ignore_zones; ///< allow manually adding houses regardless of zone restrictions + uint8 house_ignore_zones; ///< allow manually adding houses regardless of zone restrictions bool house_ignore_grf; ///< allow manually adding houses regardless of GRF restrictions }; diff --git a/src/table/settings.ini b/src/table/settings.ini index 4bcffb3ce1..add3d8ecd7 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -5341,12 +5341,18 @@ def = false str = STR_CONFIG_SETTING_SCENARIO_HOUSE_IGNORE_DATES strhelp = STR_CONFIG_SETTING_SCENARIO_HOUSE_IGNORE_DATES_HELPTEXT -[SDTC_BOOL] +[SDTC_VAR] var = scenario.house_ignore_zones +type = SLE_UINT8 flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC -def = false +guiflags = SGF_MULTISTRING +def = 0 +min = 0 +max = 2 +interval = 1 str = STR_CONFIG_SETTING_SCENARIO_HOUSE_IGNORE_ZONES strhelp = STR_CONFIG_SETTING_SCENARIO_HOUSE_IGNORE_ZONES_HELPTEXT +strval = STR_CONFIG_SETTING_SCENARIO_HOUSE_IGNORE_ZONES_OFF [SDTC_BOOL] var = scenario.house_ignore_grf diff --git a/src/town_gui.cpp b/src/town_gui.cpp index fc65928847..70e1ba84ab 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -1959,7 +1959,7 @@ static void PlaceProc_House(TileIndex tile) int best_zone = (int)HZB_BEGIN - 1; for (const Town *t : Town::Iterate()) { HouseZonesBits town_zone = TryGetTownRadiusGroup(t, tile); - if (HasBit(house_zones, town_zone) || (_settings_client.scenario.house_ignore_zones && town_zone != HZB_END)) { + if (HasBit(house_zones, town_zone) || (_settings_client.scenario.house_ignore_zones == 1 && town_zone != HZB_END) || _settings_client.scenario.house_ignore_zones == 2) { /* If CTRL is NOT pressed keep only single town on the list, the best one. * Otherwise add all towns to the list so they can be shown to the player. */ if (!_ctrl_pressed) { @@ -1979,6 +1979,13 @@ static void PlaceProc_House(TileIndex tile) return; } + if (towns.size() > 16 && _settings_client.scenario.house_ignore_zones == 2) { + std::sort(towns.begin(), towns.end(), [&](const TownID a, const TownID b) { + return DistanceSquare(tile, Town::Get(a)->xy) < DistanceSquare(tile, Town::Get(a)->xy); + }); + towns.resize(16); + } + CommandContainer cmd = { tile, _cur_house, // p1 - house type and town index (town not yet set)