summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-04-20 13:00:34 +0200
committertroido <troido@protonmail.com>2020-04-20 13:00:34 +0200
commit9ffe36a5375a25601dcc528aa603fb1e679f9847 (patch)
treef59c1d315e81b84a2f521d3b4acd2fb52c8936ea
parent047b23895df301a622cfd3330787ef900c9777e9 (diff)
stop hardcoding default room and encyclopedia
-rw-r--r--content/world.json4
-rw-r--r--src/main.rs23
-rw-r--r--src/roomtemplate.rs1
-rw-r--r--src/worldloader.rs51
-rw-r--r--todo.md3
5 files changed, 60 insertions, 22 deletions
diff --git a/content/world.json b/content/world.json
new file mode 100644
index 0000000..e544bb3
--- /dev/null
+++ b/content/world.json
@@ -0,0 +1,4 @@
+{
+ "default_room": "tutorial",
+ "encyclopedia": "default_encyclopedia"
+}
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
}
+
diff --git a/todo.md b/todo.md
index a27c30c..cc39662 100644
--- a/todo.md
+++ b/todo.md
@@ -6,9 +6,6 @@
- improved tutorial
- timer resource?
- improve error handling
-- update drawing when migration fails
- data encapsulation
- secure login
- bot connection
-- interactions that take more than one try
-