Files
cursebreaker-parser-rust/cursebreaker-parser/examples/game_data_demo.rs
2026-01-07 10:17:30 +00:00

232 lines
8.7 KiB
Rust

//! Example demonstrating combined Items, NPCs, Quests, and Harvestables database usage
//!
//! Run with: cargo run --example game_data_demo
use cursebreaker_parser::{ItemDatabase, NpcDatabase, QuestDatabase, HarvestableDatabase};
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("🎮 Cursebreaker Game Data Demo\n");
// Load all game data
println!("📚 Loading game data...");
let item_db = ItemDatabase::load_from_xml("/home/connor/repos/CBAssets/Data/XMLs/Items/Items.xml")?;
let npc_db = NpcDatabase::load_from_xml("/home/connor/repos/CBAssets/Data/XMLs/Npcs/NPCInfo.xml")?;
let quest_db = QuestDatabase::load_from_xml("/home/connor/repos/CBAssets/Data/XMLs/Quests/Quests.xml")?;
let harvestable_db = HarvestableDatabase::load_from_xml("/home/connor/repos/CBAssets/Data/XMLs/Harvestables/HarvestableInfo.xml")?;
println!("✅ Loaded {} items", item_db.len());
println!("✅ Loaded {} NPCs", npc_db.len());
println!("✅ Loaded {} quests", quest_db.len());
println!("✅ Loaded {} harvestables\n", harvestable_db.len());
// =======================================================================
// Items
// =======================================================================
println!("=== Items ===");
let weapons = item_db.get_by_slot("weapon");
let armor = item_db.get_by_slot("armor");
let consumables = item_db.get_by_slot("consumable");
println!("By slot:");
println!(" • Weapons: {}", weapons.len());
println!(" • Armor: {}", armor.len());
println!(" • Consumables: {}", consumables.len());
// Find specific item
if let Some(sword) = item_db.get_by_id(150) {
println!("\nSample item (ID 150):");
println!(" Name: {}", sword.name);
if let Some(desc) = &sword.description {
println!(" Description: {}", desc);
}
if let Some(skill) = &sword.skill {
println!(" Skill: {}", skill);
}
}
println!();
// =======================================================================
// NPCs
// =======================================================================
println!("=== NPCs ===");
let hostile = npc_db.get_hostile();
let interactable = npc_db.get_interactable();
let shopkeepers = npc_db.get_shopkeepers();
println!("By type:");
println!(" • Hostile NPCs: {}", hostile.len());
println!(" • Interactable NPCs: {}", interactable.len());
println!(" • Shopkeepers: {}", shopkeepers.len());
// Find NPCs by tag
let undead = npc_db.get_by_tag("Undead");
let predators = npc_db.get_by_tag("Predator");
println!("\nBy tag:");
println!(" • Undead: {}", undead.len());
println!(" • Predators: {}", predators.len());
// Sample hostile NPC
if let Some(wolf) = npc_db.get_by_id(1) {
println!("\nSample hostile NPC (ID 1):");
println!(" Name: {}", wolf.name);
if let Some(level) = wolf.level {
println!(" Level: {}", level);
}
if let Some(aggro) = wolf.aggrodistance {
println!(" Aggro Distance: {}", aggro);
}
if let Some(speed) = wolf.movementspeed {
println!(" Movement Speed: {}", speed);
}
println!(" Stats: {} stat entries", wolf.stats.len());
}
// Sample interactable NPC
println!("\nSample shopkeepers:");
for shopkeeper in shopkeepers.iter().take(3) {
println!("{} (Shop ID: {:?})", shopkeeper.name, shopkeeper.shop);
}
println!();
// =======================================================================
// Quests
// =======================================================================
println!("=== Quests ===");
let main_quests = quest_db.get_main_quests();
let side_quests = quest_db.get_side_quests();
let hidden_quests = quest_db.get_hidden_quests();
println!("By type:");
println!(" • Main quests: {}", main_quests.len());
println!(" • Side quests: {}", side_quests.len());
println!(" • Hidden quests: {}", hidden_quests.len());
// Main quest details
println!("\nMain quests:");
for quest in main_quests.iter().take(5) {
println!("{} (ID: {}, {} phases)",
quest.name, quest.id, quest.phase_count());
}
// Sample quest details
if let Some(quest) = quest_db.get_by_id(1) {
println!("\nSample quest (ID 1):");
println!(" Name: {}", quest.name);
println!(" Phases: {}", quest.phases.len());
println!(" Rewards: {}", quest.rewards.len());
if let Some(phase) = quest.get_phase(1) {
if let Some(desc) = &phase.trackerdescription {
println!(" Phase 1: {}", desc);
}
}
if !quest.rewards.is_empty() {
println!(" Quest rewards:");
for reward in &quest.rewards {
if let Some(item_id) = reward.item {
if let Some(item) = item_db.get_by_id(item_id) {
println!(" - {} x{}", item.name, reward.amount.unwrap_or(1));
}
} else if let Some(skill) = &reward.skill {
println!(" - {} XP: {}", skill, reward.xp.unwrap_or(0));
}
}
}
}
println!();
// =======================================================================
// Harvestables
// =======================================================================
println!("=== Harvestables ===");
let trees = harvestable_db.get_trees();
let woodcutting = harvestable_db.get_by_skill("Woodcutting");
let mining = harvestable_db.get_by_skill("mining");
let fishing = harvestable_db.get_by_skill("Fishing");
let alchemy = harvestable_db.get_by_skill("Alchemy");
println!("By skill:");
println!(" • Trees: {}", trees.len());
println!(" • Woodcutting: {}", woodcutting.len());
println!(" • Mining: {}", mining.len());
println!(" • Fishing: {}", fishing.len());
println!(" • Alchemy: {}", alchemy.len());
// Sample harvestable
if let Some(spruce) = harvestable_db.get_by_typeid(1) {
println!("\nSample harvestable (TypeID 1):");
println!(" Name: {}", spruce.name);
println!(" Action: {}", spruce.actionname.as_deref().unwrap_or("N/A"));
if let Some(level) = spruce.level {
println!(" Level: {}", level);
}
if let Some(skill) = &spruce.skill {
println!(" Skill: {}", skill);
}
if let Some(tool) = &spruce.tool {
println!(" Tool: {}", tool);
}
println!(" Drops: {} different items", spruce.drops.len());
// Show drops
println!(" Item drops:");
for drop in &spruce.drops {
if let Some(item) = item_db.get_by_id(drop.id) {
println!(" - {} ({}x{}, rate: {})",
item.name,
drop.minamount.unwrap_or(1),
drop.maxamount.unwrap_or(1),
drop.droprate.unwrap_or(0));
}
}
}
println!("\nHarvestables by level:");
let low_level = harvestable_db.get_by_level_range(1, 10);
let mid_level = harvestable_db.get_by_level_range(11, 50);
let high_level = harvestable_db.get_by_level_range(51, 100);
println!(" • Level 1-10: {}", low_level.len());
println!(" • Level 11-50: {}", mid_level.len());
println!(" • Level 51-100: {}", high_level.len());
println!();
// =======================================================================
// Cross-referencing data
// =======================================================================
println!("=== Cross-referencing Data ===");
// Find NPCs that give quests
let mut quest_givers = 0;
for npc in npc_db.all_npcs() {
if !npc.questmarkers.is_empty() {
quest_givers += 1;
}
}
println!("NPCs with quest markers: {}", quest_givers);
// Find items that are quest rewards
let mut quest_reward_items = std::collections::HashSet::new();
for quest in quest_db.all_quests() {
for reward in &quest.rewards {
if let Some(item_id) = reward.item {
quest_reward_items.insert(item_id);
}
}
}
println!("Unique items used as quest rewards: {}", quest_reward_items.len());
// Find items that are harvestable drops
let mut harvestable_items = std::collections::HashSet::new();
for harvestable in harvestable_db.all_harvestables() {
for drop in &harvestable.drops {
harvestable_items.insert(drop.id);
}
}
println!("Unique items from harvestables: {}", harvestable_items.len());
println!("\n✨ Demo complete!");
Ok(())
}