vertical_connectivity/
vertical_connectivity.rs

1use terrain_forge::{semantic::*, Grid, Tile};
2
3fn main() {
4    println!("=== Vertical Connectivity Demo ===\n");
5
6    // Create two floors for a multi-level dungeon
7    let mut floor1 = Grid::new(25, 20);
8    let mut floor2 = Grid::new(25, 20);
9
10    // Floor 1: Large central room with corridors
11    for y in 5..15 {
12        for x in 5..20 {
13            floor1.set(x, y, Tile::Floor);
14        }
15    }
16    // Add some corridors
17    for x in 2..5 {
18        for y in 8..12 {
19            floor1.set(x, y, Tile::Floor);
20        }
21    }
22
23    // Floor 2: Multiple smaller rooms
24    // Room 1
25    for y in 3..8 {
26        for x in 3..10 {
27            floor2.set(x, y, Tile::Floor);
28        }
29    }
30    // Room 2
31    for y in 12..17 {
32        for x in 8..18 {
33            floor2.set(x, y, Tile::Floor);
34        }
35    }
36    // Room 3
37    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    // Analyze vertical connectivity
56    let mut connectivity = VerticalConnectivity::new();
57
58    // Find stair candidates with different clearance requirements
59    println!("\n1. Stair Candidate Analysis:");
60
61    connectivity.analyze_stair_candidates(&floors, 1); // Minimal clearance
62    println!(
63        "  With 1-tile clearance: {} candidates",
64        connectivity.stair_candidates.len()
65    );
66
67    connectivity.analyze_stair_candidates(&floors, 2); // More clearance
68    println!(
69        "  With 2-tile clearance: {} candidates",
70        connectivity.stair_candidates.len()
71    );
72
73    connectivity.analyze_stair_candidates(&floors, 3); // Maximum clearance
74    println!(
75        "  With 3-tile clearance: {} candidates",
76        connectivity.stair_candidates.len()
77    );
78
79    // Place stairs with different limits
80    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    // Show stair locations
92    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    // Demonstrate with 3 floors
105    println!("\n4. Three-Floor Example:");
106
107    let mut floor3 = Grid::new(25, 20);
108    // Floor 3: Single large room
109    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    // Group stairs by floor connection
132    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}