vertical_connectivity/
vertical_connectivity.rs1use terrain_forge::{semantic::*, Grid, Tile};
2
3fn main() {
4 println!("=== Vertical Connectivity Demo ===\n");
5
6 let mut floor1 = Grid::new(25, 20);
8 let mut floor2 = Grid::new(25, 20);
9
10 for y in 5..15 {
12 for x in 5..20 {
13 floor1.set(x, y, Tile::Floor);
14 }
15 }
16 for x in 2..5 {
18 for y in 8..12 {
19 floor1.set(x, y, Tile::Floor);
20 }
21 }
22
23 for y in 3..8 {
26 for x in 3..10 {
27 floor2.set(x, y, Tile::Floor);
28 }
29 }
30 for y in 12..17 {
32 for x in 8..18 {
33 floor2.set(x, y, Tile::Floor);
34 }
35 }
36 for y in 6..12 {
38 for x in 15..22 {
39 floor2.set(x, y, Tile::Floor);
40 }
41 }
42
43 let floors = vec![floor1, floor2];
44
45 println!("Created 2-floor dungeon:");
46 println!(
47 " Floor 1: {} floor tiles",
48 floors[0].count(|t| t.is_floor())
49 );
50 println!(
51 " Floor 2: {} floor tiles",
52 floors[1].count(|t| t.is_floor())
53 );
54
55 let mut connectivity = VerticalConnectivity::new();
57
58 println!("\n1. Stair Candidate Analysis:");
60
61 connectivity.analyze_stair_candidates(&floors, 1); println!(
63 " With 1-tile clearance: {} candidates",
64 connectivity.stair_candidates.len()
65 );
66
67 connectivity.analyze_stair_candidates(&floors, 2); println!(
69 " With 2-tile clearance: {} candidates",
70 connectivity.stair_candidates.len()
71 );
72
73 connectivity.analyze_stair_candidates(&floors, 3); println!(
75 " With 3-tile clearance: {} candidates",
76 connectivity.stair_candidates.len()
77 );
78
79 println!("\n2. Stair Placement:");
81
82 connectivity.place_stairs(1);
83 println!(" Placed {} stairs (max 1)", connectivity.stairs.len());
84
85 connectivity.place_stairs(3);
86 println!(" Placed {} stairs (max 3)", connectivity.stairs.len());
87
88 connectivity.place_stairs(5);
89 println!(" Placed {} stairs (max 5)", connectivity.stairs.len());
90
91 println!("\n3. Stair Locations:");
93 for (i, &(x, y, from_floor, to_floor)) in connectivity.stairs.iter().enumerate() {
94 println!(
95 " Stair {}: ({}, {}) connecting floor {} to floor {}",
96 i + 1,
97 x,
98 y,
99 from_floor,
100 to_floor
101 );
102 }
103
104 println!("\n4. Three-Floor Example:");
106
107 let mut floor3 = Grid::new(25, 20);
108 for y in 6..14 {
110 for x in 6..19 {
111 floor3.set(x, y, Tile::Floor);
112 }
113 }
114
115 let three_floors = vec![floors[0].clone(), floors[1].clone(), floor3];
116 let mut connectivity3 = VerticalConnectivity::new();
117
118 connectivity3.analyze_stair_candidates(&three_floors, 2);
119 connectivity3.place_stairs(2);
120
121 println!(
122 " Floor 3: {} floor tiles",
123 three_floors[2].count(|t| t.is_floor())
124 );
125 println!(
126 " Total stair candidates: {}",
127 connectivity3.stair_candidates.len()
128 );
129 println!(" Stairs placed: {}", connectivity3.stairs.len());
130
131 let mut connections = std::collections::HashMap::new();
133 for &(_, _, from, to) in &connectivity3.stairs {
134 *connections.entry((from, to)).or_insert(0) += 1;
135 }
136
137 println!(" Floor connections:");
138 for ((from, to), count) in connections {
139 println!(" Floor {} ↔ Floor {}: {} stairs", from, to, count);
140 }
141}