Skip to main content

hierarchical_markers/
hierarchical_markers.rs

1use terrain_forge::{algorithms, semantic::*, Grid, Rng, SemanticExtractor};
2
3fn main() {
4    println!("=== Hierarchical Marker Types Demo ===\n");
5
6    // Generate a basic dungeon
7    let mut grid = Grid::new(30, 20);
8    algorithms::get("bsp").unwrap().generate(&mut grid, 12345);
9
10    let extractor = SemanticExtractor::for_rooms();
11    let mut rng = Rng::new(12345);
12    let mut semantic = extractor.extract(&grid, &mut rng);
13
14    // Add hierarchical markers
15    if let Some(region) = semantic.regions.first() {
16        let (x, y) = region.cells[0];
17
18        // Quest markers with priorities
19        semantic.markers.push(Marker::new(
20            x,
21            y,
22            MarkerType::QuestObjective { priority: 1 },
23        ));
24        semantic.markers.push(Marker::new(
25            x + 2,
26            y,
27            MarkerType::QuestObjective { priority: 3 },
28        ));
29        semantic
30            .markers
31            .push(Marker::new(x + 4, y, MarkerType::QuestStart));
32
33        // Loot with different tiers
34        semantic
35            .markers
36            .push(Marker::new(x, y + 2, MarkerType::LootTier { tier: 1 }));
37        semantic
38            .markers
39            .push(Marker::new(x + 2, y + 2, MarkerType::LootTier { tier: 3 }));
40        semantic
41            .markers
42            .push(Marker::new(x + 4, y + 2, MarkerType::Treasure));
43
44        // Encounter zones
45        semantic.markers.push(Marker::new(
46            x,
47            y + 4,
48            MarkerType::EncounterZone { difficulty: 2 },
49        ));
50        semantic
51            .markers
52            .push(Marker::new(x + 2, y + 4, MarkerType::BossRoom));
53        semantic
54            .markers
55            .push(Marker::new(x + 4, y + 4, MarkerType::SafeZone));
56    }
57
58    // Show marker categories and types
59    println!("Generated {} markers:", semantic.markers.len());
60    for marker in &semantic.markers {
61        println!(
62            "  {} at ({}, {}) - Category: {}",
63            marker.tag(),
64            marker.x,
65            marker.y,
66            marker.marker_type.category()
67        );
68    }
69
70    // Group by category
71    let mut categories = std::collections::HashMap::new();
72    for marker in &semantic.markers {
73        *categories.entry(marker.marker_type.category()).or_insert(0) += 1;
74    }
75
76    println!("\nMarker distribution:");
77    for (category, count) in categories {
78        println!("  {}: {} markers", category, count);
79    }
80}