summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/assemblages.rs34
-rw-r--r--src/main.rs23
-rw-r--r--src/room.rs5
3 files changed, 43 insertions, 19 deletions
diff --git a/src/assemblages.rs b/src/assemblages.rs
index b43548c..729a65d 100644
--- a/src/assemblages.rs
+++ b/src/assemblages.rs
@@ -1,6 +1,7 @@
-
+use std::collections::HashMap;
use rand::Rng;
+use serde_json::Value;
use specs::{
Builder,
EntityBuilder
@@ -10,7 +11,7 @@ use super::components::{Visible, Blocking, Played};
macro_rules! assemblage {
($name:ident { $($arg:ident : $argt:ident ),* } ; $( $comp:expr ),* ) => {
- #[derive(Debug, Clone)]
+ #[derive(Debug, Clone, Default)]
pub struct $name {$(
pub $arg : $argt
)* }
@@ -24,15 +25,44 @@ macro_rules! assemblage {
)*
builder
}
+
+ fn init_from_json(&mut self, mut _args: Vec<Value>, _kwargs: HashMap<&str, Value>) {
+ $(
+ if _args.len() > 0 {
+ let val = _args.remove(0);
+ if let Some(actual_val) = unpack_json!($argt, val) {
+ self.$arg = actual_val;
+ }
+ }
+ )*
+ $(
+ if let Some(val) = _kwargs.get(stringify!($arg)) {
+ if let Some(actual_val) = unpack_json!($argt, val) {
+ self.$arg = actual_val;
+ }
+ }
+ )*
+ }
}
unsafe impl Send for $name {}
unsafe impl Sync for $name {}
}
}
+macro_rules! unpack_json {
+ (String, $val: ident) => {
+ if let Some(txt) = $val.as_str(){
+ Some(txt.to_string())
+ } else {
+ None
+ }
+ }
+}
+
pub trait Assemblage: Send + Sync {
fn build<'a>(&self, builder: EntityBuilder<'a>) -> EntityBuilder<'a>;
+ fn init_from_json(&mut self, args: Vec<Value>, kwargs: HashMap<&str, Value>);
}
diff --git a/src/main.rs b/src/main.rs
index 97f5bac..b1d30bb 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,17 +4,17 @@ use std::thread::sleep;
use std::time::Duration;
use std::path::Path;
-pub mod server;
-pub mod gameserver;
-pub mod room;
-pub mod util;
-pub mod controls;
-pub mod assemblages;
-pub mod components;
-pub mod resources;
-pub mod systems;
-pub mod worldmessages;
-pub mod pos;
+mod server;
+mod gameserver;
+mod room;
+mod util;
+mod controls;
+mod assemblages;
+mod components;
+mod resources;
+mod systems;
+mod worldmessages;
+mod pos;
use self::gameserver::GameServer;
use self::server::unixserver::UnixServer;
@@ -42,7 +42,6 @@ fn main() {
let mut room = gen_room(50, 40);
-
loop {
let actions = gameserver.update();
diff --git a/src/room.rs b/src/room.rs
index 8341eba..a6c696d 100644
--- a/src/room.rs
+++ b/src/room.rs
@@ -75,11 +75,6 @@ impl <'a, 'b>Room<'a, 'b> {
self.world.maintain();
}
- pub fn get_size(&self) -> (i32, i32) {
- let Size{width, height} = *self.world.fetch::<Size>();
- (width, height)
- }
-
pub fn set_input(&mut self, actions: Vec<Action>){
self.world.fetch_mut::<Input>().actions = actions;
}