diff --git a/world/src/site2/mod.rs b/world/src/site2/mod.rs index e8e507756f..47f24801e4 100644 --- a/world/src/site2/mod.rs +++ b/world/src/site2/mod.rs @@ -511,8 +511,46 @@ impl Site { let mut castles = 0; + let mut workshops = 0; + for _ in 0..(size * 200.0) as i32 { match *build_chance.choose_seeded(rng.gen()) { + // Workshop + n if (n == 5 && workshops < (size * 5.0) as i32) || workshops == 0 => { + let size = (3.0 + rng.gen::().powf(5.0) * 1.5).round() as u32; + if let Some((aabr, door_tile, door_dir)) = attempt(32, || { + site.find_roadside_aabr( + &mut rng, + 4..(size + 1).pow(2), + Extent2::broadcast(size), + ) + }) { + let workshop = plot::Workshop::generate( + land, + &mut reseed(&mut rng), + &site, + door_tile, + door_dir, + aabr, + ); + let workshop_alt = workshop.alt; + let plot = site.create_plot(Plot { + kind: PlotKind::Workshop(workshop), + root_tile: aabr.center(), + tiles: aabr_tiles(aabr).collect(), + seed: rng.gen(), + }); + + site.blit_aabr(aabr, Tile { + kind: TileKind::Building, + plot: Some(plot), + hard_alt: Some(workshop_alt), + }); + workshops += 1; + } else { + site.make_plaza(land, &mut rng); + } + }, // House 1 => { let size = (1.5 + rng.gen::().powf(5.0) * 1.0).round() as u32; @@ -548,41 +586,6 @@ impl Site { site.make_plaza(land, &mut rng); } }, - // Workshop - 5 => { - let size = (3.0 + rng.gen::().powf(5.0) * 1.5).round() as u32; - if let Some((aabr, door_tile, door_dir)) = attempt(32, || { - site.find_roadside_aabr( - &mut rng, - 4..(size + 1).pow(2), - Extent2::broadcast(size), - ) - }) { - let workshop = plot::Workshop::generate( - land, - &mut reseed(&mut rng), - &site, - door_tile, - door_dir, - aabr, - ); - let workshop_alt = workshop.alt; - let plot = site.create_plot(Plot { - kind: PlotKind::Workshop(workshop), - root_tile: aabr.center(), - tiles: aabr_tiles(aabr).collect(), - seed: rng.gen(), - }); - - site.blit_aabr(aabr, Tile { - kind: TileKind::Building, - plot: Some(plot), - hard_alt: Some(workshop_alt), - }); - } else { - site.make_plaza(land, &mut rng); - } - }, // Guard tower 2 => { if let Some((_aabr, _, _door_dir)) = attempt(10, || {