* Introduce concept of invizible walls to constrain outline map generation transitional_engine
authorunC0Rr
Sun, 01 Dec 2024 21:08:03 +0100
branchtransitional_engine
changeset 16044 5c941f5deeec
parent 16043 adb44a2d8226
child 16045 58a2d806fc47
* Introduce concept of invizible walls to constrain outline map generation * Rework some templates to work better with new parameters in rust landgen
rust/landgen/src/maze.rs
rust/landgen/src/outline_template_based/outline.rs
rust/landgen/src/outline_template_based/outline_template.rs
rust/landgen/src/outline_template_based/template_based.rs
rust/mapgen/src/lib.rs
rust/mapgen/src/template/outline.rs
share/hedgewars/Data/map_templates.yaml
tools/map_templates_tool/main.qml
--- a/rust/landgen/src/maze.rs	Fri Nov 29 22:29:58 2024 +0100
+++ b/rust/landgen/src/maze.rs	Sun Dec 01 21:08:03 2024 +0100
@@ -422,6 +422,7 @@
 
         OutlinePoints {
             islands,
+            walls: vec![],
             fill_points,
             size: *size,
             play_box,
@@ -454,7 +455,11 @@
         );
 
         if !parameters.skip_distort {
-            points.distort(parameters.distance_divisor, self.maze_template.distortion_limiting_factor, random_numbers);
+            points.distort(
+                parameters.distance_divisor,
+                self.maze_template.distortion_limiting_factor,
+                random_numbers,
+            );
         }
 
         if !parameters.skip_bezier {
--- a/rust/landgen/src/outline_template_based/outline.rs	Fri Nov 29 22:29:58 2024 +0100
+++ b/rust/landgen/src/outline_template_based/outline.rs	Sun Dec 01 21:08:03 2024 +0100
@@ -8,6 +8,7 @@
 
 pub struct OutlinePoints {
     pub islands: Vec<Polygon>,
+    pub walls: Vec<Polygon>,
     pub fill_points: Vec<Point>,
     pub size: Size,
     pub play_box: Rect,
@@ -37,6 +38,19 @@
                         .into()
                 })
                 .collect(),
+            walls: outline_template
+                .walls
+                .iter()
+                .map(|i| {
+                    i.iter()
+                        .zip(random_numbers.tuples())
+                        .map(|(rect, (rnd_a, rnd_b))| {
+                            play_box.top_left() + rect.quotient(rnd_a as usize, rnd_b as usize)
+                        })
+                        .collect::<Vec<_>>()
+                        .into()
+                })
+                .collect(),
             fill_points: outline_template.fill_points.clone(),
             intersections_box: Rect::at_origin(size)
                 .with_margin(size.to_square().width as i32 * -2),
@@ -51,6 +65,7 @@
         self.islands
             .iter()
             .flat_map(|p| p.iter())
+            .chain(self.walls.iter().flat_map(|p| p.iter()))
             .chain(self.fill_points.iter())
     }
 
@@ -58,6 +73,7 @@
         self.islands
             .iter_mut()
             .flat_map(|i| i.iter_mut())
+            .chain(self.walls.iter_mut().flat_map(|p| p.iter_mut()))
             .chain(self.fill_points.iter_mut())
     }
 
@@ -292,13 +308,22 @@
     }
 
     pub fn draw<T: Copy + PartialEq + Default>(&self, land: &mut Land2D<T>, value: T) {
-        for segment in self.segments_iter() {
+        for segment in self.visible_segments_iter() {
             land.draw_line(segment, value);
         }
     }
 
+    fn visible_segments_iter<'a>(&'a self) -> impl Iterator<Item = Line> + 'a {
+        self.islands
+            .iter()
+            .flat_map(|p| p.iter_edges())
+    }
+
     fn segments_iter<'a>(&'a self) -> impl Iterator<Item = Line> + 'a {
-        self.islands.iter().flat_map(|p| p.iter_edges())
+        self.islands
+            .iter()
+            .flat_map(|p| p.iter_edges())
+            .chain(self.walls.iter().flat_map(|p| p.iter_edges()))
     }
 
     pub fn mirror(&mut self) {
@@ -322,6 +347,7 @@
             Polygon::new(&[Point::new(0, 0), Point::new(20, 0), Point::new(30, 30)]),
             Polygon::new(&[Point::new(10, 15), Point::new(15, 20), Point::new(20, 15)]),
         ],
+        walls: vec![],
         fill_points: vec![Point::new(1, 1)],
         play_box: Rect::at_origin(size).with_margin(10),
         size: Size::square(100),
