Skip to main content

requirement_generation/
requirement_generation.rs

1use terrain_forge::{generate_with_requirements, semantic::*};
2
3fn main() {
4    println!("=== Requirement-Driven Generation Demo ===\n");
5
6    // Demo 1: Basic dungeon requirements
7    println!("1. Basic Dungeon Requirements:");
8    let basic_req = SemanticRequirements::basic_dungeon();
9
10    match generate_with_requirements("bsp", 40, 30, basic_req, Some(5), 12345) {
11        Ok((grid, semantic)) => {
12            println!("  ✅ Generated valid dungeon!");
13            println!("  Floor tiles: {}", grid.count(|t| t.is_floor()));
14            println!("  Regions: {}", semantic.regions.len());
15            println!("  Markers: {}", semantic.markers.len());
16        }
17        Err(msg) => println!("  ❌ Failed: {}", msg),
18    }
19
20    // Demo 2: Custom requirements
21    println!("\n2. Custom Cave Requirements:");
22    let mut cave_req = SemanticRequirements::none();
23    cave_req.min_regions.insert("cavern".to_string(), 2);
24    cave_req.min_walkable_area = Some(200);
25    cave_req
26        .required_markers
27        .insert(MarkerType::Custom("entrance".to_string()), 1);
28    cave_req
29        .required_markers
30        .insert(MarkerType::Custom("treasure".to_string()), 1);
31
32    match generate_with_requirements("cellular", 50, 40, cave_req, Some(10), 54321) {
33        Ok((grid, semantic)) => {
34            println!("  ✅ Generated valid cave system!");
35            println!("  Floor tiles: {}", grid.count(|t| t.is_floor()));
36            println!("  Regions: {}", semantic.regions.len());
37
38            // Show region types
39            let mut region_types = std::collections::HashMap::new();
40            for region in &semantic.regions {
41                *region_types.entry(&region.kind).or_insert(0) += 1;
42            }
43            for (kind, count) in region_types {
44                println!("    {}: {}", kind, count);
45            }
46        }
47        Err(msg) => println!("  ❌ Failed: {}", msg),
48    }
49
50    // Demo 3: Strict requirements (likely to fail)
51    println!("\n3. Strict Requirements (demonstration of failure):");
52    let mut strict_req = SemanticRequirements::none();
53    strict_req.min_regions.insert("room".to_string(), 10); // Very strict
54    strict_req
55        .required_markers
56        .insert(MarkerType::QuestObjective { priority: 1 }, 5);
57    strict_req.min_walkable_area = Some(800);
58
59    match generate_with_requirements("bsp", 30, 20, strict_req, Some(3), 98765) {
60        Ok((grid, _semantic)) => {
61            println!("  ✅ Unexpectedly succeeded!");
62            println!("  Floor tiles: {}", grid.count(|t| t.is_floor()));
63        }
64        Err(msg) => println!("  ❌ Expected failure: {}", msg),
65    }
66}