From 4f9932074a8f0390d5cb6072b4e419c7ab08ffed Mon Sep 17 00:00:00 2001 From: troido Date: Thu, 2 Apr 2020 14:13:18 +0200 Subject: added flags component, and conditions for building --- src/components/flags.rs | 32 ++++++++++++++++++++++++++++++++ src/components/item.rs | 22 +++++++++++----------- src/components/mod.rs | 13 +++++-------- 3 files changed, 48 insertions(+), 19 deletions(-) create mode 100644 src/components/flags.rs (limited to 'src/components') diff --git a/src/components/flags.rs b/src/components/flags.rs new file mode 100644 index 0000000..d985bf2 --- /dev/null +++ b/src/components/flags.rs @@ -0,0 +1,32 @@ + +use std::collections::HashSet; +use specs::{ + Component, + VecStorage, +}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum Flag { + Blocking, + Floor, + Occupied, + Soil +} + +use Flag::*; +impl Flag { + pub fn from_str(s: &str) -> Option { + Some(match s { + "Blocking" => Blocking, + "Floor" => Floor, + "Occupied" => Occupied, + "Soil" => Soil, + _ => None? + }) + } +} + + +#[derive(Component, Debug, Clone, PartialEq, Eq)] +#[storage(VecStorage)] +pub struct Flags(pub HashSet); diff --git a/src/components/item.rs b/src/components/item.rs index 3b931bb..9793061 100644 --- a/src/components/item.rs +++ b/src/components/item.rs @@ -1,6 +1,10 @@ +use std::collections::HashSet; use specs::{Component, DenseVecStorage}; -use crate::{Template}; +use crate::{ + Template, + components::Flag +}; use super::equipment::Equippable; @@ -18,7 +22,7 @@ use serde_json::{json, Value}; #[derive(Debug, Clone, PartialEq)] pub enum ItemAction { Eat(i64), - Build(Template), + Build(Template, HashSet, HashSet), Equip(Equippable), None } @@ -26,21 +30,17 @@ pub enum ItemAction { use ItemAction::{Eat, Build, Equip, None}; impl ItemAction { - pub fn to_json(&self) -> Value { - match self { - Eat(health) => json!(["eat", health]), - Build(template) => json!(["build", template.to_json()]), - Equip(equippable) => json!(["equip", equippable.to_json()]), - None => json!(["none", null]) - } - } pub fn from_json(val: &Value) -> Option { let typ = val.get(0)?; let arg = val.get(1)?; Some(match typ.as_str()? { "eat" => Eat(arg.as_i64()?), - "build" => Build(Template::from_json(arg).ok()?), + "build" => Build( + Template::from_json(arg.get(0)?).ok()?, + arg.get(1)?.as_array()?.into_iter().map(|v| Flag::from_str(v.as_str()?)).collect::>>()?, + arg.get(2)?.as_array()?.into_iter().map(|v| Flag::from_str(v.as_str()?)).collect::>>()? + ), "none" => None, "equip" => Equip(Equippable::from_json(arg)?), _ => {return Option::None} diff --git a/src/components/mod.rs b/src/components/mod.rs index 071b5e0..efdf8f7 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -6,6 +6,7 @@ pub mod interactable; pub mod equipment; pub mod inventory; pub mod serialise; +pub mod flags; pub use item::Item; pub use messages::{ @@ -18,6 +19,10 @@ pub use interactable::Interactable; pub use equipment::Equipment; pub use inventory::Inventory; pub use serialise::Serialise; +pub use flags::{ + Flag, + Flags +}; use specs::{ DenseVecStorage, @@ -74,14 +79,6 @@ pub struct Movable { pub cooldown: i64 } -#[derive(Default, Component, Debug, Clone)] -#[storage(NullStorage)] -pub struct Blocking; - -#[derive(Default, Component, Debug, Clone)] -#[storage(NullStorage)] -pub struct Floor; - #[derive(Default, Component, Debug, Clone)] #[storage(NullStorage)] pub struct New; -- cgit