diff options
| -rw-r--r-- | content/maps/room.json | 43 | ||||
| -rw-r--r-- | src/main.rs | 62 | ||||
| -rw-r--r-- | src/worldloader.rs | 36 |
3 files changed, 86 insertions, 55 deletions
diff --git a/content/maps/room.json b/content/maps/room.json new file mode 100644 index 0000000..4025639 --- /dev/null +++ b/content/maps/room.json @@ -0,0 +1,43 @@ +{ + "width": 42, + "height": 22, + "spawn": [5, 15], + "field": [ + " XXXXXXXXXXXX~~~XXXXXXXXXXXXXXXXXXXXXX", + " ,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,X", + " ,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,X", + " ,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,X", + " bbbb..,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,X", + " ,,.,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,X", + " ,,,.,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,X", + " ,,,,.,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,X", + "X,,,,,.,,,,,,,,,,,~~~~,,,,,,T,,,,,,,,,,,,X", + "X,,,,,.,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,X", + "X,,,,,.,,,,,,,,,,,,~~~,,,,,T,,,,######,,,X", + "X,,,,,.,,,,,,,,,,,,bbb,,,,,,,,,,#++++#,,,X", + "X,,,,,.............bbb...........++++#,,,X", + "X,**,,.,,,,,,,,,,,,bbb,,,,,,,,,,#++++#,,,X", + "X,*,*,.,,,,,,,,,,,,~~~,,,T,,,T,,#++++#,,,X", + "X,,*,,.,,,,,,,,,,,,~~~,,,,,,,,,,######,,,X", + "X,**,,.,,,,,,,,,,,~~~~,,,,,,,,,,f,,,,f,,,X", + "X,,*,,.,,,,,,,,,,,~~~''''''''''''''''f'''X", + "X*,,,,.,,,,,,,,,,,~~~'''''''''''f''''f'''X", + "X,,,,,.,,,,,,,,,,,~~~'''''''''''ffffff'''X", + "X,,,,,.,,,,,,,,,,,~~~''''''''''''''''''''X", + "XXXXX,.,XXXXXXXXXX~~~XXXXXXXXXXXXXXXXXXXXX" + ], + "mapping": { + "#": "wall", + ",": "grass", + ".": "ground", + "~": "water", + "b": "bridge", + "+": "floor", + "'": "greengrass", + "T": ["grass", "tree"], + "f": ["grass", "fence"], + "X": "rock", + "*": ["grass", "pebble"], + " ": [] + } +} diff --git a/src/main.rs b/src/main.rs index 6b92077..2e4fffb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,8 +3,8 @@ use std::collections::HashMap; use std::thread::sleep; use std::time::Duration; use std::path::Path; - -use serde_json::json; +use std::path::PathBuf; +use std::str::FromStr; mod server; mod gameserver; @@ -29,6 +29,7 @@ mod defaultencyclopedia; mod playerstate; mod roomid; mod persistence; +mod worldloader; pub use self::pos::Pos; pub use self::playerid::PlayerId; @@ -40,11 +41,11 @@ use self::server::tcpserver::TcpServer; use self::server::Server; use self::room::Room; use self::util::ToJson; -use self::roomtemplate::RoomTemplate; use self::defaultencyclopedia::default_encyclopedia; use self::persistence::{FileStorage, PersistentStorage}; use crate::controls::Action; use crate::playerstate::PlayerState; +use crate::worldloader::WorldLoader; @@ -62,7 +63,9 @@ fn main() { let mut gameserver = GameServer::new(servers); - let mut room = gen_room(); + let loader = WorldLoader::new(PathBuf::from_str(&(env!("CARGO_MANIFEST_DIR").to_owned() + "/content/maps/")).unwrap(), RoomId::from_str("room")); + let mut room = Room::new(RoomId::from_str("room"), default_encyclopedia()); + room.load_from_template(&loader.load_room(room.id.clone()).unwrap()); let storage = FileStorage::new(FileStorage::savedir().expect("couldn't find any save directory")); if let Ok(state) = storage.load_room(RoomId::from_str("room")) { @@ -122,55 +125,4 @@ fn main() { } } -fn gen_room<'a, 'b>() -> Room<'a, 'b> { - let assemblages = default_encyclopedia(); - let mut room = Room::new(RoomId::from_str("room"), assemblages); - - let roomtemplate = RoomTemplate::from_json(&json!({ - "width": 42, - "height": 22, - "spawn": [5, 15], - "field": [ - " XXXXXXXXXXXX~~~XXXXXXXXXXXXXXXXXXXXXX", - " ,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,X", - " ,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,X", - " ,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,X", - " bbbb..,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,X", - " ,,.,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,X", - " ,,,.,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,X", - " ,,,,.,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,X", - "X,,,,,.,,,,,,,,,,,~~~~,,,,,,T,,,,,,,,,,,,X", - "X,,,,,.,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,X", - "X,,,,,.,,,,,,,,,,,,~~~,,,,,T,,,,######,,,X", - "X,,,,,.,,,,,,,,,,,,bbb,,,,,,,,,,#++++#,,,X", - "X,,,,,.............bbb...........++++#,,,X", - "X,**,,.,,,,,,,,,,,,bbb,,,,,,,,,,#++++#,,,X", - "X,*,*,.,,,,,,,,,,,,~~~,,,T,,,T,,#++++#,,,X", - "X,,*,,.,,,,,,,,,,,,~~~,,,,,,,,,,######,,,X", - "X,**,,.,,,,,,,,,,,~~~~,,,,,,,,,,f,,,,f,,,X", - "X,,*,,.,,,,,,,,,,,~~~''''''''''''''''f'''X", - "X*,,,,.,,,,,,,,,,,~~~'''''''''''f''''f'''X", - "X,,,,,.,,,,,,,,,,,~~~'''''''''''ffffff'''X", - "X,,,,,.,,,,,,,,,,,~~~''''''''''''''''''''X", - "XXXXX,.,XXXXXXXXXX~~~XXXXXXXXXXXXXXXXXXXXX" - ], - "mapping": { - "#": "wall", - ",": "grass", - ".": "ground", - "~": "water", - "b": "bridge", - "+": "floor", - "'": "greengrass", - "T": ["grass", "tree"], - "f": ["grass", "fence"], - "X": "rock", - "*": ["grass", "pebble"], - " ": [] - } - })).unwrap(); - room.load_from_template(&roomtemplate); - room -} - diff --git a/src/worldloader.rs b/src/worldloader.rs new file mode 100644 index 0000000..6660f9d --- /dev/null +++ b/src/worldloader.rs @@ -0,0 +1,36 @@ + +use std::path::PathBuf; +use std::fs; +use serde_json; +use serde_json::Value; +use crate::{ + RoomId, + roomtemplate::RoomTemplate, + util::Result +}; + + +pub struct WorldLoader { + pub directory: PathBuf, + pub default_room: RoomId +} + +impl WorldLoader { + pub fn new(path: PathBuf, default_room: RoomId) -> Self { + Self { + directory: path, + default_room + } + } + + pub fn load_room(&self, id: RoomId) -> Result<RoomTemplate> { + let mut path = self.directory.clone(); + let fname = id.to_string() + ".json"; + path.push(fname); + println!("PATH: {:?}", path); + let text = fs::read_to_string(path)?; + let json: Value = serde_json::from_str(&text)?; + let template = RoomTemplate::from_json(&json)?; + Ok(template) + } +} |
