summaryrefslogtreecommitdiff
path: root/src/encyclopedia.rs
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-04-05 20:04:33 +0200
committertroido <troido@protonmail.com>2020-04-05 20:04:33 +0200
commit48c24ec8b011d081550dc78329cbe61de67b30e9 (patch)
treed2d700897dc5ba3d0f52e8a1cd57c0f4880272fd /src/encyclopedia.rs
parent84c70cee089b72720a85d285ee0437b65be298b9 (diff)
items are now mostly replaced by itemids, with a mapping to the item in the encyclopedia
Diffstat (limited to 'src/encyclopedia.rs')
-rw-r--r--src/encyclopedia.rs82
1 files changed, 73 insertions, 9 deletions
diff --git a/src/encyclopedia.rs b/src/encyclopedia.rs
index 4e09f22..fe9a9d3 100644
--- a/src/encyclopedia.rs
+++ b/src/encyclopedia.rs
@@ -1,34 +1,98 @@
use std::collections::HashMap;
-use serde_json::Value;
+use serde_json::{Value, json};
use crate::{
assemblage::Assemblage,
componentwrapper::PreEntity,
Template,
template::EntityType,
Result,
- aerr
+ aerr,
+ ItemId,
+ item::Item,
+ item::ItemAction
};
#[derive(Default, Clone)]
pub struct Encyclopedia {
- items: HashMap<EntityType, Assemblage>
+ assemblages: HashMap<EntityType, Assemblage>,
+ items: HashMap<ItemId, Item>
}
impl Encyclopedia {
pub fn from_json(val: Value) -> Result<Encyclopedia> {
- let mut items = HashMap::new();
- for (k, v) in val.get("assemblages").ok_or(aerr!("no assemblages in encyclopedia json"))?.as_object().ok_or(aerr!("encyclopedia not a json object"))?.into_iter() {
- items.insert(EntityType(k.clone()), Assemblage::from_json(v)?);
- }
- Ok(Encyclopedia{items})
+ let mut assemblages =
+ val
+ .get("assemblages")
+ .ok_or(aerr!("no assemblages in encyclopedia json"))?
+ .as_object()
+ .ok_or(aerr!("encyclopedia assemblages not a json object"))?
+ .into_iter()
+ .map(|(k, v)| Ok((EntityType(k.clone()), Assemblage::from_json(v)?)))
+ .collect::<Result<HashMap<EntityType, Assemblage>>>()?;
+ let items =
+ val
+ .get("items")
+ .ok_or(aerr!("no items in encyclopedia json"))?
+ .as_object()
+ .ok_or(aerr!("encyclopedia items not a json object"))?
+ .into_iter()
+ .map(|(k, v)| {
+ let id = ItemId(k.clone());
+ let sprite =
+ if let Some(sprite) = v.get("sprite") {
+ sprite.as_str().ok_or(aerr!("item sprite not a string: {:?}", v))?
+ } else {
+ k
+ };
+ let name =
+ if let Some(name) = v.get("name") {
+ name.as_str().ok_or(aerr!("item name not a string: {:?}", v))?.to_string()
+ } else {
+ k.to_string()
+ };
+ let item = Item {
+ name: name.clone(),
+ ent:
+ if let Some(ent) = v.get("entity") {
+ Template::from_json(ent)?
+ } else {
+ let enttyp = EntityType(k.clone());
+ assemblages.insert(enttyp.clone(), Assemblage::from_json(&json!({
+ "height": 0.3,
+ "sprite": sprite,
+ "name": name,
+ "item": k
+ }))?);
+ Template::from_entity_type(enttyp)
+ },
+ action:
+ if let Some(action) = v.get("action") {
+ ItemAction::from_json(action).ok_or(aerr!("failed to parse ItemAction: {:?}", v))?
+ } else {
+ ItemAction::None
+ }
+ };
+ Ok((id, item))
+ })
+ .collect::<Result<HashMap<ItemId, Item>>>()?;
+
+ Ok(Encyclopedia{
+ assemblages,
+ items
+ })
}
pub fn construct(&self, template: &Template) -> Result<PreEntity> {
- let assemblage = self.items.get(&template.name).ok_or(aerr!("unknown assemblage name: '{:?}' in {:?}", template.name, template))?;
+ let assemblage = self.assemblages
+ .get(&template.name)
+ .ok_or(aerr!("unknown assemblage name: '{:?}' in {:?}", template.name, template))?;
assemblage.instantiate(template)
}
+ pub fn get_item(&self, id: &ItemId) -> Option<Item> {
+ self.items.get(id).map(|item| item.clone())
+ }
}