diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index 2c34acaf1c..6ea6b1605e 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -374,7 +374,7 @@ static DropDownList BuildTownNameDropDown() static const StringID _elevations[] = {STR_TERRAIN_TYPE_VERY_FLAT, STR_TERRAIN_TYPE_FLAT, STR_TERRAIN_TYPE_HILLY, STR_TERRAIN_TYPE_MOUNTAINOUS, STR_TERRAIN_TYPE_ALPINIST, INVALID_STRING_ID}; static const StringID _sea_lakes[] = {STR_SEA_LEVEL_VERY_LOW, STR_SEA_LEVEL_LOW, STR_SEA_LEVEL_MEDIUM, STR_SEA_LEVEL_HIGH, STR_SEA_LEVEL_CUSTOM, INVALID_STRING_ID}; -static const StringID _rivers[] = {STR_RIVERS_NONE, STR_RIVERS_FEW, STR_RIVERS_MODERATE, STR_RIVERS_LOT, INVALID_STRING_ID}; +static const StringID _rivers[] = {STR_RIVERS_NONE, STR_RIVERS_FEW, STR_RIVERS_MODERATE, STR_RIVERS_LOT, STR_RIVERS_VERY_MANY, STR_RIVERS_EXTREMELY_MANY, INVALID_STRING_ID}; static const StringID _smoothness[] = {STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH, INVALID_STRING_ID}; static const StringID _rotation[] = {STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE, STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE, INVALID_STRING_ID}; static const StringID _landscape[] = {STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL, STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS, INVALID_STRING_ID}; diff --git a/src/landscape.cpp b/src/landscape.cpp index ae890f55ed..f2ff116bfa 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -1059,11 +1059,13 @@ static bool FindSpring(TileIndex tile, void *user_data) if (num < 4) return false; - /* Are we near the top of a hill? */ - for (int dx = -16; dx <= 16; dx++) { - for (int dy = -16; dy <= 16; dy++) { - TileIndex t = TileAddWrap(tile, dx, dy); - if (t != INVALID_TILE && GetTileMaxZ(t) > referenceHeight + 2) return false; + if (_settings_game.game_creation.rivers_top_of_hill) { + /* Are we near the top of a hill? */ + for (int dx = -16; dx <= 16; dx++) { + for (int dy = -16; dy <= 16; dy++) { + TileIndex t = TileAddWrap(tile, dx, dy); + if (t != INVALID_TILE && GetTileMaxZ(t) > referenceHeight + 2) return false; + } } } @@ -1088,7 +1090,7 @@ static bool MakeLake(TileIndex tile, void *user_data) MakeRiver(tile, Random()); /* Remove desert directly around the river tile. */ TileIndex t = tile; - CircularTileSearch(&t, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, nullptr); + CircularTileSearch(&t, _settings_game.game_creation.river_tropics_width, RiverModifyDesertZone, nullptr); return false; } } @@ -1160,7 +1162,7 @@ static void River_FoundEndNode(AyStar *aystar, OpenListNode *current) if (!IsWaterTile(tile)) { MakeRiver(tile, Random()); /* Remove desert directly around the river tile. */ - CircularTileSearch(&tile, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, nullptr); + CircularTileSearch(&tile, _settings_game.game_creation.river_tropics_width, RiverModifyDesertZone, nullptr); } } } @@ -1266,15 +1268,15 @@ static bool FlowRiver(TileIndex spring, TileIndex begin) /* We don't want the lake at the entry of the valley. */ lakeCenter != begin && /* We don't want lakes in the desert. */ - (_settings_game.game_creation.landscape != LT_TROPIC || GetTropicZone(lakeCenter) != TROPICZONE_DESERT) && + (_settings_game.game_creation.landscape != LT_TROPIC || _settings_game.game_creation.lakes_allowed_in_deserts || GetTropicZone(lakeCenter) != TROPICZONE_DESERT) && /* We only want a lake if the river is long enough. */ DistanceManhattan(spring, lakeCenter) > _settings_game.game_creation.min_river_length) { end = lakeCenter; MakeRiver(lakeCenter, Random()); /* Remove desert directly around the river tile. */ - CircularTileSearch(&lakeCenter, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, nullptr); + CircularTileSearch(&lakeCenter, _settings_game.game_creation.river_tropics_width, RiverModifyDesertZone, nullptr); lakeCenter = end; - uint range = RandomRange(8) + 3; + uint range = RandomRange(_settings_game.game_creation.lake_size) + 3; CircularTileSearch(&lakeCenter, range, MakeLake, &height); /* Call the search a second time so artefacts from going circular in one direction get (mostly) hidden. */ lakeCenter = end; diff --git a/src/lang/english.txt b/src/lang/english.txt index 9fa67d3e10..f4d3d6628a 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1109,6 +1109,8 @@ STR_RIVERS_NONE :None STR_RIVERS_FEW :Few STR_RIVERS_MODERATE :Medium STR_RIVERS_LOT :Many +STR_RIVERS_VERY_MANY :{RED}Very many +STR_RIVERS_EXTREMELY_MANY :{RED}Extremely many STR_DISASTER_NONE :None STR_DISASTER_REDUCED :Reduced @@ -1457,6 +1459,18 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Rough STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Very Rough STR_CONFIG_SETTING_VARIETY :Variety distribution: {STRING2} STR_CONFIG_SETTING_VARIETY_HELPTEXT :(TerraGenesis only) Control whether the map contains both mountainous and flat areas. Since this only makes the map flatter, other settings should be set to mountainous +STR_CONFIG_SETTING_RIVER_MIN_LENGTH :River min length: {STRING} +STR_CONFIG_SETTING_RIVER_MIN_LENGTH_HELPTEXT :Minimum length of rivers. This also controls the creation of lakes. +STR_CONFIG_SETTING_RIVER_ROUTE_RANDOM :River route randomness: {STRING} +STR_CONFIG_SETTING_RIVER_ROUTE_RANDOM_HELPTEXT :Choose how random a rivers path may be. +STR_CONFIG_SETTING_RIVERS_TOP_OF_HILL :Rivers require their springs to generate at the top of hills: {STRING} +STR_CONFIG_SETTING_RIVERS_TOP_OF_HILL_HELPTEXT :Choose whether rivers require their springs to generate towards the top of hills. +STR_CONFIG_SETTING_RIVER_TROPICS_WIDTH :Tropics width around rivers: {STRING} +STR_CONFIG_SETTING_RIVER_TROPICS_WIDTH_HELPTEXT :Controls the width of the tropic zone that surrounds rivers in sub-tropic landscape. +STR_CONFIG_SETTING_LAKE_SIZE :Size of lakes: {STRING} +STR_CONFIG_SETTING_LAKE_SIZE_HELPTEXT :Controls the size of lakes that are generated along rivers. +STR_CONFIG_SETTING_LAKES_ALLOWED_IN_DESERTS :Lakes can be generated in sub-tropic climate deserts: {STRING} +STR_CONFIG_SETTING_LAKES_ALLOWED_IN_DESERTS_HELPTEXT :Choose whether the lakes that spawn along rivers are allowed in deserts. STR_CONFIG_SETTING_RIVER_AMOUNT :River amount: {STRING2} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Choose how many rivers to generate STR_CONFIG_SETTING_ROCKS_AMOUNT :Size of rocky patches: {STRING} @@ -2014,6 +2028,7 @@ STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Routing STR_CONFIG_SETTING_LIMITATIONS :{ORANGE}Limitations STR_CONFIG_SETTING_ACCIDENTS :{ORANGE}Disasters / Accidents STR_CONFIG_SETTING_GENWORLD :{ORANGE}World generation +STR_CONFIG_SETTING_GENWORLD_RIVERS_LAKES :{ORANGE}Rivers & Lakes STR_CONFIG_SETTING_ENVIRONMENT :{ORANGE}Environment STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :{ORANGE}Authorities STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}Towns diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 2a23d433c4..6e0430512e 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -1815,7 +1815,16 @@ static SettingsContainer &GetSettingsTree() genworld->Add(new SettingEntry("game_creation.variety")); genworld->Add(new SettingEntry("game_creation.snow_line_height")); genworld->Add(new SettingEntry("game_creation.rainforest_line_height")); - genworld->Add(new SettingEntry("game_creation.amount_of_rivers")); + SettingsPage *rivers = genworld->Add(new SettingsPage(STR_CONFIG_SETTING_GENWORLD_RIVERS_LAKES)); + { + rivers->Add(new SettingEntry("game_creation.amount_of_rivers")); + rivers->Add(new SettingEntry("game_creation.min_river_length")); + rivers->Add(new SettingEntry("game_creation.river_route_random")); + rivers->Add(new SettingEntry("game_creation.rivers_top_of_hill")); + rivers->Add(new SettingEntry("game_creation.river_tropics_width")); + rivers->Add(new SettingEntry("game_creation.lake_size")); + rivers->Add(new SettingEntry("game_creation.lakes_allowed_in_deserts")); + } genworld->Add(new SettingEntry("game_creation.amount_of_rocks")); genworld->Add(new SettingEntry("game_creation.height_affects_rocks")); genworld->Add(new SettingEntry("game_creation.tree_placer")); diff --git a/src/settings_type.h b/src/settings_type.h index 3fb5005739..307229cf95 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -375,6 +375,10 @@ struct GameCreationSettings { byte min_river_length; ///< the minimum river length byte river_route_random; ///< the amount of randomicity for the route finding byte amount_of_rivers; ///< the amount of rivers + bool rivers_top_of_hill; ///< do rivers require starting near the tops of hills? + uint8 river_tropics_width; ///< the configured width of tropics around rivers + uint8 lake_size; ///< how large can lakes get? + bool lakes_allowed_in_deserts; ///< are lakes allowed in deserts? uint8 amount_of_rocks; ///< the amount of rocks uint8 height_affects_rocks; ///< the affect that map height has on rocks }; diff --git a/src/table/settings.ini b/src/table/settings.ini index 8239739db2..fa3812aced 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -3803,21 +3803,78 @@ cat = SC_BASIC base = GameSettings var = game_creation.min_river_length type = SLE_UINT8 +guiflags = SGF_NEWGAME_ONLY | SGF_SCENEDIT_TOO from = SLV_163 def = 16 min = 2 max = 255 cat = SC_EXPERT +str = STR_CONFIG_SETTING_RIVER_MIN_LENGTH +strhelp = STR_CONFIG_SETTING_RIVER_MIN_LENGTH_HELPTEXT +strval = STR_JUST_COMMA [SDT_VAR] base = GameSettings var = game_creation.river_route_random type = SLE_UINT8 +guiflags = SGF_NEWGAME_ONLY | SGF_SCENEDIT_TOO from = SLV_163 def = 5 min = 1 max = 255 cat = SC_EXPERT +str = STR_CONFIG_SETTING_RIVER_ROUTE_RANDOM +strhelp = STR_CONFIG_SETTING_RIVER_ROUTE_RANDOM_HELPTEXT +strval = STR_JUST_COMMA + +[SDT_BOOL] +base = GameSettings +var = game_creation.rivers_top_of_hill +guiflags = SGF_NEWGAME_ONLY | SGF_SCENEDIT_TOO +def = true +cat = SC_EXPERT +str = STR_CONFIG_SETTING_RIVERS_TOP_OF_HILL +strhelp = STR_CONFIG_SETTING_RIVERS_TOP_OF_HILL_HELPTEXT +patxname = ""rivers.game_creation.rivers_top_of_hill"" + +[SDT_VAR] +base = GameSettings +var = game_creation.river_tropics_width +type = SLE_UINT8 +guiflags = SGF_NEWGAME_ONLY | SGF_SCENEDIT_TOO +def = 5 +min = 1 +max = 12 +interval = 1 +str = STR_CONFIG_SETTING_RIVER_TROPICS_WIDTH +strhelp = STR_CONFIG_SETTING_RIVER_TROPICS_WIDTH_HELPTEXT +strval = STR_JUST_COMMA +cat = SC_BASIC +patxname = ""rivers.game_creation.river_tropics_width"" + +[SDT_VAR] +base = GameSettings +var = game_creation.lake_size +type = SLE_UINT8 +guiflags = SGF_NEWGAME_ONLY | SGF_SCENEDIT_TOO +def = 8 +min = 1 +max = 100 +cat = SC_EXPERT +str = STR_CONFIG_SETTING_LAKE_SIZE +strhelp = STR_CONFIG_SETTING_LAKE_SIZE_HELPTEXT +strval = STR_JUST_COMMA +patxname = ""rivers.game_creation.lake_size"" + +[SDT_BOOL] +base = GameSettings +var = game_creation.lakes_allowed_in_deserts +guiflags = SGF_NEWGAME_ONLY | SGF_SCENEDIT_TOO +def = false +cat = SC_EXPERT +str = STR_CONFIG_SETTING_LAKES_ALLOWED_IN_DESERTS +strhelp = STR_CONFIG_SETTING_LAKES_ALLOWED_IN_DESERTS_HELPTEXT +patxname = ""rivers.game_creation.lakes_allowed_in_deserts"" [SDT_VAR] base = GameSettings @@ -3827,7 +3884,7 @@ from = SLV_163 guiflags = SGF_MULTISTRING | SGF_NEWGAME_ONLY def = 2 min = 0 -max = 3 +max = 5 str = STR_CONFIG_SETTING_RIVER_AMOUNT strhelp = STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT strval = STR_RIVERS_NONE diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 9fb23c47ac..b83d95cbfa 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -504,7 +504,7 @@ CommandCost CmdBuildCanal(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 MakeRiver(tile, Random()); if (_game_mode == GM_EDITOR) { TileIndex tile2 = tile; - CircularTileSearch(&tile2, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, nullptr); + CircularTileSearch(&tile2, _settings_game.game_creation.river_tropics_width, RiverModifyDesertZone, nullptr); } break;