use terrain_forge::{pipeline::*, Grid, Rng};
fn main() {
println!("=== TerrainForge v0.4.0 Phase 2 Demo ===\n");
demo_conditional_pipeline();
demo_pipeline_templates();
demo_template_library();
}
fn demo_conditional_pipeline() {
println!("🔀 Demo 1: Conditional Pipeline Operations");
let mut grid = Grid::new(30, 20);
let mut context = PipelineContext::new();
let mut rng = Rng::new(12345);
let mut pipeline = ConditionalPipeline::new();
pipeline.add_operation(ConditionalOperation::simple(PipelineOperation::Algorithm {
name: "bsp".to_string(),
seed: Some(12345),
}));
pipeline.add_operation(ConditionalOperation::conditional(
PipelineOperation::Log {
message: "Evaluating floor density".to_string(),
},
PipelineCondition::Density {
min: Some(0.2),
max: Some(0.6),
},
vec![ConditionalOperation::simple(
PipelineOperation::SetParameter {
key: "density_status".to_string(),
value: "acceptable".to_string(),
},
)],
vec![ConditionalOperation::simple(
PipelineOperation::SetParameter {
key: "density_status".to_string(),
value: "out_of_range".to_string(),
},
)],
));
let result = pipeline.execute(&mut grid, &mut context, &mut rng);
println!(
" Pipeline execution: {}",
if result.success {
"✅ Success"
} else {
"❌ Failed"
}
);
if let Some(msg) = result.message {
println!(" Message: {}", msg);
}
println!(" Floor tiles: {}", grid.count(|t| t.is_floor()));
println!(
" Density status: {}",
context
.get_parameter("density_status")
.unwrap_or(&"unknown".to_string())
);
println!(" Execution log: {:?}", context.execution_history());
println!();
}
fn demo_pipeline_templates() {
println!("📋 Demo 2: Pipeline Templates");
let template = PipelineTemplate::new("custom_dungeon", "Customizable dungeon template")
.with_parameter("algorithm", "cellular")
.with_parameter("seed", "54321")
.with_parameter("type", "dungeon")
.with_operation(ConditionalOperation::simple(PipelineOperation::Algorithm {
name: "{algorithm}".to_string(),
seed: Some(54321),
}))
.with_operation(ConditionalOperation::simple(
PipelineOperation::SetParameter {
key: "generation_type".to_string(),
value: "{type}".to_string(),
},
));
let mut custom_params = std::collections::HashMap::new();
custom_params.insert("algorithm".to_string(), "bsp".to_string());
custom_params.insert("type".to_string(), "fortress".to_string());
let pipeline = template.instantiate(Some(custom_params));
let mut grid = Grid::new(25, 25);
let mut context = PipelineContext::new();
let mut rng = Rng::new(98765);
let result = pipeline.execute(&mut grid, &mut context, &mut rng);
println!(" Template: {}", template.name);
println!(" Description: {}", template.description);
println!(
" Execution: {}",
if result.success {
"✅ Success"
} else {
"❌ Failed"
}
);
println!(
" Generation type: {}",
context
.get_parameter("generation_type")
.unwrap_or(&"unknown".to_string())
);
println!(" Floor tiles: {}", grid.count(|t| t.is_floor()));
println!();
}
fn demo_template_library() {
println!("📚 Demo 3: Template Library");
let library = TemplateLibrary::new();
println!(" Available templates:");
for name in library.template_names() {
if let Some(template) = library.get_template(name) {
println!(" - {}: {}", name, template.description);
}
}
if let Some(template) = library.get_template("simple_dungeon") {
let pipeline = template.instantiate(None);
let mut grid = Grid::new(40, 30);
let mut context = PipelineContext::new();
let mut rng = Rng::new(11111);
let result = pipeline.execute(&mut grid, &mut context, &mut rng);
println!("\n Executed 'simple_dungeon' template:");
println!(
" Result: {}",
if result.success {
"✅ Success"
} else {
"❌ Failed"
}
);
println!(" Floor tiles: {}", grid.count(|t| t.is_floor()));
println!(" Steps executed: {}", context.execution_history().len());
}
println!();
}