Files
cursebreaker-parser-rust/cursebreaker-parser/examples/traits_example.rs
2026-01-11 02:46:49 +00:00

109 lines
4.0 KiB
Rust

use cursebreaker_parser::TraitDatabase;
use std::env;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 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(())
}