From dc1cb0562f4c808ca692cd9f02033272fa97020a Mon Sep 17 00:00:00 2001 From: Llywelwyn Date: Sun, 30 Jul 2023 09:27:47 +0100 Subject: [PATCH] cleans up raws/mod.rs with trait impls for json parsing --- raws/loot_tables.json | 9 +++++++ raws/mobs.json | 3 ++- src/raws/loot_table_structs.rs | 13 ++++++++++ src/raws/mod.rs | 46 ++++++++++++++++++++-------------- src/raws/rawmaster.rs | 10 +++++++- 5 files changed, 60 insertions(+), 21 deletions(-) create mode 100644 raws/loot_tables.json create mode 100644 src/raws/loot_table_structs.rs diff --git a/raws/loot_tables.json b/raws/loot_tables.json new file mode 100644 index 0000000..f177e5b --- /dev/null +++ b/raws/loot_tables.json @@ -0,0 +1,9 @@ +[ + { + "id": "animal", + "table": [ + { "id": "animal_hide", "weight": 1}, + { "id": "animal_meat", "weight": 1} + ] + } +] diff --git a/raws/mobs.json b/raws/mobs.json index f9792e0..8f4e33d 100644 --- a/raws/mobs.json +++ b/raws/mobs.json @@ -85,7 +85,8 @@ "flags": ["MONSTER", "BLOCKS_TILE"], "bac": 6, "vision_range": 8, - "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }] + "attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }], + "equipped": ["equip_shortsword", "equip_body_leather", "equip_head_leather"] }, { "id": "chicken", diff --git a/src/raws/loot_table_structs.rs b/src/raws/loot_table_structs.rs new file mode 100644 index 0000000..78c9856 --- /dev/null +++ b/src/raws/loot_table_structs.rs @@ -0,0 +1,13 @@ +use serde::Deserialize; + +#[derive(Deserialize, Debug)] +pub struct LootTable { + pub id: String, + pub table: Vec, +} + +#[derive(Deserialize, Debug)] +pub struct LootTableEntry { + pub id: String, + pub weight: i32, +} diff --git a/src/raws/mod.rs b/src/raws/mod.rs index 2b25521..3b0dfee 100644 --- a/src/raws/mod.rs +++ b/src/raws/mod.rs @@ -9,6 +9,8 @@ mod prop_structs; use prop_structs::Prop; mod spawn_table_structs; use spawn_table_structs::*; +mod loot_table_structs; +use loot_table_structs::*; use std::sync::Mutex; lazy_static! { @@ -21,42 +23,48 @@ pub struct Raws { pub mobs: Vec, pub props: Vec, pub spawn_tables: Vec, + pub loot_tables: 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"); 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"); let decoded_raws = get_decoded_raws(); RAWS.lock().unwrap().load(decoded_raws); } pub fn get_decoded_raws() -> Raws { - // Get items from file - let mut raw_data = rltk::embedding::EMBED.lock().get_resource("../../raws/items.json".to_string()).unwrap(); - let mut raw_string = std::str::from_utf8(&raw_data).expect("Unable to convert to a valid UTF-8 string."); - let items: Vec = serde_json::from_str(&raw_string).expect("Unable to parse items.json"); - // Get mobs from file - raw_data = rltk::embedding::EMBED.lock().get_resource("../../raws/mobs.json".to_string()).unwrap(); - raw_string = std::str::from_utf8(&raw_data).expect("Unable to convert to a valid UTF-8 string."); - let mobs: Vec = serde_json::from_str(&raw_string).expect("Unable to parse mobs.json"); - // Get props from file - raw_data = rltk::embedding::EMBED.lock().get_resource("../../raws/props.json".to_string()).unwrap(); - raw_string = std::str::from_utf8(&raw_data).expect("Unable to convert to a valid UTF-8 string."); - let props: Vec = serde_json::from_str(&raw_string).expect("Unable to parse props.json"); - // Get spawntables from file - raw_data = rltk::embedding::EMBED.lock().get_resource("../../raws/spawn_tables.json".to_string()).unwrap(); - raw_string = std::str::from_utf8(&raw_data).expect("Unable to convert to a valid UTF-8 string."); - let spawn_tables: Vec = serde_json::from_str(&raw_string).expect("Unable to parse spawn_tables.json"); + 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()); - // Create combined raws - let raws = Raws { items, mobs, props, spawn_tables }; - return raws; + return Raws { items, mobs, props, spawn_tables, loot_tables }; } + +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("Unable to convert to a valid UTF-8 string."); + return serde_json::from_str(&raw_string).expect("Unable to parse items.json"); + } + })* + } +} +impl_ParseJson!(for Vec, Vec, Vec, Vec, Vec); diff --git a/src/raws/rawmaster.rs b/src/raws/rawmaster.rs index c13ff03..2d8c393 100644 --- a/src/raws/rawmaster.rs +++ b/src/raws/rawmaster.rs @@ -21,16 +21,24 @@ pub struct RawMaster { mob_index: HashMap, prop_index: HashMap, table_index: HashMap, + loot_index: HashMap, } impl RawMaster { pub fn empty() -> RawMaster { RawMaster { - raws: Raws { items: Vec::new(), mobs: Vec::new(), props: Vec::new(), spawn_tables: Vec::new() }, + raws: Raws { + items: Vec::new(), + mobs: Vec::new(), + props: Vec::new(), + spawn_tables: Vec::new(), + loot_tables: Vec::new(), + }, item_index: HashMap::new(), mob_index: HashMap::new(), prop_index: HashMap::new(), table_index: HashMap::new(), + loot_index: HashMap::new(), } }