146 lines
6.3 KiB
Rust
146 lines
6.3 KiB
Rust
//! XML Parser - Loads game data from XML files and populates the SQLite database
|
|
//!
|
|
//! This binary handles:
|
|
//! - Loading all game data from XML files
|
|
//! - Populating the SQLite database with the parsed data
|
|
//! - Generating statistics about the loaded data
|
|
|
|
use cursebreaker_parser::{
|
|
ItemDatabase, NpcDatabase, QuestDatabase, HarvestableDatabase, LootDatabase,
|
|
MapDatabase, FastTravelDatabase, PlayerHouseDatabase, TraitDatabase, ShopDatabase
|
|
};
|
|
use log::{info, warn, LevelFilter};
|
|
use unity_parser::log::DedupLogger;
|
|
use diesel::prelude::*;
|
|
use diesel::sqlite::SqliteConnection;
|
|
|
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
let logger = DedupLogger::new();
|
|
log::set_boxed_logger(Box::new(logger))
|
|
.map(|()| log::set_max_level(LevelFilter::Trace))
|
|
.unwrap();
|
|
|
|
info!("🎮 Cursebreaker - XML Parser");
|
|
info!("📚 Loading game data from XML...");
|
|
|
|
// Load items from XML
|
|
let items_path = "/home/connor/repos/CBAssets/Data/XMLs/Items/Items.xml";
|
|
let item_db = ItemDatabase::load_from_xml(items_path)?;
|
|
info!("✅ Loaded {} items", item_db.len());
|
|
|
|
let npcs_path = "/home/connor/repos/CBAssets/Data/XMLs/Npcs/NPCInfo.xml";
|
|
let npc_db = NpcDatabase::load_from_xml(npcs_path)?;
|
|
info!("✅ Loaded {} NPCs", npc_db.len());
|
|
|
|
let quests_path = "/home/connor/repos/CBAssets/Data/XMLs/Quests/Quests.xml";
|
|
let quest_db = QuestDatabase::load_from_xml(quests_path)?;
|
|
info!("✅ Loaded {} quests", quest_db.len());
|
|
|
|
let harvestables_path = "/home/connor/repos/CBAssets/Data/XMLs/Harvestables/HarvestableInfo.xml";
|
|
let harvestable_db = HarvestableDatabase::load_from_xml(harvestables_path)?;
|
|
info!("✅ Loaded {} harvestables", harvestable_db.len());
|
|
|
|
let loot_path = "/home/connor/repos/CBAssets/Data/XMLs/Loot/Loot.xml";
|
|
let loot_db = LootDatabase::load_from_xml(loot_path)?;
|
|
info!("✅ Loaded {} loot tables", loot_db.len());
|
|
|
|
let maps_path = "/home/connor/repos/CBAssets/Data/XMLs/Maps/Maps.xml";
|
|
let map_db = MapDatabase::load_from_xml(maps_path)?;
|
|
info!("✅ Loaded {} maps", map_db.len());
|
|
|
|
let fast_travel_dir = "/home/connor/repos/CBAssets/Data/XMLs";
|
|
let fast_travel_db = FastTravelDatabase::load_from_directory(fast_travel_dir)?;
|
|
info!("✅ Loaded {} fast travel locations", fast_travel_db.len());
|
|
|
|
let player_houses_path = "/home/connor/repos/CBAssets/Data/XMLs/PlayerHouses/PlayerHouses.xml";
|
|
let player_house_db = PlayerHouseDatabase::load_from_xml(player_houses_path)?;
|
|
info!("✅ Loaded {} player houses", player_house_db.len());
|
|
|
|
let traits_path = "/home/connor/repos/CBAssets/Data/XMLs/Traits/Traits.xml";
|
|
let trait_db = TraitDatabase::load_from_xml(traits_path)?;
|
|
info!("✅ Loaded {} traits", trait_db.len());
|
|
|
|
let shops_path = "/home/connor/repos/CBAssets/Data/XMLs/Shops/Shops.xml";
|
|
let shop_db = ShopDatabase::load_from_xml(shops_path)?;
|
|
info!("✅ Loaded {} shops", shop_db.len());
|
|
|
|
// Save to SQLite database
|
|
info!("\n💾 Saving game data to SQLite database...");
|
|
let mut conn = SqliteConnection::establish("cursebreaker.db")?;
|
|
|
|
match item_db.save_to_db(&mut conn) {
|
|
Ok(count) => info!("✅ Saved {} items to database", count),
|
|
Err(e) => warn!("⚠️ Failed to save items: {}", e),
|
|
}
|
|
|
|
match npc_db.save_to_db(&mut conn) {
|
|
Ok(count) => info!("✅ Saved {} NPCs to database", count),
|
|
Err(e) => warn!("⚠️ Failed to save NPCs: {}", e),
|
|
}
|
|
|
|
match quest_db.save_to_db(&mut conn) {
|
|
Ok(count) => info!("✅ Saved {} quests to database", count),
|
|
Err(e) => warn!("⚠️ Failed to save quests: {}", e),
|
|
}
|
|
|
|
match harvestable_db.save_to_db(&mut conn) {
|
|
Ok(count) => info!("✅ Saved {} harvestables to database", count),
|
|
Err(e) => warn!("⚠️ Failed to save harvestables: {}", e),
|
|
}
|
|
|
|
match loot_db.save_to_db(&mut conn) {
|
|
Ok(count) => info!("✅ Saved {} loot tables to database", count),
|
|
Err(e) => warn!("⚠️ Failed to save loot tables: {}", e),
|
|
}
|
|
|
|
match map_db.save_to_db(&mut conn) {
|
|
Ok(count) => info!("✅ Saved {} maps to database", count),
|
|
Err(e) => warn!("⚠️ Failed to save maps: {}", e),
|
|
}
|
|
|
|
match fast_travel_db.save_to_db(&mut conn) {
|
|
Ok(count) => info!("✅ Saved {} fast travel locations to database", count),
|
|
Err(e) => warn!("⚠️ Failed to save fast travel locations: {}", e),
|
|
}
|
|
|
|
match player_house_db.save_to_db(&mut conn) {
|
|
Ok(count) => info!("✅ Saved {} player houses to database", count),
|
|
Err(e) => warn!("⚠️ Failed to save player houses: {}", e),
|
|
}
|
|
|
|
match trait_db.save_to_db(&mut conn) {
|
|
Ok(count) => info!("✅ Saved {} traits to database", count),
|
|
Err(e) => warn!("⚠️ Failed to save traits: {}", e),
|
|
}
|
|
|
|
match shop_db.save_to_db(&mut conn) {
|
|
Ok(count) => info!("✅ Saved {} shops to database", count),
|
|
Err(e) => warn!("⚠️ Failed to save shops: {}", e),
|
|
}
|
|
|
|
// Print statistics
|
|
info!("\n📊 Game Data Statistics:");
|
|
info!(" Items:");
|
|
info!(" • Weapons: {}", item_db.get_by_slot("weapon").len());
|
|
info!(" • Consumables: {}", item_db.get_by_slot("consumable").len());
|
|
info!(" NPCs:");
|
|
info!(" • Hostile: {}", npc_db.get_hostile().len());
|
|
info!(" • Interactable: {}", npc_db.get_interactable().len());
|
|
info!(" Quests:");
|
|
info!(" • Main quests: {}", quest_db.get_main_quests().len());
|
|
info!(" • Side quests: {}", quest_db.get_side_quests().len());
|
|
info!(" Harvestables:");
|
|
info!(" • Trees: {}", harvestable_db.get_trees().len());
|
|
info!(" • Woodcutting: {}", harvestable_db.get_by_skill("Woodcutting").len());
|
|
info!(" • Mining: {}", harvestable_db.get_by_skill("mining").len());
|
|
info!(" • Fishing: {}", harvestable_db.get_by_skill("Fishing").len());
|
|
info!(" • Alchemy: {}", harvestable_db.get_by_skill("Alchemy").len());
|
|
info!(" Loot:");
|
|
info!(" • Total tables: {}", loot_db.len());
|
|
info!(" • NPCs with loot: {}", loot_db.get_all_npcs_with_loot().len());
|
|
info!(" • Droppable items: {}", loot_db.get_all_droppable_items().len());
|
|
info!(" • Tables with conditional drops: {}", loot_db.get_conditional_tables().len());
|
|
|
|
Ok(())
|
|
}
|