summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/maps/room.json43
-rw-r--r--src/main.rs62
-rw-r--r--src/worldloader.rs36
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)
+ }
+}