use cursebreaker_parser::TraitDatabase; use std::env; fn main() -> Result<(), Box> { // Load all traits from XML let cb_assets_path = env::var("CB_ASSETS_PATH").unwrap_or_else(|_| "/home/connor/repos/CBAssets".to_string()); let trait_db = TraitDatabase::load_from_xml( &format!("{}/Data/XMLs/Traits/Traits.xml", cb_assets_path), )?; println!("=== Trait Database Statistics ==="); println!("Total traits: {}", trait_db.len()); println!("Trainer traits: {}", trait_db.get_trainer_traits().len()); println!("Ability traits: {}", trait_db.get_ability_traits().len()); println!("Novice traits: {}", trait_db.get_novice_traits().len()); println!("Experienced traits: {}", trait_db.get_experienced_traits().len()); println!("Master traits: {}", trait_db.get_master_traits().len()); println!(); // Show all skills println!("=== All Skills ==="); let mut skills = trait_db.get_all_skills(); skills.sort(); for skill in &skills { let count = trait_db.get_by_skill(skill).len(); println!(" {} ({} traits)", skill, count); } println!(); // Show traits for a specific skill println!("=== Woodcutting Traits (sorted by level) ==="); let woodcutting = trait_db.get_sorted_by_level("woodcutting"); for trait_obj in woodcutting.iter().take(10) { if let Some(level) = trait_obj.get_required_level() { let tier = if trait_obj.is_novice() { " (Novice)" } else if trait_obj.is_experienced() { " (Experienced)" } else if trait_obj.is_master() { " (Master)" } else { "" }; println!(" [Lvl {}] {}{}", level, trait_obj.name, tier); } } println!("... and {} more", woodcutting.len().saturating_sub(10)); println!(); // Show master tier traits println!("=== Master Tier Traits ==="); let masters = trait_db.get_master_traits(); for trait_obj in &masters { if let (Some(skill), Some(level)) = (trait_obj.get_required_skill(), trait_obj.get_required_level()) { println!(" {} - {} (Level {})", trait_obj.name, skill, level); } } println!(); // Show ability traits println!("=== Traits that Teach Abilities (first 10) ==="); let abilities = trait_db.get_ability_traits(); for trait_obj in abilities.iter().take(10) { if let Some(ability_id) = trait_obj.learnability { println!( " {} - teaches ability {}", trait_obj.name, ability_id ); if let (Some(skill), Some(level)) = (trait_obj.get_required_skill(), trait_obj.get_required_level()) { println!(" Requires: {} level {}", skill, level); } } } println!("... and {} more", abilities.len().saturating_sub(10)); println!(); // Show traits by level range println!("=== Combat Traits (Levels 15-25) ==="); let combat_traits = trait_db.get_by_skill_and_level("swordsmanship", 15, 25); for trait_obj in &combat_traits { if let Some(level) = trait_obj.get_required_level() { println!(" [Lvl {}] {}", level, trait_obj.name); } } println!(); // Show details of a specific trait if let Some(trait_obj) = trait_db.get_by_id(272) { println!("=== Trait Details (ID 272) ==="); println!("Name: {}", trait_obj.name); println!("Description (plain): {}", trait_obj.get_plain_description()); if let Some(ref trainer) = trait_obj.trainer { println!("Skill: {}", trainer.skill); println!("Level: {}", trainer.level); if let Some(tier) = trainer.tier_icon { println!("Tier: {}", tier); } } if let Some(ability_id) = trait_obj.learnability { println!("Teaches ability: {}", ability_id); } if let Some(ref comment) = trait_obj.comment { println!("Comment: {}", comment); } } Ok(()) }