# HG changeset patch # User unC0Rr # Date 1738531849 -3600 # Node ID 2fc37552b5879db5bc138d287ea3c1d587e44ace # Parent 65c017453e8315371e97c72c9eabb813b7ef734f Introduce hard match option for edges to reduce backtracking diff -r 65c017453e83 -r 2fc37552b587 rust/landgen/src/wavefront_collapse/generator.rs --- a/rust/landgen/src/wavefront_collapse/generator.rs Sun Feb 02 17:47:54 2025 +0100 +++ b/rust/landgen/src/wavefront_collapse/generator.rs Sun Feb 02 22:30:49 2025 +0100 @@ -14,6 +14,7 @@ pub name: String, pub reversed: Option, pub symmetrical: Option, + pub hard_match: Option, } #[derive(Debug, Clone)] @@ -206,12 +207,11 @@ let mut rules = Vec::::new(); - let default_connection = HashSet::from_iter(vec![Tile::Empty].into_iter()); for (i, tile) in tiles.iter().enumerate() { - let mut right = default_connection.clone(); - let mut bottom = default_connection.clone(); - let mut left = default_connection.clone(); - let mut top = default_connection.clone(); + let mut top = HashSet::new(); + let mut right = HashSet::new(); + let mut bottom = HashSet::new(); + let mut left = HashSet::new(); let iteration = [ (&grid_top_edge, tile.edge_set().top(), &mut top), @@ -222,6 +222,10 @@ // compatibility with grid edges for (edge, tile_edge, set) in iteration { + if !tile_edge.hard_match() { + set.insert(Tile::Empty); + } + for (is_compatible, tile) in edge .as_ref() .map(|e| { @@ -399,7 +403,11 @@ impl From<&EdgeDescription> for Edge { fn from(val: &EdgeDescription) -> Self { - let edge = Edge::new(val.name.clone(), val.symmetrical.unwrap_or_default()); + let edge = Edge::new( + val.name.clone(), + val.symmetrical.unwrap_or_default(), + val.hard_match.unwrap_or_default(), + ); if val.reversed.unwrap_or_default() { edge.reversed() @@ -413,23 +421,36 @@ fn from(val: T) -> Self { use std::cmp::Ordering; - let reversed = val.as_ref().chars().rev().collect::(); + let mut chars = val.as_ref().chars(); + let hard_match = chars.next() == Some('!'); - match val.as_ref().cmp(&reversed) { + let (name, reversed): (String, String) = if hard_match { + (chars.clone().collect(), chars.rev().collect()) + } else { + ( + val.as_ref().chars().collect(), + val.as_ref().chars().rev().collect(), + ) + }; + + match name.cmp(&reversed) { Ordering::Less => EdgeDescription { - name: val.as_ref().to_owned(), + name, symmetrical: Some(false), reversed: Some(false), + hard_match: Some(hard_match), }, Ordering::Equal => EdgeDescription { name: reversed, symmetrical: Some(true), reversed: Some(false), + hard_match: Some(hard_match), }, Ordering::Greater => EdgeDescription { name: reversed, symmetrical: Some(false), reversed: Some(true), + hard_match: Some(hard_match), }, } } diff -r 65c017453e83 -r 2fc37552b587 rust/landgen/src/wavefront_collapse/tile_image.rs --- a/rust/landgen/src/wavefront_collapse/tile_image.rs Sun Feb 02 17:47:54 2025 +0100 +++ b/rust/landgen/src/wavefront_collapse/tile_image.rs Sun Feb 02 22:30:49 2025 +0100 @@ -8,15 +8,17 @@ id: I, symmetrical: bool, reverse: bool, + hard_match: bool, } impl Edge { #[inline] - pub fn new(id: I, symmetrical: bool) -> Self { + pub fn new(id: I, symmetrical: bool, hard_match: bool) -> Self { Self { id, symmetrical, reverse: false, + hard_match, } } @@ -26,10 +28,16 @@ id: self.id.clone(), symmetrical: self.symmetrical, reverse: !self.symmetrical && !self.reverse, + hard_match: self.hard_match, } } #[inline] + pub fn hard_match(&self) -> bool { + self.hard_match + } + + #[inline] pub fn is_compatible(&self, other: &Self) -> bool { self.id == other.id && ((self.reverse != other.reverse) || self.symmetrical) } diff -r 65c017453e83 -r 2fc37552b587 share/hedgewars/Data/wfc_templates.toml --- a/share/hedgewars/Data/wfc_templates.toml Sun Feb 02 17:47:54 2025 +0100 +++ b/share/hedgewars/Data/wfc_templates.toml Sun Feb 02 22:30:49 2025 +0100 @@ -127,7 +127,7 @@ # forced space name = "120_filled.png" weight = 0 -edges = [ "E", "e", "e", "e" ] +edges = [ "!E", "e", "e", "e" ] can_rotate90 = true can_rotate180 = true can_rotate270 = true @@ -135,7 +135,7 @@ [[tiles.Shoppa]] name = "120_filled.png" weight = 10 -edges = [ "e", "e", "first_layer_reyal_tsrif", "e" ] +edges = [ "e", "e", "!first_layer_reyal_tsrif", "e" ] [[tiles.Shoppa]] name = "shoppa_bar.png" @@ -173,7 +173,7 @@ # first layer semicircle name = "shoppa_sector.png" weight = 5 -edges = [ "e", "sector_rotces", "first_layer_reyal_tsrif", "e" ] +edges = [ "e", "sector_rotces", "!first_layer_reyal_tsrif", "e" ] anti_match = [1, 0, 0, 1] can_mirror = true @@ -188,7 +188,7 @@ [[tiles.Shoppa]] name = "shoppa_hill_center_1.png" weight = 0 -edges = [ "E", "E", "retnecllih", "E" ] +edges = [ "E", "E", "!retnecllih", "E" ] [[tiles.Shoppa]] name = "shoppa_hill_center_2.png" @@ -212,7 +212,7 @@ [[tiles.Shoppa]] name = "shoppa_hill_side_4.png" weight = 6 -edges = [ "hillside4", "H", "first_layer_reyal_tsrif", "e" ] +edges = [ "hillside4", "H", "!first_layer_reyal_tsrif", "e" ] anti_match = [0, 4, 0, 0] can_mirror = true