diff --git a/cursebreaker-parser/README.md b/cursebreaker-parser/README.md new file mode 100644 index 0000000..1dfe0dc --- /dev/null +++ b/cursebreaker-parser/README.md @@ -0,0 +1,121 @@ +# Cursebreaker Parser + +A Rust library for parsing and managing game data from the Cursebreaker game. This crate provides tools to extract, load, and query game data from Unity scenes and XML files. + +## Overview + +Cursebreaker Parser is designed to: +- Parse Unity scenes and extract game objects using the unity-parser library +- Load game data from XML files (Items, NPCs, Quests, Harvestables, Loot tables) +- Provide in-memory databases for efficient querying of game data +- Serialize game data to SQL format for database storage + +## Features + +- **Item Database**: Load and query items with support for filtering by ID, category, slot, and other attributes +- **NPC Database**: Manage NPC data including stats, levels, animations, and quest markers +- **Quest Database**: Handle quest definitions, phases, and rewards +- **Harvestable Database**: Track harvestable resources and their drop tables +- **Loot Database**: Manage loot tables and drop configurations +- **XML Parsing**: Robust XML parsing with error handling +- **SQL Export**: Prepare data for SQL database insertion + +## Usage + +### Loading Items from XML + +```rust +use cursebreaker_parser::ItemDatabase; + +// Load all items from XML +let item_db = ItemDatabase::load_from_xml("Data/XMLs/Items/Items.xml")?; +println!("Loaded {} items", item_db.len()); + +// Get item by ID +if let Some(item) = item_db.get_by_id(150) { + println!("Found: {}", item.name); +} + +// Query items by category +let weapons = item_db.get_by_category("bow"); +println!("Found {} bows", weapons.len()); + +// Query items by slot +let consumables = item_db.get_by_slot("consumable"); +for item in consumables { + println!("Consumable: {}", item.name); +} +``` + +### Preparing Data for SQL + +```rust +use cursebreaker_parser::ItemDatabase; + +let item_db = ItemDatabase::load_from_xml("Data/XMLs/Items/Items.xml")?; + +// Prepare data for SQL insertion +// Returns Vec<(id, name, json_data)> +let sql_data = item_db.prepare_for_sql(); + +for (id, name, json) in sql_data.iter().take(5) { + println!("INSERT INTO items VALUES ({}, '{}', '{}')", id, name, json); +} +``` + +## Project Structure + +``` +cursebreaker-parser/ +├── src/ +│ ├── lib.rs # Library entry point and public API +│ ├── main.rs # Binary entry point +│ ├── xml_parser.rs # XML parsing utilities +│ ├── item_loader.rs # Item loading logic +│ ├── databases/ # Database implementations +│ │ ├── item_database.rs +│ │ ├── npc_database.rs +│ │ ├── quest_database.rs +│ │ ├── harvestable_database.rs +│ │ └── loot_database.rs +│ └── types/ # Type definitions +│ ├── cursebreaker/ # Game-specific types (Items, NPCs, Quests, etc.) +│ └── monobehaviours/ # Unity MonoBehaviour types +├── examples/ # Example usage +├── Cargo.toml # Package configuration +└── XML_PARSING.md # XML parsing documentation + +``` + +## Dependencies + +- **unity-parser**: For parsing Unity scene files +- **quick-xml**: XML parsing +- **serde**: Serialization/deserialization +- **serde_json**: JSON support +- **serde_yaml**: YAML support +- **sparsey**: ECS (Entity Component System) support +- **diesel**: Optional SQL database support +- **thiserror**: Error handling + +## Building + +```bash +# Build the library +cargo build + +# Run tests +cargo test + +# Build with SQL support +cargo build --features diesel +``` + +## Documentation + +For detailed XML parsing information, see [XML_PARSING.md](XML_PARSING.md). + +Generate API documentation: +```bash +cargo doc --open +``` diff --git a/cursebreaker-parser/src/harvestable_database.rs b/cursebreaker-parser/src/databases/harvestable_database.rs similarity index 100% rename from cursebreaker-parser/src/harvestable_database.rs rename to cursebreaker-parser/src/databases/harvestable_database.rs diff --git a/cursebreaker-parser/src/item_database.rs b/cursebreaker-parser/src/databases/item_database.rs similarity index 100% rename from cursebreaker-parser/src/item_database.rs rename to cursebreaker-parser/src/databases/item_database.rs diff --git a/cursebreaker-parser/src/loot_database.rs b/cursebreaker-parser/src/databases/loot_database.rs similarity index 100% rename from cursebreaker-parser/src/loot_database.rs rename to cursebreaker-parser/src/databases/loot_database.rs diff --git a/cursebreaker-parser/src/databases/mod.rs b/cursebreaker-parser/src/databases/mod.rs new file mode 100644 index 0000000..3467ad3 --- /dev/null +++ b/cursebreaker-parser/src/databases/mod.rs @@ -0,0 +1,11 @@ +mod item_database; +mod npc_database; +mod quest_database; +mod harvestable_database; +mod loot_database; + +pub use item_database::ItemDatabase; +pub use npc_database::NpcDatabase; +pub use quest_database::QuestDatabase; +pub use harvestable_database::HarvestableDatabase; +pub use loot_database::LootDatabase; diff --git a/cursebreaker-parser/src/npc_database.rs b/cursebreaker-parser/src/databases/npc_database.rs similarity index 100% rename from cursebreaker-parser/src/npc_database.rs rename to cursebreaker-parser/src/databases/npc_database.rs diff --git a/cursebreaker-parser/src/quest_database.rs b/cursebreaker-parser/src/databases/quest_database.rs similarity index 100% rename from cursebreaker-parser/src/quest_database.rs rename to cursebreaker-parser/src/databases/quest_database.rs diff --git a/cursebreaker-parser/src/lib.rs b/cursebreaker-parser/src/lib.rs index b726315..1bcf2ad 100644 --- a/cursebreaker-parser/src/lib.rs +++ b/cursebreaker-parser/src/lib.rs @@ -50,19 +50,17 @@ //! ``` pub mod types; +pub mod databases; mod xml_parser; mod item_loader; -mod item_database; -mod npc_database; -mod quest_database; -mod harvestable_database; -mod loot_database; -pub use item_database::ItemDatabase; -pub use npc_database::NpcDatabase; -pub use quest_database::QuestDatabase; -pub use harvestable_database::HarvestableDatabase; -pub use loot_database::LootDatabase; +pub use databases::{ + ItemDatabase, + NpcDatabase, + QuestDatabase, + HarvestableDatabase, + LootDatabase, +}; pub use types::{ // Items Item, diff --git a/cursebreaker-parser/src/types/harvestable.rs b/cursebreaker-parser/src/types/cursebreaker/harvestable.rs similarity index 100% rename from cursebreaker-parser/src/types/harvestable.rs rename to cursebreaker-parser/src/types/cursebreaker/harvestable.rs diff --git a/cursebreaker-parser/src/types/item.rs b/cursebreaker-parser/src/types/cursebreaker/item.rs similarity index 100% rename from cursebreaker-parser/src/types/item.rs rename to cursebreaker-parser/src/types/cursebreaker/item.rs diff --git a/cursebreaker-parser/src/types/loot.rs b/cursebreaker-parser/src/types/cursebreaker/loot.rs similarity index 100% rename from cursebreaker-parser/src/types/loot.rs rename to cursebreaker-parser/src/types/cursebreaker/loot.rs diff --git a/cursebreaker-parser/src/types/cursebreaker/mod.rs b/cursebreaker-parser/src/types/cursebreaker/mod.rs new file mode 100644 index 0000000..9c9a74f --- /dev/null +++ b/cursebreaker-parser/src/types/cursebreaker/mod.rs @@ -0,0 +1,32 @@ +mod item; +mod npc; +mod quest; +mod harvestable; +mod loot; + +pub use item::{ + // Main types + Item, + ItemStat, + CraftingRecipe, + CraftingRecipeItem, + AnimationSet, + GenerateRule, + // Enums + ItemType, + ItemCategory, + Tool, + SkillType, + StatType, + // Nested structs + Stat, + ItemXpBoost, + PermanentStatBoost, + CustomItemName, + // Constants + MAX_STACK, +}; +pub use npc::{Npc, NpcStat, NpcLevel, RightClick, BarkGroup, Bark, QuestMarker, NpcAnimationSet}; +pub use quest::{Quest, QuestPhase, QuestReward}; +pub use harvestable::{Harvestable, HarvestableDrop}; +pub use loot::{LootTable, LootDrop}; diff --git a/cursebreaker-parser/src/types/npc.rs b/cursebreaker-parser/src/types/cursebreaker/npc.rs similarity index 100% rename from cursebreaker-parser/src/types/npc.rs rename to cursebreaker-parser/src/types/cursebreaker/npc.rs diff --git a/cursebreaker-parser/src/types/quest.rs b/cursebreaker-parser/src/types/cursebreaker/quest.rs similarity index 100% rename from cursebreaker-parser/src/types/quest.rs rename to cursebreaker-parser/src/types/cursebreaker/quest.rs diff --git a/cursebreaker-parser/src/types/mod.rs b/cursebreaker-parser/src/types/mod.rs index 7e2353e..7579767 100644 --- a/cursebreaker-parser/src/types/mod.rs +++ b/cursebreaker-parser/src/types/mod.rs @@ -1,34 +1,5 @@ -mod interactable_resource; -mod item; -mod npc; -mod quest; -mod harvestable; -mod loot; +pub mod monobehaviours; +pub mod cursebreaker; -pub use interactable_resource::InteractableResource; -pub use item::{ - // Main types - Item, - ItemStat, - CraftingRecipe, - CraftingRecipeItem, - AnimationSet, - GenerateRule, - // Enums - ItemType, - ItemCategory, - Tool, - SkillType, - StatType, - // Nested structs - Stat, - ItemXpBoost, - PermanentStatBoost, - CustomItemName, - // Constants - MAX_STACK, -}; -pub use npc::{Npc, NpcStat, NpcLevel, RightClick, BarkGroup, Bark, QuestMarker, NpcAnimationSet}; -pub use quest::{Quest, QuestPhase, QuestReward}; -pub use harvestable::{Harvestable, HarvestableDrop}; -pub use loot::{LootTable, LootDrop}; +pub use monobehaviours::*; +pub use cursebreaker::*; diff --git a/cursebreaker-parser/src/types/interactable_resource.rs b/cursebreaker-parser/src/types/monobehaviours/interactable_resource.rs similarity index 100% rename from cursebreaker-parser/src/types/interactable_resource.rs rename to cursebreaker-parser/src/types/monobehaviours/interactable_resource.rs diff --git a/cursebreaker-parser/src/types/monobehaviours/mod.rs b/cursebreaker-parser/src/types/monobehaviours/mod.rs new file mode 100644 index 0000000..21249cc --- /dev/null +++ b/cursebreaker-parser/src/types/monobehaviours/mod.rs @@ -0,0 +1,3 @@ +mod interactable_resource; + +pub use interactable_resource::InteractableResource;