diff options
| author | troido <troido@protonmail.com> | 2020-04-20 13:00:34 +0200 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-04-20 13:00:34 +0200 |
| commit | 9ffe36a5375a25601dcc528aa603fb1e679f9847 (patch) | |
| tree | f59c1d315e81b84a2f521d3b4acd2fb52c8936ea /src | |
| parent | 047b23895df301a622cfd3330787ef900c9777e9 (diff) | |
stop hardcoding default room and encyclopedia
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 23 | ||||
| -rw-r--r-- | src/roomtemplate.rs | 1 | ||||
| -rw-r--r-- | src/worldloader.rs | 51 |
3 files changed, 56 insertions, 19 deletions
diff --git a/src/main.rs b/src/main.rs index 20e498d..261d678 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,8 +3,6 @@ use std::thread::sleep; use std::time::Duration; use std::path::PathBuf; use std::sync::{Arc, atomic::{AtomicBool, Ordering}}; -use std::fs; -use serde_json; use structopt::StructOpt; mod server; @@ -56,7 +54,7 @@ use self::{ server::address::Address, persistence::FileStorage, controls::Action, - worldloader::WorldLoader, + worldloader::{WorldLoader, WorldMeta}, world::World, worldmessages::MessageCache }; @@ -84,25 +82,18 @@ fn main(){ .join("content/") ); println!("content directory: {:?}", content_dir); - let loader = WorldLoader::new(content_dir.join("maps")); - let encyclopedia = Encyclopedia::from_json( - serde_json::from_str( - &fs::read_to_string( - content_dir - .join("encyclopediae") - .join("default_encyclopedia.json") - ).expect("can not load default_encyclopedia.json") - ).expect("default_encyclopedia is invalid json") - ).expect("can not load encyclopedia from json"); - encyclopedia.validate().expect("invalid encyclopedia"); + let loader = WorldLoader::new(content_dir); + let WorldMeta{encyclopedia_name, 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 save_dir = config.save_dir.unwrap_or( FileStorage::default_save_dir().expect("couldn't find any save directory") ); - println!("save directory: {:?}", content_dir); + println!("save directory: {:?}", save_dir); let storage = FileStorage::new(save_dir); - let mut world = World::new(encyclopedia, loader, Box::new(storage), RoomId::from_str("room")); + let mut world = World::new(encyclopedia, loader, Box::new(storage), default_room); let mut message_cache = MessageCache::default(); diff --git a/src/roomtemplate.rs b/src/roomtemplate.rs index c8d9918..d853b20 100644 --- a/src/roomtemplate.rs +++ b/src/roomtemplate.rs @@ -43,7 +43,6 @@ impl RoomTemplate { let mut field = Vec::new(); field.resize_with(width * height, Vec::new); let jsonfield: &Vec<Value> = jsonroom.get("field").ok_or(perr!("no field"))?.as_array().ok_or(perr!("field not an array"))?; - // todo: what if size doesn't match actual dimensions for (y, row) in jsonfield.iter().take(height).enumerate() { for (x, ch) in row.as_str().ok_or(perr!("field row not a string"))?.chars().take(width).enumerate() { field[x + y * width] = mapping.get(&ch).ok_or(perr!("char not found in mapping"))?.clone(); diff --git a/src/worldloader.rs b/src/worldloader.rs index 683a310..9389e58 100644 --- a/src/worldloader.rs +++ b/src/worldloader.rs @@ -6,7 +6,9 @@ use serde_json::Value; use crate::{ RoomId, roomtemplate::RoomTemplate, - Result + Result, + aerr, + Encyclopedia }; @@ -21,12 +23,57 @@ impl WorldLoader { } } + pub fn load_world_meta(&self) -> Result<WorldMeta> { + let path = self.directory.join("world.json"); + let text = fs::read_to_string(path)?; + let json: Value = serde_json::from_str(&text)?; + let default_room = RoomId::from_str( + json + .get("default_room") + .ok_or(aerr!("world meta does not have default_room"))? + .as_str() + .ok_or(aerr!("world meta default_room is not a string"))? + ); + let encyclopedia_name = + 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(); + Ok(WorldMeta{ + default_room, + encyclopedia_name + }) + } + pub fn load_room(&self, id: RoomId) -> Result<RoomTemplate> { let fname = id.name.splitn(2, '+').next().unwrap().to_string() + ".json"; - let path = self.directory.join(fname); + let path = self.directory.join("maps").join(fname); let text = fs::read_to_string(path)?; let json: Value = serde_json::from_str(&text)?; let template = RoomTemplate::from_json(&json)?; Ok(template) } + + pub fn load_encyclopedia(&self, name: &str) -> Result<Encyclopedia> { + let fname: String = name.to_string() + ".json"; + let encyclopedia = Encyclopedia::from_json( + serde_json::from_str( + &fs::read_to_string( + self.directory + .join("encyclopediae") + .join(&fname) + )? + )? + )?; + encyclopedia.validate()?; + Ok(encyclopedia) + } +} + +pub struct WorldMeta { + pub encyclopedia_name: String, + pub default_room: RoomId } + |
