diff options
| author | troido <troido@protonmail.com> | 2020-02-03 23:03:11 +0100 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-02-03 23:03:11 +0100 |
| commit | 33576fe7a5f241dbd884315c3552ad8186562e74 (patch) | |
| tree | dd893817d2d0aae5a19a2f4f6778a59ba44dc123 | |
| parent | 26ab89d8125f4cb10d43dfeb67ac87ffb80656cb (diff) | |
can initialise Assemblages from json lists and dicts
| -rw-r--r-- | src/assemblages.rs | 34 | ||||
| -rw-r--r-- | src/main.rs | 23 | ||||
| -rw-r--r-- | src/room.rs | 5 |
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; } |
