@@ -2342,13 +2342,16 @@ bool get_provinces_part_of_rr_path(sys::state& state, std::vector<bool>& visited
2342
2342
return true ;
2343
2343
}
2344
2344
2345
- glm::vec2 get_node (sys::state& state, glm::vec2 center, int i, int j) {
2345
+ glm::vec2 get_node (sys::state& state, glm::vec2 center, int i, int j, int size_x, int size_y ) {
2346
2346
const auto rpx = rng::get_random (state, j ^ i ^ (uint32_t )center.x , i);
2347
2347
const float rx = (float (rng::reduce (uint32_t (rpx), 8192 )) / (8192 .f )) - 0 .5f ;
2348
2348
const auto rpy = rng::get_random (state, j ^ i ^ (uint32_t )center.y ^ 5653 , j);
2349
2349
const float ry = (float (rng::reduce (uint32_t (rpy), 8192 )) / (8192 .f )) - 0 .5f ;
2350
2350
2351
- auto base_shift = glm::vec2{ (float )i + rx, (float )j + ry } * 0 .4f / sqrt (sqrt ((float ) (i * i) + (float ) (j * j) + 1 ));
2351
+ auto scale_x = (float )size_x / 5600 .f ;
2352
+ auto scale_y = (float )size_y / 2160 .f ;
2353
+
2354
+ auto base_shift = glm::vec2{ ((float )i + rx) * scale_x, ((float )j + ry) * scale_y} * 0 .4f / sqrt (sqrt ((float ) (i * i) + (float ) (j * j) + 1 ));
2352
2355
return center + base_shift;
2353
2356
}
2354
2357
@@ -2362,25 +2365,29 @@ void display_data::update_sprawl(sys::state& state) {
2362
2365
std::vector<std::vector<glm::vec2>> connectors{};
2363
2366
connectors.resize (state.world .province_size ());
2364
2367
2368
+ auto minimal_population_per_visible_settlement = 2500 .f ;
2369
+
2365
2370
// Populate paths with railroads - only account provinces that have been visited
2366
2371
// but not the adjacencies
2367
2372
for (const auto p : state.world .in_province ) {
2368
2373
2369
2374
auto rural_population = 0 .f ;
2370
- for (auto wt : state.culture_definitions .rgo_workers ) {
2371
- rural_population += state.world .province_get_demographics (p, demographics::to_key (state, wt));
2375
+ for (auto pt : state.world .in_pop_type ) {
2376
+ if (pt.get_is_paid_rgo_worker ())
2377
+ rural_population += state.world .province_get_demographics (p, demographics::to_key (state, pt));
2372
2378
}
2373
- rural_population += state.world .province_get_demographics (p, demographics::to_employment_key (state, state.culture_definitions .slaves ));
2374
-
2379
+ rural_population += state.world .province_get_demographics (p, demographics::to_key (state, state.culture_definitions .slaves ));
2380
+ rural_population += state. world . province_get_demographics (p, demographics::to_key (state, state. culture_definitions . clergy ));
2375
2381
2376
2382
auto urban_pop = p.get_demographics (demographics::total) - rural_population;
2377
2383
2378
- if (urban_pop < 1000 . f ) {
2384
+ if (urban_pop < minimal_population_per_visible_settlement ) {
2379
2385
continue ;
2380
2386
}
2381
2387
2382
- auto province_size = state.map_state .map_data .province_area [province::to_map_id (p)];
2383
- if (province_size < 1 ) {
2388
+ auto province_size = state.map_state .map_data .province_area_km2 [province::to_map_id (p)];
2389
+ auto province_size_pixels = state.map_state .map_data .province_area [province::to_map_id (p)];
2390
+ if (province_size_pixels < 1 ) {
2384
2391
continue ;
2385
2392
}
2386
2393
@@ -2404,7 +2411,17 @@ void display_data::update_sprawl(sys::state& state) {
2404
2411
2405
2412
std::vector<std::pair<glm::vec2, float >> weighted_settlements;
2406
2413
2407
- int potential_settlement_slots = std::min ((unsigned )7 , province_size / 200 );
2414
+ auto km2_per_potential_settlement = 2000 .f ;
2415
+
2416
+
2417
+ int potential_settlement_slots = std::min (
2418
+ (int )7 , std::min (
2419
+ (int )(province_size / km2_per_potential_settlement),
2420
+ (int )(urban_pop / minimal_population_per_visible_settlement)
2421
+ )
2422
+ );
2423
+ potential_settlement_slots = std::max (1 , potential_settlement_slots);
2424
+
2408
2425
int settlement_slots = potential_settlement_slots;
2409
2426
2410
2427
if (p.get_port_to ()) {
@@ -2421,7 +2438,7 @@ void display_data::update_sprawl(sys::state& state) {
2421
2438
}
2422
2439
}
2423
2440
2424
- auto side = sqrt (province_size );
2441
+ auto side = sqrt (province_size_pixels );
2425
2442
2426
2443
// try to spawn random settlements in this area
2427
2444
@@ -2446,7 +2463,7 @@ void display_data::update_sprawl(sys::state& state) {
2446
2463
settlement_slots -= 1 ;
2447
2464
weighted_settlements.push_back ({ pos, 0 .5f / (potential_settlement_slots + 1 ) });
2448
2465
roads.push_back ({ pos, central_settlement });
2449
- if (settlement_slots < 0 ) {
2466
+ if (settlement_slots <= 0 ) {
2450
2467
break ;
2451
2468
}
2452
2469
}
@@ -2527,10 +2544,10 @@ void display_data::update_sprawl(sys::state& state) {
2527
2544
continue ;
2528
2545
}
2529
2546
2530
- auto node_1 = get_node (state, settlement.first , i, k);
2531
- auto node_2 = get_node (state, settlement.first , i + 1 , k);
2532
- auto node_3 = get_node (state, settlement.first , i, k + 1 );
2533
- auto node_4 = get_node (state, settlement.first , i + 1 , k + 1 );
2547
+ auto node_1 = get_node (state, settlement.first , i, k, size_x, size_y );
2548
+ auto node_2 = get_node (state, settlement.first , i + 1 , k, size_x, size_y );
2549
+ auto node_3 = get_node (state, settlement.first , i, k + 1 , size_x, size_y );
2550
+ auto node_4 = get_node (state, settlement.first , i + 1 , k + 1 , size_x, size_y );
2534
2551
2535
2552
auto node_center = (node_1 + node_2 + node_3 + node_4) / 4 .f ;
2536
2553
0 commit comments