summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/components.rs16
-rw-r--r--src/componentwrapper.rs7
-rw-r--r--src/controls.rs8
-rw-r--r--src/main.rs25
-rw-r--r--src/parameter.rs16
-rw-r--r--src/room.rs8
-rw-r--r--src/systems/controlinput.rs2
-rw-r--r--src/systems/mod.rs2
-rw-r--r--src/systems/take.rs65
-rw-r--r--src/template.rs2
10 files changed, 128 insertions, 23 deletions
diff --git a/src/components.rs b/src/components.rs
index 277dd01..8be8364 100644
--- a/src/components.rs
+++ b/src/components.rs
@@ -9,6 +9,7 @@ use specs::{
use super::controls::Control;
use super::pos::Pos;
+use crate::template::Template;
#[derive(Debug, Clone)]
@@ -65,3 +66,18 @@ impl Player {
}
}
+#[derive(Debug, Clone, Default)]
+pub struct Inventory {
+ pub items: Vec<Item>,
+ pub capacity: u64
+}
+impl Component for Inventory {
+ type Storage = FlaggedStorage<Self, HashMapStorage<Self>>;
+}
+
+
+#[derive(Component, Debug, Clone)]
+pub struct Item {
+ pub ent: Template
+}
+
diff --git a/src/componentwrapper.rs b/src/componentwrapper.rs
index 43c8353..c60c23f 100644
--- a/src/componentwrapper.rs
+++ b/src/componentwrapper.rs
@@ -2,7 +2,7 @@
use std::collections::HashMap;
use specs::{Builder, world::LazyBuilder};
-use crate::components::{Visible, Blocking, Player, Floor};
+use crate::components::{Visible, Blocking, Player, Floor, Item, Inventory};
use crate::parameter::{Parameter, ParameterType};
@@ -91,7 +91,10 @@ components!(
};
Blocking () {Blocking};
Floor () {Floor};
- Player (name: String) {Player::new(name.to_string())}
+ Player (name: String) {Player::new(name.to_string())};
+ Item (ent: Template) {Item{ent}};
+ Inventory () {Inventory::default()}
+
);
diff --git a/src/controls.rs b/src/controls.rs
index 1f96180..d9432a5 100644
--- a/src/controls.rs
+++ b/src/controls.rs
@@ -42,7 +42,8 @@ impl Direction {
#[derive(Debug, Clone)]
pub enum Control {
Move(Direction),
- Take(u64)
+ Take(u64),
+ Drop(u64)
}
@@ -54,10 +55,11 @@ impl Control {
Some(dir) => Some(Control::Move(dir)),
None => None
},
- "take" => match val[1].as_u64() {
+ "take" => Some(Control::Take(0)), /*match val[1].as_u64() {
Some(rank) => Some(Control::Take(rank)),
_ => None
- }
+ }*/
+ "drop" => Some(Control::Drop(0)),
_ => None
}
} else {None}
diff --git a/src/main.rs b/src/main.rs
index d2cfd13..0b055c9 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -90,12 +90,12 @@ fn gen_room<'a, 'b>() -> Room<'a, 'b> {
"X,,,,,,,,,,,,,,,,,,~~~,,,,,T,,,,######,,,X",
"X,,,,,,,,,,,,,,,,,,bbb,,,,,,,,,,#++++#,,,X",
"X,,,,,.............bbb...........++++#,,,X",
- "X,,,,,.,,,,,,,,,,,,bbb,,,,,,,,,,#++++#,,,X",
- "X,,,,,.,,,,,,,,,,,,~~~,,,T,,,T,,#++++#,,,X",
- "X,,,,,.,,,, ,,,,,~~~,,,,,,,,,,######,,,X",
- "X,,,,,.,,,, ,,,,~~~~,,,,,,,,,,f,,,,f,,,X",
- "X,,,,,.,,,, ,,,,~~~''''''''''''''''f'''X",
- "X,,,,,.,,,,,,,,,,,~~~'''''''''''f''''f'''X",
+ "X,**,,.,,,,,,,,,,,,bbb,,,,,,,,,,#++++#,,,X",
+ "X,*,*,.,,,,,,,,,,,,~~~,,,T,,,T,,#++++#,,,X",
+ "X,,*,,.,,,, ,,,,,~~~,,,,,,,,,,######,,,X",
+ "X,**,,.,,,, ,,,,~~~~,,,,,,,,,,f,,,,f,,,X",
+ "X,,*,,.,,,, ,,,,~~~''''''''''''''''f'''X",
+ "X*,,,,.,,,,,,,,,,,~~~'''''''''''f''''f'''X",
"X,,,,,.,,,,,,,,,,,~~~'''''''''''ffffff'''X",
"X,,,,,.,,,,,,,,,,,~~~''''''''''''''''''''X",
"XXXXX,.,XXXXXXXXXX~~~XXXXXXXXXXXXXXXXXXXXX"
@@ -111,6 +111,7 @@ fn gen_room<'a, 'b>() -> Room<'a, 'b> {
"T": ["grass", "tree"],
"f": ["grass", "fence"],
"X": "rock",
+ "*": ["grass", "pebble"],
" ": []
}
})).unwrap();
@@ -221,6 +222,15 @@ fn default_assemblages() -> Encyclopedia {
}]
]
},
+ "pebble": {
+ "components": [
+ ["Visible", {
+ "sprite": ["string", "pebble"],
+ "height": ["float", 0.4]
+ }],
+ ["Item", {"ent": ["template", "pebble"]}]
+ ]
+ },
"player": {
"arguments": [["name", "string", null]],
"components": [
@@ -230,7 +240,8 @@ fn default_assemblages() -> Encyclopedia {
}],
["Player", {
"name": ["arg", "name"]
- }]
+ }],
+ ["Inventory", {}]
]
}
})).unwrap()
diff --git a/src/parameter.rs b/src/parameter.rs
index 33eee25..56f1cbf 100644
--- a/src/parameter.rs
+++ b/src/parameter.rs
@@ -1,12 +1,14 @@
use serde_json::Value;
+use crate::template::Template;
#[derive(Debug, PartialEq, Clone)]
pub enum Parameter {
String(String),
Int(i64),
// Pos(Pos),
- Float(f64)
+ Float(f64),
+ Template(Template)
}
impl Parameter {
@@ -20,7 +22,8 @@ impl Parameter {
match typ {
ParameterType::String => Some(Self::String(val.as_str()?.to_string())),
ParameterType::Int => Some(Self::Int(val.as_i64()?)),
- ParameterType::Float => Some(Self::Float(val.as_f64()?))
+ ParameterType::Float => Some(Self::Float(val.as_f64()?)),
+ ParameterType::Template => Some(Self::Template(Template::from_json(val)?))
}
}
@@ -28,7 +31,8 @@ impl Parameter {
match self {
Self::String(_) => ParameterType::String,
Self::Int(_) => ParameterType::Int,
- Self::Float(_) => ParameterType::Float
+ Self::Float(_) => ParameterType::Float,
+ Self::Template(_) => ParameterType::Template
}
}
@@ -40,6 +44,8 @@ impl Parameter {
ParameterType::Int
} else if val.is_f64() {
ParameterType::Float
+ } else if val.is_object(){
+ ParameterType::Template
} else {
println!("{:?}", val);
return None
@@ -52,7 +58,8 @@ impl Parameter {
pub enum ParameterType {
String,
Int,
- Float
+ Float,
+ Template
}
impl ParameterType {
@@ -62,6 +69,7 @@ impl ParameterType {
"string" => Some(Self::String),
"int" => Some(Self::Int),
"float" => Some(Self::Float),
+ "template" => Some(Self::Template),
_ => None
}
}
diff --git a/src/room.rs b/src/room.rs
index 9d3f1ed..6af2c95 100644
--- a/src/room.rs
+++ b/src/room.rs
@@ -24,7 +24,8 @@ use super::systems::{
controlinput::ControlInput,
view::View,
remove::Remove,
- create::Create
+ create::Create,
+ take::Take
};
use crate::encyclopedia::Encyclopedia;
use crate::roomtemplate::RoomTemplate;
@@ -46,9 +47,10 @@ impl <'a, 'b>Room<'a, 'b> {
});
let mut dispatcher = DispatcherBuilder::new()
+ .with(RegisterNew::default(), "registernew", &[])
.with(ControlInput, "controlinput", &[])
- .with(RegisterNew::default(), "makefloor", &[])
- .with(Move, "move", &["makefloor", "controlinput"])
+ .with(Take, "take", &["controlinput"])
+ .with(Move, "move", &["registernew", "controlinput"])
.with(View::default(), "view", &["move"])
.with(Create, "create", &["view", "controlinput"])
.with(Remove, "remove", &["view", "move"])
diff --git a/src/systems/controlinput.rs b/src/systems/controlinput.rs
index 0771b1e..608de06 100644
--- a/src/systems/controlinput.rs
+++ b/src/systems/controlinput.rs
@@ -18,8 +18,6 @@ use crate::hashmap;
use crate::template::Template;
use crate::parameter::Parameter;
-// use crate::assemblages::Player;
-
pub struct ControlInput;
impl <'a> System<'a> for ControlInput {
diff --git a/src/systems/mod.rs b/src/systems/mod.rs
index 904e833..6989e95 100644
--- a/src/systems/mod.rs
+++ b/src/systems/mod.rs
@@ -5,5 +5,5 @@ pub mod moving;
pub mod view;
pub mod remove;
pub mod create;
-
+pub mod take;
diff --git a/src/systems/take.rs b/src/systems/take.rs
new file mode 100644
index 0000000..95bec1b
--- /dev/null
+++ b/src/systems/take.rs
@@ -0,0 +1,65 @@
+
+use std::collections::HashSet;
+
+use specs::{
+ Entities,
+ ReadStorage,
+ WriteStorage,
+ System,
+ Join,
+ Write
+};
+
+use super::super::pos::Pos;
+
+use super::super::components::{
+ Controller,
+ Position,
+ Removed,
+ Inventory,
+ Item
+};
+
+use super::super::controls::{Control};
+use super::super::resources::{Ground, NewEntities};
+
+
+
+pub struct Take;
+impl <'a> System<'a> for Take {
+ type SystemData = (
+ Entities<'a>,
+ ReadStorage<'a, Controller>,
+ WriteStorage<'a, Position>,
+ Write<'a, Ground>,
+ WriteStorage<'a, Removed>,
+ ReadStorage<'a, Item>,
+ WriteStorage<'a, Inventory>,
+ Write<'a, NewEntities>
+ );
+
+ fn run(&mut self, (entities, controllers, positions, ground, mut removed, items, mut inventories, mut new): Self::SystemData) {
+ for (ent, controller, position, inventory) in (&entities, &controllers, &positions, &mut inventories).join(){
+ match &controller.0 {
+ Control::Take(_rank) => {
+ let mut ents = ground.cells.get(&position.pos).unwrap_or(&HashSet::new()).clone();
+ ents.remove(&ent);
+ for ent in ents {
+ if let Some(item) = items.get(ent) {
+ inventory.items.push(item.clone());
+ if let Err(msg) = removed.insert(ent, Removed) {
+ println!("{:?}", msg);
+ }
+ }
+ }
+ }
+ Control::Drop(_rank) => {
+ if let Some(item) = inventory.items.pop() {
+ new.templates.push((position.pos, item.ent));
+ }
+ }
+ _ => {}
+ }
+ }
+ }
+}
diff --git a/src/template.rs b/src/template.rs
index 4de02f6..0f846fd 100644
--- a/src/template.rs
+++ b/src/template.rs
@@ -4,7 +4,7 @@ use std::collections::HashMap;
use serde_json::{json, Value};
use crate::parameter::Parameter;
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, PartialEq)]
pub struct Template {
pub name: String,
pub args: Vec<Parameter>,