summaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-04-02 14:13:18 +0200
committertroido <troido@protonmail.com>2020-04-02 14:13:18 +0200
commit4f9932074a8f0390d5cb6072b4e419c7ab08ffed (patch)
treed83da5cd8b35af25aa6e0b2c9105182920c49bd0 /src/components
parentec007f34c4cd984640a235660803b81a739742b3 (diff)
added flags component, and conditions for building
Diffstat (limited to 'src/components')
-rw-r--r--src/components/flags.rs32
-rw-r--r--src/components/item.rs22
-rw-r--r--src/components/mod.rs13
3 files changed, 48 insertions, 19 deletions
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<Flag> {
+ 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<Flag>);
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<Flag>, HashSet<Flag>),
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<Self> {
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::<Option<HashSet<Flag>>>()?,
+ arg.get(2)?.as_array()?.into_iter().map(|v| Flag::from_str(v.as_str()?)).collect::<Option<HashSet<Flag>>>()?
+ ),
"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,
@@ -76,14 +81,6 @@ pub struct Movable {
#[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;
#[derive(Default, Component, Debug, Clone)]