diff -r 106674bb21b1 -r de01be16df95 rust/landgen/src/wavefront_collapse/generator.rs --- a/rust/landgen/src/wavefront_collapse/generator.rs Sat Jan 18 16:55:04 2025 +0100 +++ b/rust/landgen/src/wavefront_collapse/generator.rs Sat Jan 18 16:57:26 2025 +0100 @@ -3,6 +3,7 @@ use crate::{LandGenerationParameters, LandGenerator}; use integral_geometry::Size; use png::Decoder; +use rand::Rng; use std::collections::HashSet; use std::fs::File; use std::io::{BufReader, Result}; @@ -179,6 +180,7 @@ pub fn build_rules( &self, tiles: &[TileImage], + probability_distribution_factor: i32, ) -> Vec { let [grid_top_edge, grid_right_edge, grid_bottom_edge, grid_left_edge]: [Option< Edge, @@ -263,7 +265,12 @@ } } + let weight = (probability_distribution_factor * 2 * i as i32 / (tiles.len() - 1) as i32 + + 100 + - probability_distribution_factor) as u32; + rules.push(CollapseRule { + weight, tile: Tile::Numbered(i), top, right, @@ -277,13 +284,17 @@ } impl LandGenerator for WavefrontCollapseLandGenerator { - fn generate_land>( + fn generate_land( &self, parameters: &LandGenerationParameters, - random_numbers: &mut I, + random_numbers: &mut impl Rng, ) -> land2d::Land2D { + assert!(parameters.distance_divisor >= 1); + assert!(parameters.distance_divisor <= 25); + let tiles = self.load_template(parameters); - let rules = self.build_rules(&tiles); + let distribution_factor = (parameters.distance_divisor - 1) as i32 * 8 - 96; + let rules = self.build_rules(&tiles, distribution_factor); let mut wfc = WavefrontCollapse::new(self.template.wrap); wfc.set_rules(rules);