From 940b1c762bb98a56dddc6e3e7f208867abb3ebe5 Mon Sep 17 00:00:00 2001 From: troido Date: Fri, 7 Feb 2020 19:10:13 +0100 Subject: added roomtemplate --- src/main.rs | 5 ++-- src/pos.rs | 13 ++++++--- src/resources.rs | 4 +-- src/room.rs | 2 +- src/roomtemplate.rs | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/systems/view.rs | 2 +- src/template.rs | 4 +-- src/worldmessages.rs | 4 +-- 8 files changed, 97 insertions(+), 13 deletions(-) create mode 100644 src/roomtemplate.rs diff --git a/src/main.rs b/src/main.rs index 1f1d217..410a9aa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,6 +22,7 @@ mod assemblage; mod componentparameter; mod encyclopedia; mod template; +mod roomtemplate; use self::gameserver::GameServer; use self::server::unixserver::UnixServer; @@ -31,7 +32,7 @@ use self::room::Room; use self::util::ToJson; use self::encyclopedia::Encyclopedia; use self::template::Template; -use self::pos::Pos; +pub use self::pos::Pos; @@ -64,7 +65,7 @@ fn main() { } } -fn gen_room<'a, 'b>(width: i32, height: i32) -> Room<'a, 'b> { +fn gen_room<'a, 'b>(width: i64, height: i64) -> Room<'a, 'b> { let assemblages = default_assemblages(); let mut room = Room::new(assemblages.clone(), (width, height)); let wall = &Template::empty("wall"); diff --git a/src/pos.rs b/src/pos.rs index 12c71bb..3003b64 100644 --- a/src/pos.rs +++ b/src/pos.rs @@ -7,14 +7,14 @@ use super::util::{clamp, ToJson}; #[derive(Debug, Hash, PartialEq, Eq, Clone, Copy)] pub struct Pos { - pub x: i32, - pub y: i32 + pub x: i64, + pub y: i64 } impl Pos { - pub fn new(x: i32, y: i32) -> Pos { + pub fn new(x: i64, y: i64) -> Pos { Pos {x, y} } @@ -24,6 +24,13 @@ impl Pos { y: clamp(self.y, smaller.y, larger.y) } } + + pub fn from_json(val: &Value) -> Option{ + Some(Pos { + x: val.get(0)?.as_i64()?, + y: val.get(1)?.as_i64()? + }) + } } diff --git a/src/resources.rs b/src/resources.rs index b1c193c..ced9897 100644 --- a/src/resources.rs +++ b/src/resources.rs @@ -21,8 +21,8 @@ pub struct Output { #[derive(Default)] pub struct Size { - pub width: i32, - pub height: i32 + pub width: i64, + pub height: i64 } #[derive(Default)] diff --git a/src/room.rs b/src/room.rs index a953a04..5daad29 100644 --- a/src/room.rs +++ b/src/room.rs @@ -41,7 +41,7 @@ pub struct Room<'a, 'b> { impl <'a, 'b>Room<'a, 'b> { - pub fn new(encyclopedia: Encyclopedia, size: (i32, i32)) -> Room<'a, 'b> { + pub fn new(encyclopedia: Encyclopedia, size: (i64, i64)) -> Room<'a, 'b> { let (width, height) = size; let mut world = World::new(); world.insert(Size{width, height}); diff --git a/src/roomtemplate.rs b/src/roomtemplate.rs new file mode 100644 index 0000000..2a71341 --- /dev/null +++ b/src/roomtemplate.rs @@ -0,0 +1,76 @@ + +use std::collections::HashMap; +use serde_json::Value; +use crate::Pos; +use crate::template::Template; + +struct RoomTemplate { + size: (i64, i64), + spawn: Pos, + field: Vec> +} + +impl RoomTemplate { + + pub fn from_json(jsonroom: &Value) -> Result{ + let size = ( + jsonroom.get("width").ok_or("no with")?.as_i64().ok_or("with not a number")?, + jsonroom.get("height").ok_or("no height")?.as_i64().ok_or("height not a number")? + ); + let spawn = Pos::from_json(jsonroom.get("spawn").ok_or("no spawn")?).ok_or("spawn not a pos")?; + + let mut mapping = HashMap::new(); + for (key, value) in jsonroom.get("mapping").ok_or("no mapping")?.as_object().ok_or("mapping not a json object")?.iter() { + let mut templates: Vec