use serde::Deserialize; mod rawmaster; pub use rawmaster::*; mod item_structs; use item_structs::*; mod mob_structs; use mob_structs::*; mod prop_structs; use prop_structs::Prop; mod spawn_table_structs; use spawn_table_structs::*; mod loot_table_structs; use loot_table_structs::*; mod reaction_structs; pub use reaction_structs::Reaction; use reaction_structs::{ AncestryData, FactionData }; use std::sync::Mutex; lazy_static! { pub static ref RAWS: Mutex = Mutex::new(RawMaster::empty()); } #[derive(Deserialize, Debug)] pub struct Raws { pub items: Vec, pub mobs: Vec, pub props: Vec, pub spawn_tables: Vec, pub loot_tables: Vec, pub factions: Vec, pub ancestries: Vec, } rltk::embedded_resource!(RAW_ITEMS, "../../raws/items.json"); rltk::embedded_resource!(RAW_MOBS, "../../raws/mobs.json"); rltk::embedded_resource!(RAW_PROPS, "../../raws/props.json"); rltk::embedded_resource!(RAW_SPAWN_TABLES, "../../raws/spawn_tables.json"); rltk::embedded_resource!(RAW_LOOT_TABLES, "../../raws/loot_tables.json"); rltk::embedded_resource!(RAW_FACTIONS, "../../raws/factions.json"); rltk::embedded_resource!(RAW_ANCESTRIES, "../../raws/ancestries.json"); pub fn load_raws() { rltk::link_resource!(RAW_ITEMS, "../../raws/items.json"); rltk::link_resource!(RAW_MOBS, "../../raws/mobs.json"); rltk::link_resource!(RAW_PROPS, "../../raws/props.json"); rltk::link_resource!(RAW_SPAWN_TABLES, "../../raws/spawn_tables.json"); rltk::link_resource!(RAW_LOOT_TABLES, "../../raws/loot_tables.json"); rltk::link_resource!(RAW_FACTIONS, "../../raws/factions.json"); rltk::link_resource!(RAW_ANCESTRIES, "../../raws/ancestries.json"); let decoded_raws = get_decoded_raws(); RAWS.lock().unwrap().load(decoded_raws); } pub fn get_decoded_raws() -> Raws { let items: Vec = ParseJson::parse_raws_into_vector("../../raws/items.json".to_string()); let mobs: Vec = ParseJson::parse_raws_into_vector("../../raws/mobs.json".to_string()); let props: Vec = ParseJson::parse_raws_into_vector("../../raws/props.json".to_string()); let spawn_tables: Vec = ParseJson::parse_raws_into_vector("../../raws/spawn_tables.json".to_string()); let loot_tables: Vec = ParseJson::parse_raws_into_vector("../../raws/loot_tables.json".to_string()); let factions: Vec = ParseJson::parse_raws_into_vector("../../raws/factions.json".to_string()); let ancestries: Vec = ParseJson::parse_raws_into_vector("../../raws/ancestries.json".to_string()); return Raws { items, mobs, props, spawn_tables, loot_tables, factions, ancestries }; } trait ParseJson { fn parse_raws_into_vector(path: String) -> Self; } macro_rules! impl_ParseJson { (for $($t:ty),+) => { $(impl ParseJson for $t { fn parse_raws_into_vector(path: String) -> $t { let raw_data = rltk::embedding::EMBED.lock().get_resource(path).unwrap(); let raw_string = std::str::from_utf8(&raw_data).expect("Failed to convert UTF-8 to &str."); return serde_json::from_str(&raw_string).expect("Failed to convert &str to json"); } })* }; } impl_ParseJson!(for Vec, Vec, Vec, Vec, Vec, Vec, Vec);