--- a/rust/landgen/src/outline_template_based/outline_template.rs	Fri Nov 29 22:29:58 2024 +0100
+++ b/rust/landgen/src/outline_template_based/outline_template.rs	Sun Dec 01 21:08:03 2024 +0100
@@ -3,6 +3,7 @@
 #[derive(Clone, Debug)]
 pub struct OutlineTemplate {
     pub islands: Vec<Vec<Rect>>,
+    pub walls: Vec<Vec<Rect>>,
     pub fill_points: Vec<Point>,
     pub size: Size,
     pub can_flip: bool,
@@ -16,6 +17,7 @@
         OutlineTemplate {
             size,
             islands: Vec::new(),
+            walls: Vec::new(),
             fill_points: Vec::new(),
             can_flip: false,
             can_invert: false,
--- a/rust/landgen/src/outline_template_based/template_based.rs	Fri Nov 29 22:29:58 2024 +0100
+++ b/rust/landgen/src/outline_template_based/template_based.rs	Sun Dec 01 21:08:03 2024 +0100
@@ -56,7 +56,11 @@
         if !parameters.skip_distort {
             let distortion_limiting_factor = 100 + random_numbers.next().unwrap() % 8 * 10;
 
-            points.distort(parameters.distance_divisor, distortion_limiting_factor, random_numbers);
+            points.distort(
+                parameters.distance_divisor,
+                distortion_limiting_factor,
+                random_numbers,
+            );
         }
 
         if !parameters.skip_bezier {
--- a/rust/mapgen/src/lib.rs	Fri Nov 29 22:29:58 2024 +0100
+++ b/rust/mapgen/src/lib.rs	Sun Dec 01 21:08:03 2024 +0100
@@ -139,7 +139,7 @@
                     indices
                         .indices
                         .iter()
-                        .map(|i| Into::<OutlineTemplate>::into(&templates[*i]))
+                        .map(|i| Into::<OutlineTemplate>::into(templates[*i].clone()))
                         .map(|o| {
                             if indices.force_invert == Some(true) {
                                 o.cavern()
--- a/rust/mapgen/src/template/outline.rs	Fri Nov 29 22:29:58 2024 +0100
+++ b/rust/mapgen/src/template/outline.rs	Sun Dec 01 21:08:03 2024 +0100
@@ -5,13 +5,13 @@
 
 use std::collections::hash_map::HashMap;
 
-#[derive(Deserialize)]
+#[derive(Deserialize, Clone)]
 pub struct PointDesc {
     x: u32,
     y: u32,
 }
 
-#[derive(Deserialize)]
+#[derive(Deserialize, Clone)]
 pub struct RectDesc {
     x: u32,
     y: u32,
@@ -19,7 +19,7 @@
     h: u32,
 }
 
-#[derive(Deserialize)]
+#[derive(Deserialize, Clone)]
 pub struct TemplateDesc {
     width: usize,
     height: usize,
@@ -30,6 +30,7 @@
     put_girders: bool,
     max_hedgehogs: u8,
     outline_points: Vec<Vec<RectDesc>>,
+    walls: Option<Vec<Vec<RectDesc>>>,
     fill_points: Vec<PointDesc>,
 }
 
@@ -45,8 +46,8 @@
     pub template_types: HashMap<String, TemplateTypeDesc>,
 }
 
-impl From<&TemplateDesc> for OutlineTemplate {
-    fn from(desc: &TemplateDesc) -> Self {
+impl From<TemplateDesc> for OutlineTemplate {
+    fn from(desc: TemplateDesc) -> Self {
         OutlineTemplate {
             islands: desc
                 .outline_points
@@ -62,6 +63,20 @@
                         .collect()
                 })
                 .collect(),
+            walls: desc
+                .walls.unwrap_or_default()
+                .iter()
+                .map(|v| {
+                    v.iter()
+                        .map(|r| {
+                            Rect::from_size(
+                                Point::new(r.x as i32, r.y as i32),
+                                Size::new(r.w as usize, r.h as usize),
+                            )
+                        })
+                        .collect()
+                })
+                .collect(),
             fill_points: desc
                 .fill_points
                 .iter()
--- a/share/hedgewars/Data/map_templates.yaml	Fri Nov 29 22:29:58 2024 +0100
+++ b/share/hedgewars/Data/map_templates.yaml	Sun Dec 01 21:08:03 2024 +0100
@@ -32,6 +32,10 @@
         - {x: 2018, y: 872, w: 276, h: 314}
         - {x: 2110, y: 1250, w: 130, h: 86}
         - {x: 2134, y: 1424, w: 1, h: 1}
+    walls:
+      -
+        - {x: 1570, y: 1424, w: 1, h: 1}
+        - {x: 1610, y: 104, w: 150, h: 10}
     fill_points:
       - {x: 1023, y: 0}
 
@@ -193,7 +197,7 @@
       -
         - {x: 674, y: 1424, w: 1, h: 1}
         - {x: 590, y: 1318, w: 168, h: 26}
-        - {x: 782, y: 976, w: 122, h: 314}
+        - {x: 632, y: 876, w: 122, h: 314}
         - {x: 968, y: 1144, w: 56, h: 180}
         - {x: 1078, y: 1256, w: 64, h: 56}
         - {x: 1140, y: 1050, w: 106, h: 220}
@@ -203,9 +207,16 @@
         - {x: 1350, y: 1152, w: 152, h: 146}
         - {x: 1572, y: 1174, w: 60, h: 152}
         - {x: 1684, y: 1122, w: 150, h: 138}
-        - {x: 1894, y: 764, w: 56, h: 582}
+        - {x: 1934, y: 764, w: 56, h: 582}
         - {x: 2020, y: 1174, w: 94, h: 232}
         - {x: 2012, y: 1424, w: 1, h: 1}
+    walls:
+      -
+        - {x: 990, y: 1070, w: 1, h: 1}
+        - {x: 200, y: 10, w: 350, h: 1}
+      -
+        - {x: 1600, y: 1100, w: 1, h: 1}
+        - {x: 2300, y: 10, w: 200, h: 1}
     fill_points:
       - {x: 1023, y: 0}
 
@@ -226,16 +237,22 @@
         - {x: 768, y: 1422, w: 2, h: 2}
         - {x: 666, y: 1240, w: 302, h: 110}
         - {x: 694, y: 912, w: 104, h: 290}
-        - {x: 970, y: 980, w: 364, h: 122}
-        - {x: 968, y: 840, w: 368, h: 100}
+        - {x: 970, y: 980, w: 164, h: 122}
+        - {x: 968, y: 840, w: 268, h: 100}
         - {x: 632, y: 660, w: 482, h: 130}
         - {x: 1178, y: 642, w: 62, h: 64}
         - {x: 1390, y: 554, w: 58, h: 246}
         - {x: 1600, y: 676, w: 590, h: 98}
-        - {x: 1488, y: 842, w: 214, h: 188}
+        - {x: 1488, y: 842, w: 114, h: 188}
         - {x: 1450, y: 1086, w: 406, h: 92}
         - {x: 1984, y: 902, w: 190, h: 412}
         - {x: 2046, y: 1420, w: 2, h: 2}
+    walls:
+      -
+        - {x: 1400, y: 822, w: 1, h: 1}
+        - {x: 1400, y: 1222, w: 1, h: 1}
+        - {x: 1900, y: 1240, w: 1, h: 100}
+        - {x: 1100, y: 1402, w: 1, h: 1}
     fill_points:
       - {x: 1023, y: 0}
 
@@ -294,6 +311,10 @@
         - {x: 1940, y: 988, w: 212, h: 50}
         - {x: 1864, y: 1146, w: 128, h: 146}
         - {x: 2030, y: 1424, w: 20, h: 1}
+    walls:
+      -
+        - {x: 1410, y: 924, w: 20, h: 1}
+        - {x: 1100, y: 2, w: 800, h: 1}
     fill_points:
       - {x: 1023, y: 0}
 
@@ -363,15 +384,17 @@
         - {x: 640, y: 1082, w: 140, h: 150}
         - {x: 714, y: 868, w: 352, h: 94}
         - {x: 1126, y: 646, w: 106, h: 282}
-        - {x: 1302, y: 790, w: 368, h: 142}
+        - {x: 1302, y: 790, w: 338, h: 142}
         - {x: 1358, y: 988, w: 116, h: 244}
         - {x: 1276, y: 1424, w: 14, h: 1}
       -
         - {x: 1464, y: 1424, w: 22, h: 1}
-        - {x: 1688, y: 1195, w: 120, h: 120}
-        - {x: 1858, y: 674, w: 354, h: 448}
-        - {x: 2088, y: 1195, w: 120, h: 120}
+        - {x: 1888, y: 674, w: 354, h: 448}
         - {x: 2182, y: 1424, w: 2, h: 1}
+    walls:
+      -
+        - {x: 1380, y: 1424, w: 1, h: 1}
+        - {x: 2250, y: 2, w: 1, h: 1}
     fill_points:
       - {x: 1023, y: 0}
 
@@ -390,14 +413,18 @@
     outline_points:
       -
         - {x: 674, y: 1424, w: 166, h: 1}
-        - {x: 730, y: 1262, w: 96, h: 92}
-        - {x: 892, y: 1090, w: 152, h: 250}
-        - {x: 1146, y: 1046, w: 36, h: 270}
-        - {x: 1338, y: 1026, w: 54, h: 224}
-        - {x: 1534, y: 1046, w: 44, h: 216}
-        - {x: 1692, y: 1030, w: 46, h: 300}
-        - {x: 1848, y: 1064, w: 158, h: 272}
+        - {x: 792, y: 990, w: 152, h: 250}
+        - {x: 1848, y: 964, w: 158, h: 272}
         - {x: 1984, y: 1424, w: 136, h: 1}
+    walls:
+      -
+        - {x: 980, y: 1284, w: 1, h: 50}
+        - {x: 1800, y: 1284, w: 1, h: 50}
+      -
+        - {x: 380, y: 610, w: 1, h: 200}
+        - {x: 2340, y: 610, w: 1, h: 200}
+        - {x: 2540, y: 1500, w: 1, h: 1}
+        - {x: 280, y: 1500, w: 1, h: 1}
     fill_points:
       - {x: 1023, y: 0}
 
@@ -418,16 +445,23 @@
         - {x: 760, y: 1424, w: 2, h: 2}
         - {x: 642, y: 1030, w: 46, h: 286}
         - {x: 854, y: 1072, w: 194, h: 56}
-        - {x: 654, y: 734, w: 534, h: 200}
+        - {x: 654, y: 734, w: 534, h: 100}
         - {x: 1270, y: 676, w: 58, h: 468}
         - {x: 1476, y: 672, w: 198, h: 112}
         - {x: 1400, y: 1424, w: 64, h: 2}
       -
         - {x: 1644, y: 1424, w: 64, h: 2}
         - {x: 1756, y: 894, w: 184, h: 94}
-        - {x: 2000, y: 814, w: 76, h: 358}
         - {x: 2148, y: 984, w: 108, h: 304}
         - {x: 2088, y: 1424, w: 176, h: 1}
+    walls:
+      -
+        - {x: 1560, y: 1424, w: 1, h: 1}
+        - {x: 1880, y: 1, w: 140, h: 1}
+      -
+        - {x: 860, y: 1424, w: 1, h: 1}
+        - {x: 1160, y: 1090, w: 1, h: 1}
+        - {x: 1330, y: 1424, w: 1, h: 1}
     fill_points:
       - {x: 1023, y: 0}
 
@@ -446,20 +480,27 @@
     outline_points:
       -
         - {x: 846, y: 1424, w: 140, h: 2}
-        - {x: 680, y: 1272, w: 196, h: 32}
         - {x: 654, y: 1080, w: 262, h: 134}
-        - {x: 1054, y: 1072, w: 220, h: 136}
-        - {x: 1008, y: 890, w: 268, h: 110}
-        - {x: 700, y: 762, w: 104, h: 200}
+        - {x: 1154, y: 1072, w: 160, h: 136}
+        - {x: 1148, y: 850, w: 168, h: 110}
+        - {x: 700, y: 762, w: 104, h: 60}
         - {x: 846, y: 624, w: 306, h: 58}
-        - {x: 1316, y: 588, w: 84, h: 206}
-        - {x: 1548, y: 574, w: 104, h: 220}
         - {x: 1826, y: 576, w: 120, h: 202}
         - {x: 1956, y: 818, w: 192, h: 68}
-        - {x: 1626, y: 948, w: 246, h: 88}
-        - {x: 1656, y: 1106, w: 194, h: 150}
+        - {x: 1606, y: 828, w: 126, h: 88}
+        - {x: 1606, y: 1106, w: 94, h: 150}
         - {x: 1968, y: 1106, w: 198, h: 152}
         - {x: 1844, y: 1424, w: 2, h: 2}
+    walls:
+      -
+        - {x: 0, y: 854, w: 1, h: 1}
+        - {x: 980, y: 985, w: 1, h: 1}
+      -
+        - {x: 1870, y: 1050, w: 1, h: 1}
+        - {x: 3000, y: 804, w: 1, h: 1}
+      -
+        - {x: 1420, y: 750, w: 90, h: 100}
+        - {x: 1450, y: 1424, w: 51, h: 1}
     fill_points:
       - {x: 1023, y: 0}
 
@@ -509,27 +550,32 @@
       -
         - {x: 702, y: 1424, w: 2, h: 2}
         - {x: 640, y: 1290, w: 44, h: 94}
-        - {x: 750, y: 1262, w: 44, h: 94}
         - {x: 860, y: 1306, w: 78, h: 70}
         - {x: 866, y: 1424, w: 2, h: 2}
       -
         - {x: 1204, y: 1424, w: 2, h: 2}
-        - {x: 1120, y: 1182, w: 108, h: 174}
-        - {x: 884, y: 1024, w: 314, h: 98}
-        - {x: 710, y: 882, w: 76, h: 230}
-        - {x: 834, y: 686, w: 220, h: 154}
-        - {x: 1240, y: 674, w: 56, h: 266}
-        - {x: 1424, y: 644, w: 78, h: 304}
-        - {x: 1648, y: 646, w: 116, h: 162}
+        - {x: 1120, y: 982, w: 108, h: 174}
+        - {x: 610, y: 842, w: 116, h: 230}
+        - {x: 1034, y: 686, w: 620, h: 154}
         - {x: 1980, y: 726, w: 190, h: 228}
-        - {x: 1760, y: 1004, w: 140, h: 84}
-        - {x: 1596, y: 1140, w: 242, h: 118}
+        - {x: 1536, y: 1040, w: 242, h: 118}
         - {x: 1616, y: 1424, w: 2, h: 2}
       -
         - {x: 1894, y: 1424, w: 2, h: 2}
         - {x: 1850, y: 1328, w: 88, h: 34}
         - {x: 1998, y: 1238, w: 96, h: 112}
         - {x: 2056, y: 1424, w: 2, h: 2}
+    walls:
+      -
+        - {x: 0, y: 1200, w: 1, h: 1}
+        - {x: 1040, y: 1200, w: 1, h: 1}
+        - {x: 1040, y: 1500, w: 1, h: 1}
+        - {x: 0, y: 1500, w: 2, h: 2}
+      -
+        - {x: 3100, y: 1120, w: 1, h: 1}
+        - {x: 1770, y: 1220, w: 1, h: 1}
+        - {x: 1770, y: 1500, w: 1, h: 1}
+        - {x: 3100, y: 1500, w: 2, h: 2}
     fill_points:
       - {x: 1023, y: 0}
 
@@ -594,17 +640,18 @@
       -
         - {x: 630, y: 1424, w: 2, h: 2}
         - {x: 566, y: 1256, w: 128, h: 118}
-        - {x: 752, y: 1256, w: 98, h: 114}
-        - {x: 748, y: 1074, w: 140, h: 138}
-        - {x: 956, y: 1072, w: 136, h: 142}
-        - {x: 1146, y: 1070, w: 114, h: 252}
-        - {x: 1324, y: 778, w: 120, h: 390}
-        - {x: 1522, y: 862, w: 114, h: 210}
-        - {x: 1724, y: 706, w: 130, h: 252}
-        - {x: 1936, y: 606, w: 278, h: 234}
-        - {x: 1924, y: 1044, w: 272, h: 52}
-        - {x: 1972, y: 1252, w: 180, h: 56}
+        - {x: 2036, y: 636, w: 78, h: 234}
         - {x: 1998, y: 1424, w: 42, h: 2}
+    walls:
+      -
+        - {x: 330, y: 1500, w: 2, h: 1}
+        - {x: 366, y: 1156, w: 64, h: 64}
+        - {x: 2086, y: 460, w: 200, h: 60}
+        - {x: 2100, y: 1500, w: 200, h: 1}
+      -
+        - {x: 830, y: 1424, w: 2, h: 1}
+        - {x: 1686, y: 1060, w: 200, h: 60}
+        - {x: 1650, y: 1424, w: 200, h: 1}
     fill_points:
       - {x: 1023, y: 0}
 
@@ -898,33 +945,31 @@
       -
         - {x: 474, y: 1424, w: 1, h: 1}
         - {x: 390, y: 1318, w: 168, h: 26}
-        - {x: 582, y: 976, w: 122, h: 314}
-        - {x: 768, y: 1144, w: 56, h: 180}
-        - {x: 878, y: 1256, w: 64, h: 56}
-        - {x: 940, y: 1050, w: 106, h: 220}
+        - {x: 940, y: 1080, w: 106, h: 220}
         - {x: 844, y: 896, w: 162, h: 140}
-        - {x: 696, y: 610, w: 886, h: 174}
+        - {x: 796, y: 610, w: 686, h: 174}
         - {x: 1134, y: 848, w: 296, h: 108}
         - {x: 1150, y: 1152, w: 152, h: 146}
-        - {x: 1372, y: 1174, w: 60, h: 152}
-        - {x: 1484, y: 1122, w: 150, h: 138}
         - {x: 1694, y: 764, w: 56, h: 582}
-        - {x: 1820, y: 1174, w: 94, h: 232}
-        - {x: 1812, y: 1424, w: 1, h: 1}
+        - {x: 1712, y: 1424, w: 1, h: 1}
       -
         - {x: 2110, y: 1424, w: 2, h: 2}
         - {x: 1992, y: 1030, w: 46, h: 286}
         - {x: 2204, y: 1072, w: 194, h: 56}
         - {x: 2004, y: 734, w: 534, h: 200}
-        - {x: 2620, y: 676, w: 58, h: 468}
-        - {x: 2826, y: 672, w: 198, h: 112}
+        - {x: 2626, y: 672, w: 198, h: 112}
         - {x: 2750, y: 1424, w: 64, h: 2}
       -
         - {x: 2994, y: 1424, w: 64, h: 2}
         - {x: 3106, y: 894, w: 184, h: 94}
-        - {x: 3350, y: 814, w: 76, h: 358}
         - {x: 3498, y: 984, w: 108, h: 304}
         - {x: 3438, y: 1424, w: 176, h: 1}
+    walls:
+      -
+        - {x: 1870, y: 1500, w: 1, h: 1}
+        - {x: 1780, y: 500, w: 168, h: 26}
+        - {x: 2880, y: 500, w: 265, h: 26}
+        - {x: 2880, y: 1500, w: 1, h: 1}
     fill_points:
       - {x: 2047, y: 0}
 
@@ -984,23 +1029,26 @@
       -
         - {x: 362, y: 1424, w: 400, h: 1}
         - {x: 426, y: 634, w: 142, h: 360}
-        - {x: 1136, y: 1140, w: 400, h: 200}
-        - {x: 1776, y: 576, w: 186, h: 550}
-        - {x: 1630, y: 1424, w: 454, h: 1}
+        - {x: 1206, y: 1140, w: 200, h: 200}
+        - {x: 1776, y: 576, w: 70, h: 550}
+        - {x: 1540, y: 1424, w: 120, h: 1}
       -
         - {x: 1938, y: 1424, w: 190, h: 1}
-        - {x: 1990, y: 1082, w: 140, h: 150}
         - {x: 2064, y: 868, w: 352, h: 94}
-        - {x: 2476, y: 646, w: 106, h: 282}
-        - {x: 2652, y: 790, w: 368, h: 142}
-        - {x: 2708, y: 988, w: 116, h: 244}
+        - {x: 2652, y: 790, w: 168, h: 142}
         - {x: 2626, y: 1424, w: 14, h: 1}
       -
         - {x: 2814, y: 1424, w: 22, h: 1}
-        - {x: 3038, y: 1195, w: 120, h: 120}
         - {x: 3208, y: 674, w: 354, h: 448}
-        - {x: 3438, y: 1195, w: 120, h: 120}
         - {x: 3532, y: 1424, w: 2, h: 1}
+    walls:
+      -
+        - {x: 560, y: 0, w: 260, h: 1}
+        - {x: 1250, y: 880, w: 40, h: 200}
+        - {x: 2000, y: 0, w: 260, h: 1}
+        - {x: 1880, y: 1500, w: 1, h: 1}
+        - {x: 2700, y: 1500, w: 1, h: 1}
+        - {x: 3050, y: 0, w: 480, h: 1}
     fill_points:
       - {x: 2047, y: 0}
 
@@ -1019,56 +1067,44 @@
     outline_points:
       -
         - {x: 564, y: 1424, w: 20, h: 1}
-        - {x: 490, y: 1260, w: 64, h: 62}
-        - {x: 686, y: 1150, w: 52, h: 146}
-        - {x: 456, y: 990, w: 116, h: 144}
-        - {x: 670, y: 868, w: 138, h: 168}
         - {x: 442, y: 642, w: 158, h: 162}
-        - {x: 708, y: 710, w: 198, h: 72}
         - {x: 970, y: 628, w: 118, h: 134}
-        - {x: 836, y: 1118, w: 142, h: 132}
-        - {x: 1168, y: 1100, w: 172, h: 58}
-        - {x: 1170, y: 1204, w: 172, h: 62}
-        - {x: 1432, y: 1104, w: 82, h: 226}
+        - {x: 836, y: 1118, w: 142, h: 32}
         - {x: 1556, y: 994, w: 64, h: 152}
         - {x: 1414, y: 734, w: 106, h: 152}
-        - {x: 1610, y: 660, w: 380, h: 82}
-        - {x: 1728, y: 822, w: 30, h: 118}
-        - {x: 1740, y: 988, w: 212, h: 50}
-        - {x: 1664, y: 1146, w: 128, h: 146}
+        - {x: 1610, y: 660, w: 260, h: 82}
         - {x: 1830, y: 1424, w: 20, h: 1}
       -
         - {x: 2140, y: 1424, w: 1, h: 1}
-        - {x: 2076, y: 1302, w: 44, h: 54}
         - {x: 2234, y: 1236, w: 58, h: 90}
-        - {x: 2066, y: 1134, w: 80, h: 80}
         - {x: 2046, y: 1004, w: 96, h: 108}
         - {x: 2226, y: 1046, w: 110, h: 112}
         - {x: 2034, y: 692, w: 118, h: 164}
-        - {x: 2228, y: 796, w: 130, h: 110}
-        - {x: 2316, y: 598, w: 344, h: 78}
-        - {x: 2488, y: 826, w: 50, h: 40}
+        - {x: 2316, y: 598, w: 264, h: 78}
         - {x: 2426, y: 960, w: 32, h: 148}
-        - {x: 2498, y: 1050, w: 160, h: 34}
         - {x: 2474, y: 1188, w: 36, h: 136}
         - {x: 2814, y: 1248, w: 48, h: 48}
         - {x: 2886, y: 1128, w: 64, h: 88}
-        - {x: 2758, y: 1060, w: 70, h: 74}
-        - {x: 2916, y: 996, w: 68, h: 70}
-        - {x: 2918, y: 884, w: 68, h: 82}
-        - {x: 2758, y: 724, w: 44, h: 140}
+        - {x: 2798, y: 724, w: 44, h: 140}
         - {x: 3072, y: 706, w: 52, h: 66}
-        - {x: 3054, y: 902, w: 58, h: 66}
         - {x: 3034, y: 1160, w: 76, h: 112}
-        - {x: 3180, y: 1162, w: 124, h: 64}
-        - {x: 3272, y: 872, w: 54, h: 134}
-        - {x: 3210, y: 596, w: 246, h: 62}
+        - {x: 3290, y: 1162, w: 40, h: 64}
+        - {x: 3310, y: 596, w: 46, h: 62}
         - {x: 3506, y: 554, w: 38, h: 238}
-        - {x: 3612, y: 748, w: 28, h: 28}
-        - {x: 3492, y: 924, w: 144, h: 94}
-        - {x: 3432, y: 1078, w: 248, h: 20}
-        - {x: 3432, y: 1202, w: 238, h: 16}
         - {x: 3480, y: 1424, w: 1, h: 1}
+    walls:
+      -
+        - {x: 1264, y: 1024, w: 20, h: 1}
+        - {x: 1070, y: 0, w: 400, h: 1}
+      -
+        - {x: 2670, y: 1170, w: 1, h: 1}
+        - {x: 2610, y: 0, w: 200, h: 1}
+      -
+        - {x: 3210, y: 1100, w: 1, h: 1}
+        - {x: 3100, y: 0, w: 210, h: 1}
+      -
+        - {x: 710, y: 1250, w: 1, h: 120}
+        - {x: 1630, y: 1200, w: 1, h: 170}
     fill_points:
       - {x: 2047, y: 0}
 
@@ -1089,20 +1125,16 @@
         - {x: 610, y: 1424, w: 1, h: 1}
         - {x: 360, y: 1160, w: 130, h: 170}
         - {x: 542, y: 1106, w: 316, h: 150}
-        - {x: 438, y: 786, w: 270, h: 180}
         - {x: 446, y: 576, w: 242, h: 156}
-        - {x: 752, y: 528, w: 610, h: 300}
-        - {x: 950, y: 868, w: 352, h: 324}
-        - {x: 850, y: 1424, w: 500, h: 1}
-        - {x: 1450, y: 1500, w: 1, h: 1}
+        - {x: 752, y: 528, w: 350, h: 300}
+        - {x: 950, y: 1424, w: 300, h: 1}
+      -
         - {x: 1690, y: 1424, w: 1, h: 1}
         - {x: 1652, y: 1304, w: 74, h: 12}
-        - {x: 1448, y: 975, w: 68, h: 425}
+        - {x: 1448, y: 975, w: 68, h: 385}
         - {x: 1626, y: 992, w: 140, h: 142}
         - {x: 1510, y: 592, w: 150, h: 350}
         - {x: 1788, y: 594, w: 148, h: 242}
-        - {x: 1818, y: 872, w: 276, h: 314}
-        - {x: 1910, y: 1250, w: 130, h: 86}
         - {x: 1934, y: 1424, w: 1, h: 1}
       -
         - {x: 2202, y: 1424, w: 2, h: 2}
@@ -1113,21 +1145,23 @@
       -
         - {x: 2704, y: 1424, w: 2, h: 2}
         - {x: 2620, y: 1182, w: 108, h: 174}
-        - {x: 2384, y: 1024, w: 314, h: 98}
-        - {x: 2210, y: 882, w: 76, h: 230}
+        - {x: 2210, y: 902, w: 76, h: 230}
         - {x: 2334, y: 686, w: 220, h: 154}
-        - {x: 2740, y: 674, w: 56, h: 266}
-        - {x: 2924, y: 644, w: 78, h: 304}
-        - {x: 3148, y: 646, w: 116, h: 162}
-        - {x: 3480, y: 726, w: 190, h: 228}
-        - {x: 3260, y: 1004, w: 140, h: 84}
-        - {x: 3096, y: 1140, w: 242, h: 118}
+        - {x: 3480, y: 680, w: 190, h: 228}
+        - {x: 3096, y: 1010, w: 242, h: 118}
         - {x: 3116, y: 1424, w: 2, h: 2}
       -
         - {x: 3394, y: 1424, w: 2, h: 2}
         - {x: 3350, y: 1328, w: 88, h: 34}
         - {x: 3498, y: 1238, w: 96, h: 112}
         - {x: 3556, y: 1424, w: 2, h: 2}
+    walls:
+      -
+        - {x: 1300, y: 1500, w: 1, h: 1}
+        - {x: 1100, y: 960, w: 280, h: 40}
+        - {x: 1200, y: 1, w: 280, h: 1}
+        - {x: 2000, y: 400, w: 250, h: 1}
+        - {x: 2020, y: 1500, w: 20, h: 1}
     fill_points:
       - {x: 2047, y: 0}
 
@@ -1157,19 +1191,14 @@
         - {x: 1212, y: 990, w: 188, h: 298}
         - {x: 1440, y: 1068, w: 136, h: 172}
         - {x: 1470, y: 594, w: 120, h: 392}
-        - {x: 1714, y: 594, w: 364, h: 362}
-        - {x: 1650, y: 1052, w: 315, h: 232}
+        - {x: 1714, y: 594, w: 220, h: 362}
         - {x: 1660, y: 1424, w: 25, h: 1}
       -
         - {x: 1986, y: 1424, w: 2, h: 2}
-        - {x: 1944, y: 1286, w: 84, h: 54}
         - {x: 1912, y: 1086, w: 150, h: 166}
         - {x: 2378, y: 1240, w: 186, h: 98}
-        - {x: 2444, y: 1004, w: 124, h: 58}
         - {x: 2320, y: 582, w: 112, h: 194}
-        - {x: 2688, y: 660, w: 92, h: 132}
         - {x: 3010, y: 574, w: 154, h: 196}
-        - {x: 2860, y: 974, w: 118, h: 64}
         - {x: 2752, y: 1222, w: 328, h: 92}
         - {x: 3296, y: 1030, w: 242, h: 222}
         - {x: 3298, y: 1316, w: 254, h: 50}
--- a/tools/map_templates_tool/main.qml	Fri Nov 29 22:29:58 2024 +0100
+++ b/tools/map_templates_tool/main.qml	Sun Dec 01 21:08:03 2024 +0100
@@ -20,7 +20,7 @@
     Rectangle {
       id: mapContainer
 
-      property int spaceForCode: Math.max(200, parent.height / 2)
+      property int spaceForCode: Math.max(250, parent.height * 0.6)
       property int mapWidth: 2048
       property int mapHeight: 1024
       property real aspectRatio: mapWidth / mapHeight
@@ -41,6 +41,16 @@
       anchors.fill: mapContainer
     }
 
+    MouseArea {
+      id: mouseArea
+      anchors.fill: mapContainer
+      hoverEnabled: true
+    }
+
+    Label {
+      text: mouseArea.containsMouse ? "(%1, %2)".arg(Math.floor(mouseArea.mouseX / mouseArea.width * mapContainer.mapWidth)).arg(Math.floor(mouseArea.mouseY / mouseArea.height * mapContainer.mapHeight)) : ""
+    }
+
     Rectangle {
       anchors.fill: codeInput
       color: "gray"
@@ -119,8 +129,8 @@
                      newKey = "outline_points"
                    }
 
-                   if (line === "    holes:") {
-                     newKey = "holes"
+                   if (line === "    walls:") {
+                     newKey = "walls"
                    }
 
                    if (line === "    fill_points:") {
@@ -243,6 +253,6 @@
   }
 
   function renderTemplate(template) {
-    return polygons2shapes(template.outline_points, "red", "black").concat(polygons2shapes(template.holes, "gray", "gray"))
+    return polygons2shapes(template.outline_points, "red", "black").concat(polygons2shapes(template.walls, "gray", "gray"))
   }
 }