basic/
basic.rs

1//! Basic example: Simple stat resolution with sources and transforms
2//!
3//! This example demonstrates:
4//! - Registering stat sources (additive)
5//! - Applying transforms
6//! - Resolving stats
7
8use zzstat::source::ConstantSource;
9use zzstat::transform::MultiplicativeTransform;
10use zzstat::*;
11
12fn main() -> Result<(), StatError> {
13    // Create a new stat resolver
14    let mut resolver = StatResolver::new();
15
16    // Define a stat ID
17    let hp_id = StatId::from_str("HP");
18
19    // Register multiple sources (they will be summed)
20    println!("Registering sources for HP:");
21    resolver.register_source(hp_id.clone(), Box::new(ConstantSource(100.0)));
22    println!("  - Base HP: 100");
23
24    resolver.register_source(hp_id.clone(), Box::new(ConstantSource(50.0)));
25    println!("  - Item bonus: +50");
26
27    // Register a transform (percentage modifier)
28    println!("\nRegistering transform:");
29    resolver.register_transform(hp_id.clone(), Box::new(MultiplicativeTransform::new(1.2)));
30    println!("  - 20% bonus multiplier");
31
32    // Create context (empty for this example)
33    let context = StatContext::new();
34
35    // Resolve the stat
36    println!("\nResolving HP...");
37    let resolved = resolver.resolve(&hp_id, &context)?;
38
39    // Display results
40    println!("\n=== Resolved Stat ===");
41    println!("Stat ID: {}", resolved.stat_id);
42    println!("Final Value: {:.2}", resolved.value);
43
44    println!("\nSource Breakdown:");
45    for (desc, value) in &resolved.sources {
46        println!("  {}: {:.2}", desc, value);
47    }
48
49    println!("\nTransform Breakdown:");
50    for (desc, value) in &resolved.transforms {
51        println!("  {}: {:.2}", desc, value);
52    }
53
54    println!("\nCalculation: (100 + 50) * 1.2 = {:.2}", resolved.value);
55
56    Ok(())
57}