summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-05-16 12:03:49 +0200
committertroido <troido@protonmail.com>2020-05-16 12:03:49 +0200
commitdc25e66031fc0a1fbdb15579ad346bcb3903b3bb (patch)
tree5d1bb73ce84afec2683367e29a73968603fe1898 /src
parent9c4e59b670d22fbfa23def1d66a10ea3af4c214d (diff)
encyclopedia can be split over different files
Diffstat (limited to 'src')
-rw-r--r--src/encyclopedia.rs9
-rw-r--r--src/main.rs9
-rw-r--r--src/worldloader.rs22
3 files changed, 28 insertions, 12 deletions
diff --git a/src/encyclopedia.rs b/src/encyclopedia.rs
index 54fa82b..e100cad 100644
--- a/src/encyclopedia.rs
+++ b/src/encyclopedia.rs
@@ -37,7 +37,7 @@ impl Encyclopedia {
let items =
val
.get("items")
- .ok_or(perr!("no items in encyclopedia json"))?
+ .unwrap_or(&json!({}))
.as_object()
.ok_or(perr!("encyclopedia items not a json object"))?
.into_iter()
@@ -105,7 +105,6 @@ impl Encyclopedia {
assemblages,
items
})
-
}
pub fn validate(&self) -> Result<()> {
@@ -125,5 +124,11 @@ impl Encyclopedia {
pub fn get_item(&self, id: &ItemId) -> Option<Item> {
self.items.get(id).map(|item| item.clone())
}
+
+ pub fn merge(mut self, mut other: Encyclopedia) -> Encyclopedia {
+ self.assemblages.extend(other.assemblages.drain());
+ self.items.extend(other.items.drain());
+ self
+ }
}
diff --git a/src/main.rs b/src/main.rs
index 6e916fd..77a41a6 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -101,9 +101,14 @@ fn main(){
);
println!("content directory: {:?}", content_dir);
let loader = WorldLoader::new(content_dir);
- let WorldMeta{encyclopedia_name, default_room} = loader.load_world_meta().expect("Failed to load world meta information");
+ let WorldMeta{encyclopediae, default_room} = loader.load_world_meta().expect("Failed to load world meta information");
- let encyclopedia = loader.load_encyclopedia(&encyclopedia_name).expect("Failed to load encyclopedia");
+ let mut encyclopedia = Encyclopedia::default();
+ for enc in encyclopediae {
+ encyclopedia = encyclopedia.merge(
+ loader.load_encyclopedia(&enc).expect(&format!("Failed to load encyclopedia {}", enc))
+ )
+ }
let save_dir = config.save_dir.unwrap_or(
FileStorage::default_save_dir().expect("couldn't find any save directory")
diff --git a/src/worldloader.rs b/src/worldloader.rs
index 9389e58..8e0622e 100644
--- a/src/worldloader.rs
+++ b/src/worldloader.rs
@@ -34,16 +34,22 @@ impl WorldLoader {
.as_str()
.ok_or(aerr!("world meta default_room is not a string"))?
);
- let encyclopedia_name =
+ let encyclopediae =
json
- .get("encyclopedia")
- .ok_or(aerr!("world meta does not have encyclopedia"))?
- .as_str()
- .ok_or(aerr!("world meta encyclopedia is not a string"))?
- .to_string();
+ .get("encyclopediae")
+ .ok_or(aerr!("world meta does not have encyclopediae"))?
+ .as_array()
+ .ok_or(aerr!("world meta encyclopediae is not a list"))?
+ .iter()
+ .map(|v| Ok(v
+ .as_str()
+ .ok_or(aerr!("world meta encyclopediae item {:?} is not a string", v))?
+ .to_string()
+ ))
+ .collect::<Result<Vec<String>>>()?;
Ok(WorldMeta{
default_room,
- encyclopedia_name
+ encyclopediae
})
}
@@ -73,7 +79,7 @@ impl WorldLoader {
}
pub struct WorldMeta {
- pub encyclopedia_name: String,
+ pub encyclopediae: Vec<String>,
pub default_room: RoomId
}