diff --git a/data/json/regional_map_settings.json b/data/json/regional_map_settings.json index e62571e8276d8..4f21304f24c21 100644 --- a/data/json/regional_map_settings.json +++ b/data/json/regional_map_settings.json @@ -310,6 +310,14 @@ "river_floodplain_buffer_distance_min": 3, "river_floodplain_buffer_distance_max": 15 }, + "overmap_connection_settings": { + "intra_city_road_connection": "local_road", + "inter_city_road_connection": "local_road", + "trail_connection": "forest_trail", + "sewer_connection": "sewer_tunnel", + "subway_connection": "subway_tunnel", + "rail_connection": "local_railroad" + }, "forest_mapgen_settings": { "forest": { "terrains": [ "forest", "special_forest" ], diff --git a/data/mods/Backrooms/regional_map_settings.json b/data/mods/Backrooms/regional_map_settings.json index dbcde27c13167..77e3fa7e1e19a 100644 --- a/data/mods/Backrooms/regional_map_settings.json +++ b/data/mods/Backrooms/regional_map_settings.json @@ -65,6 +65,14 @@ "river_floodplain_buffer_distance_min": 0, "river_floodplain_buffer_distance_max": 0 }, + "overmap_connection_settings": { + "intra_city_road_connection": "local_road", + "inter_city_road_connection": "local_road", + "trail_connection": "forest_trail", + "sewer_connection": "sewer_tunnel", + "subway_connection": "subway_tunnel", + "rail_connection": "local_railroad" + }, "forest_mapgen_settings": { "forest": { "sparseness_adjacency_factor": 3, diff --git a/data/mods/No_Hope/regional_map_settings.json b/data/mods/No_Hope/regional_map_settings.json index b3d7746df6f1f..7f10f07d8860a 100644 --- a/data/mods/No_Hope/regional_map_settings.json +++ b/data/mods/No_Hope/regional_map_settings.json @@ -283,6 +283,14 @@ "river_floodplain_buffer_distance_min": 3, "river_floodplain_buffer_distance_max": 15 }, + "overmap_connection_settings": { + "intra_city_road_connection": "local_road", + "inter_city_road_connection": "local_road", + "trail_connection": "forest_trail", + "sewer_connection": "sewer_tunnel", + "subway_connection": "subway_tunnel", + "rail_connection": "local_railroad" + }, "forest_mapgen_settings": { "forest": { "terrains": [ "forest", "special_forest" ], diff --git a/data/mods/TEST_DATA/regions.json b/data/mods/TEST_DATA/regions.json index 17e86d83865a3..0ad90c255b7d4 100644 --- a/data/mods/TEST_DATA/regions.json +++ b/data/mods/TEST_DATA/regions.json @@ -49,6 +49,14 @@ "river_floodplain_buffer_distance_min": 1, "river_floodplain_buffer_distance_max": 6 }, + "overmap_connection_settings": { + "intra_city_road_connection": "local_road", + "inter_city_road_connection": "local_road", + "trail_connection": "forest_trail", + "sewer_connection": "sewer_tunnel", + "subway_connection": "subway_tunnel", + "rail_connection": "local_railroad" + }, "forest_mapgen_settings": { "forest": { "sparseness_adjacency_factor": 3, diff --git a/data/mods/TropiCataclysm/tropical_regional_map_settings.json b/data/mods/TropiCataclysm/tropical_regional_map_settings.json index df73774882e65..ea4740528731d 100644 --- a/data/mods/TropiCataclysm/tropical_regional_map_settings.json +++ b/data/mods/TropiCataclysm/tropical_regional_map_settings.json @@ -336,6 +336,14 @@ "river_floodplain_buffer_distance_min": 3, "river_floodplain_buffer_distance_max": 15 }, + "overmap_connection_settings": { + "intra_city_road_connection": "local_road", + "inter_city_road_connection": "local_road", + "trail_connection": "forest_trail", + "sewer_connection": "sewer_tunnel", + "subway_connection": "subway_tunnel", + "rail_connection": "local_railroad" + }, "forest_mapgen_settings": { "forest": { "terrains": [ "forest", "special_forest" ], diff --git a/data/mods/aftershock_exoplanet/region_settings.json b/data/mods/aftershock_exoplanet/region_settings.json index ca66ddff02f4a..d1e74d1712655 100644 --- a/data/mods/aftershock_exoplanet/region_settings.json +++ b/data/mods/aftershock_exoplanet/region_settings.json @@ -110,6 +110,14 @@ "river_floodplain_buffer_distance_min": 3, "river_floodplain_buffer_distance_max": 15 }, + "overmap_connection_settings": { + "intra_city_road_connection": "local_road", + "inter_city_road_connection": "local_road", + "trail_connection": "forest_trail", + "sewer_connection": "sewer_tunnel", + "subway_connection": "subway_tunnel", + "rail_connection": "local_railroad" + }, "forest_mapgen_settings": { "forest": { "sparseness_adjacency_factor": 9, diff --git a/data/mods/classic_zombies/alberta_regional_map_settings.json b/data/mods/classic_zombies/alberta_regional_map_settings.json index ff045c8b25a96..1fc6ad7171e28 100644 --- a/data/mods/classic_zombies/alberta_regional_map_settings.json +++ b/data/mods/classic_zombies/alberta_regional_map_settings.json @@ -269,6 +269,14 @@ "river_floodplain_buffer_distance_min": 3, "river_floodplain_buffer_distance_max": 15 }, + "overmap_connection_settings": { + "intra_city_road_connection": "local_road", + "inter_city_road_connection": "local_road", + "trail_connection": "forest_trail", + "sewer_connection": "sewer_tunnel", + "subway_connection": "subway_tunnel", + "rail_connection": "local_railroad" + }, "forest_mapgen_settings": { "forest": { "terrains": [ "forest", "special_forest" ], diff --git a/data/mods/desert_region/desert_regional_map_settings.json b/data/mods/desert_region/desert_regional_map_settings.json index 2ab636a7a34f6..995d81d58bbb9 100644 --- a/data/mods/desert_region/desert_regional_map_settings.json +++ b/data/mods/desert_region/desert_regional_map_settings.json @@ -89,6 +89,14 @@ "river_floodplain_buffer_distance_min": 3, "river_floodplain_buffer_distance_max": 15 }, + "overmap_connection_settings": { + "intra_city_road_connection": "local_road", + "inter_city_road_connection": "local_road", + "trail_connection": "forest_trail", + "sewer_connection": "sewer_tunnel", + "subway_connection": "subway_tunnel", + "rail_connection": "local_railroad" + }, "forest_mapgen_settings": { "forest": { "terrains": [ "forest" ], diff --git a/data/mods/rural_biome/rural_regional_map_settings.json b/data/mods/rural_biome/rural_regional_map_settings.json index 8eb334f2d2521..7dd01a14a5258 100644 --- a/data/mods/rural_biome/rural_regional_map_settings.json +++ b/data/mods/rural_biome/rural_regional_map_settings.json @@ -206,6 +206,14 @@ "river_floodplain_buffer_distance_min": 3, "river_floodplain_buffer_distance_max": 15 }, + "overmap_connection_settings": { + "intra_city_road_connection": "local_road", + "inter_city_road_connection": "local_road", + "trail_connection": "forest_trail", + "sewer_connection": "sewer_tunnel", + "subway_connection": "subway_tunnel", + "rail_connection": "local_railroad" + }, "forest_mapgen_settings": { "forest": { "terrains": [ "forest" ], diff --git a/doc/REGION_SETTINGS.md b/doc/REGION_SETTINGS.md index 618b38e098cd2..71ec060759c4a 100644 --- a/doc/REGION_SETTINGS.md +++ b/doc/REGION_SETTINGS.md @@ -389,6 +389,32 @@ trailheads, and some general tuning of the actual trail width/position in mapgen } ``` +## Forest Trail Settings + +The **overmap_connection_settings** section defines the `overmap_connection_id`s used in hardcoded placement. + +### Fields + +| Identifier | Description | +| ---------------------------- | --------------------------------------------------------------------------------------------------------------- | +| `intra_city_road_connection` | overmap_connection id used within cities. Should include locations for road, city_center and road_nesw_manhole. | +| `inter_city_road_connection` | overmap_connection id used between cities. Should include locations for the intra city terrains. | +| `trail_connection` | overmap_connection id used for forest trails. | +| `sewer_connection` | overmap_connection id used for sewer connections. | +| `subway_connection` | overmap_connection id used for for both z-2 and z-4 subway connections. | +| `rail_connection` | overmap_connection id used for rail connections. ( Unused in vanilla as of 0.H ) | + +### Example + +```json +{ + "overmap_connection_settings": { + "intra_city_road_connection": "cobbled_road", + "inter_city_road_connection": "rural_road" + } +} +``` + ## City The **city** section defines the possible overmap terrains and specials that may be used as diff --git a/src/overmap.cpp b/src/overmap.cpp index 7a130197f0c30..438a2b11a3203 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -132,12 +132,6 @@ static const oter_type_str_id oter_type_slimepit_down( "slimepit_down" ); static const oter_type_str_id oter_type_solid_earth( "solid_earth" ); static const oter_type_str_id oter_type_sub_station( "sub_station" ); -static const overmap_connection_id overmap_connection_forest_trail( "forest_trail" ); -static const overmap_connection_id overmap_connection_local_railroad( "local_railroad" ); -static const overmap_connection_id overmap_connection_local_road( "local_road" ); -static const overmap_connection_id overmap_connection_sewer_tunnel( "sewer_tunnel" ); -static const overmap_connection_id overmap_connection_subway_tunnel( "subway_tunnel" ); - static const overmap_location_id overmap_location_land( "land" ); static const overmap_location_id overmap_location_swamp( "swamp" ); @@ -3621,6 +3615,8 @@ bool overmap::generate_sub( const int z ) for( city &i : goo_points ) { requires_sub |= build_slimepit( tripoint_om_omt( i.pos, z ), i.size ); } + const overmap_connection_id &overmap_connection_sewer_tunnel = + settings->overmap_connection.sewer_connection; connect_closest_points( sewer_points, z, *overmap_connection_sewer_tunnel ); // A third of overmaps have labs with a 1-in-2 chance of being subway connected. @@ -3701,6 +3697,8 @@ bool overmap::generate_sub( const int z ) subway_points.insert( subway_points.end(), subway_lab_train_points.begin(), subway_lab_train_points.end() ); + const overmap_connection_id &overmap_connection_subway_tunnel = + settings->overmap_connection.subway_connection; connect_closest_points( subway_points, z, *overmap_connection_subway_tunnel ); for( auto &i : subway_points ) { @@ -3710,7 +3708,8 @@ bool overmap::generate_sub( const int z ) } // The first lab point is adjacent to a lab, set it a depot (as long as track was actually laid). - const auto create_train_depots = [this, z]( const oter_id & train_type, + const auto create_train_depots = [this, z, + overmap_connection_subway_tunnel]( const oter_id & train_type, const std::vector &train_points ) { bool is_first_in_pair = true; std::vector extra_route; @@ -4487,6 +4486,8 @@ void overmap::place_forest_trails() } // Finally, connect all the points and make a forest trail out of them. + const overmap_connection_id &overmap_connection_forest_trail = + settings->overmap_connection.trail_connection; connect_closest_points( chosen_points, 0, *overmap_connection_forest_trail ); } } @@ -5101,7 +5102,9 @@ void overmap::place_roads( const overmap *north, const overmap *east, const over if( op_city_size <= 0 ) { return; } - std::vector &roads_out = connections_out[overmap_connection_local_road]; + const overmap_connection_id &overmap_connection_inter_city_road = + settings->overmap_connection.inter_city_road_connection; + std::vector &roads_out = connections_out[overmap_connection_inter_city_road]; // At least 3 exit points, to guarantee road continuity across overmaps if( roads_out.size() < 3 ) { @@ -5163,7 +5166,7 @@ void overmap::place_roads( const overmap *north, const overmap *east, const over } // And finally connect them via roads. - connect_closest_points( road_points, 0, *overmap_connection_local_road ); + connect_closest_points( road_points, 0, *overmap_connection_inter_city_road ); } void overmap::place_railroads( const overmap *north, const overmap *east, const overmap *south, @@ -5174,6 +5177,8 @@ void overmap::place_railroads( const overmap *north, const overmap *east, const if( op_city_size <= 0 ) { return; } + const overmap_connection_id &overmap_connection_local_railroad = + settings->overmap_connection.rail_connection; std::vector &railroads_out = connections_out[overmap_connection_local_railroad]; // At least 3 exit points, to guarantee railroad continuity across overmaps @@ -5481,7 +5486,9 @@ void overmap::place_cities() omts_per_city ); } - const overmap_connection &local_road( *overmap_connection_local_road ); + const overmap_connection_id &overmap_connection_intra_city_road = + settings->overmap_connection.intra_city_road_connection; + const overmap_connection &local_road( *overmap_connection_intra_city_road ); // if there is only a single free tile, the probability of NOT finding it after MAX_PLACEMENT_ATTEMPTS attempts // is (1 - 1/(OMAPX * OMAPY))^MAX_PLACEMENT_ATTEMPTS ≈ 36% for the OMAPX=OMAPY=180 and MAX_PLACEMENT_ATTEMPTS=OMAPX * OMAPY diff --git a/src/regional_settings.cpp b/src/regional_settings.cpp index 8483ea0deae1d..3dbbe1dcacead 100644 --- a/src/regional_settings.cpp +++ b/src/regional_settings.cpp @@ -322,6 +322,33 @@ static void load_overmap_ravine_settings( } } +static void load_overmap_connection_settings( + const JsonObject &jo, overmap_connection_settings &overmap_connection_settings, const bool strict, + const bool overlay ) +{ + if( !jo.has_object( "overmap_connection_settings" ) ) { + if( strict ) { + jo.throw_error( "\"overmap_connection_settings\": { … } required for default" ); + } + } else { + JsonObject overmap_connection_settings_jo = jo.get_object( "overmap_connection_settings" ); + read_and_set_or_throw( overmap_connection_settings_jo, "trail_connection", + overmap_connection_settings.trail_connection, !overlay ); + read_and_set_or_throw( overmap_connection_settings_jo, "sewer_connection", + overmap_connection_settings.sewer_connection, !overlay ); + read_and_set_or_throw( overmap_connection_settings_jo, "subway_connection", + overmap_connection_settings.subway_connection, !overlay ); + read_and_set_or_throw( overmap_connection_settings_jo, "rail_connection", + overmap_connection_settings.rail_connection, !overlay ); + read_and_set_or_throw( overmap_connection_settings_jo, + "intra_city_road_connection", + overmap_connection_settings.intra_city_road_connection, !overlay ); + read_and_set_or_throw( overmap_connection_settings_jo, + "inter_city_road_connection", + overmap_connection_settings.inter_city_road_connection, !overlay ); + } +} + static void load_overmap_lake_settings( const JsonObject &jo, overmap_lake_settings &overmap_lake_settings, const bool strict, const bool overlay ) @@ -568,6 +595,8 @@ void load_region_settings( const JsonObject &jo ) load_overmap_ravine_settings( jo, new_region.overmap_ravine, strict, false ); + load_overmap_connection_settings( jo, new_region.overmap_connection, strict, false ); + load_region_terrain_and_furniture_settings( jo, new_region.region_terrain_and_furniture, strict, false ); @@ -713,8 +742,12 @@ void apply_region_overlay( const JsonObject &jo, regional_settings ®ion ) load_overmap_lake_settings( jo, region.overmap_lake, false, true ); + load_overmap_ocean_settings( jo, region.overmap_ocean, false, true ); + load_overmap_ravine_settings( jo, region.overmap_ravine, false, true ); + load_overmap_connection_settings( jo, region.overmap_connection, false, true ); + load_region_terrain_and_furniture_settings( jo, region.region_terrain_and_furniture, false, true ); } diff --git a/src/regional_settings.h b/src/regional_settings.h index 2551f4a83981d..f5afed699299e 100644 --- a/src/regional_settings.h +++ b/src/regional_settings.h @@ -233,6 +233,18 @@ struct overmap_ravine_settings { overmap_ravine_settings() = default; }; +struct overmap_connection_settings { + overmap_connection_id trail_connection; + overmap_connection_id sewer_connection; + overmap_connection_id subway_connection; + overmap_connection_id rail_connection; + overmap_connection_id intra_city_road_connection; + overmap_connection_id inter_city_road_connection; + + void finalize(); + overmap_connection_settings() = default; +}; + struct map_extras { unsigned int chance; weighted_int_list values; @@ -275,6 +287,7 @@ struct regional_settings { overmap_lake_settings overmap_lake; overmap_ocean_settings overmap_ocean; overmap_ravine_settings overmap_ravine; + overmap_connection_settings overmap_connection; region_terrain_and_furniture_settings region_terrain_and_furniture; std::unordered_map region_extras;